Title: [132398] trunk/Source/WebCore
Revision
132398
Author
[email protected]
Date
2012-10-24 14:07:02 -0700 (Wed, 24 Oct 2012)

Log Message

call to setNeedsLayout during RenderVideo::paintReplaced
https://bugs.webkit.org/show_bug.cgi?id=100265

Reviewed by Eric Carlson.

Removed unnecessary call and added new defensive guards to catch erroneous setNeedsLayout() calls
during paints earlier (so the offending calls are in the emitted stacktrace).

No new tests - new defensive checks are triggered by existing tests.

* page/FrameView.cpp:
(WebCore::FrameView::paintContents): forbid setNeedsLayout() during painting
* rendering/RenderObject.cpp:
(WebCore):
(WebCore::RenderObject::SetLayoutNeededForbiddenScope::SetLayoutNeededForbiddenScope):
(WebCore::RenderObject::SetLayoutNeededForbiddenScope::~SetLayoutNeededForbiddenScope):
* rendering/RenderObject.h:
(RenderObject):
(SetLayoutNeededForbiddenScope): added helper class for forbidding setNeedsLayout() in a scope.
* rendering/RenderVideo.cpp:
(WebCore::RenderVideo::paintReplaced): drop the offending & unnecessary call to updatePlayer().

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (132397 => 132398)


--- trunk/Source/WebCore/ChangeLog	2012-10-24 21:02:09 UTC (rev 132397)
+++ trunk/Source/WebCore/ChangeLog	2012-10-24 21:07:02 UTC (rev 132398)
@@ -1,3 +1,27 @@
+2012-10-24  Ami Fischman  <[email protected]>
+
+        call to setNeedsLayout during RenderVideo::paintReplaced
+        https://bugs.webkit.org/show_bug.cgi?id=100265
+
+        Reviewed by Eric Carlson.
+
+        Removed unnecessary call and added new defensive guards to catch erroneous setNeedsLayout() calls
+        during paints earlier (so the offending calls are in the emitted stacktrace).
+
+        No new tests - new defensive checks are triggered by existing tests.
+
+        * page/FrameView.cpp:
+        (WebCore::FrameView::paintContents): forbid setNeedsLayout() during painting
+        * rendering/RenderObject.cpp:
+        (WebCore):
+        (WebCore::RenderObject::SetLayoutNeededForbiddenScope::SetLayoutNeededForbiddenScope):
+        (WebCore::RenderObject::SetLayoutNeededForbiddenScope::~SetLayoutNeededForbiddenScope):
+        * rendering/RenderObject.h:
+        (RenderObject):
+        (SetLayoutNeededForbiddenScope): added helper class for forbidding setNeedsLayout() in a scope.
+        * rendering/RenderVideo.cpp:
+        (WebCore::RenderVideo::paintReplaced): drop the offending & unnecessary call to updatePlayer().
+
 2012-10-24  Adam Barth  <[email protected]>
 
         [V8] ActiveDOMObjectEpilogueVisitor is unnecessary and can be deleted

Modified: trunk/Source/WebCore/page/FrameView.cpp (132397 => 132398)


--- trunk/Source/WebCore/page/FrameView.cpp	2012-10-24 21:02:09 UTC (rev 132397)
+++ trunk/Source/WebCore/page/FrameView.cpp	2012-10-24 21:07:02 UTC (rev 132398)
@@ -3242,6 +3242,10 @@
     RenderObject* eltRenderer = m_nodeToDraw ? m_nodeToDraw->renderer() : 0;
     RenderLayer* rootLayer = root->layer();
 
+#ifndef NDEBUG
+    RenderObject::SetLayoutNeededForbiddenScope forbidSetNeedsLayout(rootLayer->renderer());
+#endif
+
     rootLayer->paint(p, rect, m_paintBehavior, eltRenderer);
 
     if (rootLayer->containsDirtyOverlayScrollbars())

Modified: trunk/Source/WebCore/rendering/RenderObject.cpp (132397 => 132398)


--- trunk/Source/WebCore/rendering/RenderObject.cpp	2012-10-24 21:02:09 UTC (rev 132397)
+++ trunk/Source/WebCore/rendering/RenderObject.cpp	2012-10-24 21:07:02 UTC (rev 132398)
@@ -91,6 +91,18 @@
 
 #ifndef NDEBUG
 static void* baseOfRenderObjectBeingDeleted;
+
+RenderObject::SetLayoutNeededForbiddenScope::SetLayoutNeededForbiddenScope(RenderObject* renderObject)
+    : m_renderObject(renderObject)
+    , m_preexistingForbidden(m_renderObject->isSetNeedsLayoutForbidden())
+{
+    m_renderObject->setNeedsLayoutIsForbidden(true);
+}
+
+RenderObject::SetLayoutNeededForbiddenScope::~SetLayoutNeededForbiddenScope()
+{
+    m_renderObject->setNeedsLayoutIsForbidden(m_preexistingForbidden);
+}
 #endif
 
 struct SameSizeAsRenderObject {

Modified: trunk/Source/WebCore/rendering/RenderObject.h (132397 => 132398)


--- trunk/Source/WebCore/rendering/RenderObject.h	2012-10-24 21:02:09 UTC (rev 132397)
+++ trunk/Source/WebCore/rendering/RenderObject.h	2012-10-24 21:07:02 UTC (rev 132398)
@@ -248,6 +248,16 @@
     bool hasAXObject() const { return m_hasAXObject; }
     bool isSetNeedsLayoutForbidden() const { return m_setNeedsLayoutForbidden; }
     void setNeedsLayoutIsForbidden(bool flag) { m_setNeedsLayoutForbidden = flag; }
+
+    // Helper class forbidding calls to setNeedsLayout() during its lifetime.
+    class SetLayoutNeededForbiddenScope {
+    public:
+        explicit SetLayoutNeededForbiddenScope(RenderObject*);
+        ~SetLayoutNeededForbiddenScope();
+    private:
+        RenderObject* m_renderObject;
+        bool m_preexistingForbidden;
+    };
 #endif
 
     // Obtains the nearest enclosing block (including this block) that contributes a first-line style to our inline

Modified: trunk/Source/WebCore/rendering/RenderVideo.cpp (132397 => 132398)


--- trunk/Source/WebCore/rendering/RenderVideo.cpp	2012-10-24 21:02:09 UTC (rev 132397)
+++ trunk/Source/WebCore/rendering/RenderVideo.cpp	2012-10-24 21:07:02 UTC (rev 132398)
@@ -195,13 +195,10 @@
     if (Frame* frame = this->frame())
         page = frame->page();
 
-    if (!displayingPoster) {
-        if (!mediaPlayer) {
-            if (page && paintInfo.phase == PaintPhaseForeground)
-                page->addRelevantUnpaintedObject(this, visualOverflowRect());
-            return;
-        }
-        updatePlayer();
+    if (!displayingPoster && !mediaPlayer) {
+        if (page && paintInfo.phase == PaintPhaseForeground)
+            page->addRelevantUnpaintedObject(this, visualOverflowRect());
+        return;
     }
 
     LayoutRect rect = videoBox();
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to