Title: [156904] trunk/Source/WebCore
Revision
156904
Author
[email protected]
Date
2013-10-04 12:22:38 -0700 (Fri, 04 Oct 2013)

Log Message

Tighten markContainingBlocksForLayout
https://bugs.webkit.org/show_bug.cgi?id=122326

Reviewed by Anders Carlsson.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (156903 => 156904)


--- trunk/Source/WebCore/ChangeLog	2013-10-04 18:51:32 UTC (rev 156903)
+++ trunk/Source/WebCore/ChangeLog	2013-10-04 19:22:38 UTC (rev 156904)
@@ -1,3 +1,10 @@
+2013-10-04  Antti Koivisto  <[email protected]>
+
+        Tighten markContainingBlocksForLayout
+        https://bugs.webkit.org/show_bug.cgi?id=122326
+
+        Reviewed by Anders Carlsson.
+
 2013-10-04  Andreas Kling  <[email protected]>
 
         Node: removedFrom() and insertedInto() should use references.

Modified: trunk/Source/WebCore/page/FrameView.cpp (156903 => 156904)


--- trunk/Source/WebCore/page/FrameView.cpp	2013-10-04 18:51:32 UTC (rev 156903)
+++ trunk/Source/WebCore/page/FrameView.cpp	2013-10-04 19:22:38 UTC (rev 156904)
@@ -2402,7 +2402,7 @@
     return false;
 }
 
-void FrameView::scheduleRelayoutOfSubtree(RenderObject& newRelayoutRoot)
+void FrameView::scheduleRelayoutOfSubtree(RenderElement& newRelayoutRoot)
 {
     ASSERT(renderView());
     RenderView& renderView = *this->renderView();
@@ -3385,7 +3385,7 @@
 
     parentView->layout(allowSubtree);
 
-    RenderObject* root = m_layoutRoot ? m_layoutRoot : frame().document()->renderView();
+    RenderElement* root = m_layoutRoot ? m_layoutRoot : frame().document()->renderView();
     ASSERT_UNUSED(root, !root->needsLayout());
 
     return true;

Modified: trunk/Source/WebCore/page/FrameView.h (156903 => 156904)


--- trunk/Source/WebCore/page/FrameView.h	2013-10-04 18:51:32 UTC (rev 156903)
+++ trunk/Source/WebCore/page/FrameView.h	2013-10-04 19:22:38 UTC (rev 156904)
@@ -106,7 +106,7 @@
     bool didFirstLayout() const;
     void layoutTimerFired(Timer<FrameView>*);
     void scheduleRelayout();
-    void scheduleRelayoutOfSubtree(RenderObject&);
+    void scheduleRelayoutOfSubtree(RenderElement&);
     void unscheduleRelayout();
     bool layoutPending() const;
     bool isInLayout() const { return m_inLayout; }
@@ -567,7 +567,7 @@
 
     Timer<FrameView> m_layoutTimer;
     bool m_delayedLayout;
-    RenderObject* m_layoutRoot;
+    RenderElement* m_layoutRoot;
     
     bool m_layoutSchedulingEnabled;
     bool m_inLayout;

Modified: trunk/Source/WebCore/rendering/RenderObject.cpp (156903 => 156904)


--- trunk/Source/WebCore/rendering/RenderObject.cpp	2013-10-04 18:51:32 UTC (rev 156903)
+++ trunk/Source/WebCore/rendering/RenderObject.cpp	2013-10-04 19:22:38 UTC (rev 156904)
@@ -595,9 +595,12 @@
     return 0;
 }
 
-static inline bool objectIsRelayoutBoundary(const RenderObject* object)
+static inline bool objectIsRelayoutBoundary(const RenderElement* object)
 {
     // FIXME: In future it may be possible to broaden these conditions in order to improve performance.
+    if (object->isRenderView())
+        return true;
+
     if (object->isTextControl())
         return true;
 
@@ -634,62 +637,72 @@
 #endif
 }
 
-void RenderObject::markContainingBlocksForLayout(bool scheduleRelayout, RenderObject* newRoot)
+static void scheduleRelayoutForSubtree(RenderElement& renderer)
 {
+    if (!renderer.isRenderView()) {
+        if (!renderer.isRooted())
+            return;
+        renderer.view().frameView().scheduleRelayoutOfSubtree(renderer);
+        return;
+    }
+    toRenderView(renderer).frameView().scheduleRelayout();
+}
+
+void RenderObject::markContainingBlocksForLayout(bool scheduleRelayout, RenderElement* newRoot)
+{
     ASSERT(!scheduleRelayout || !newRoot);
     ASSERT(!isSetNeedsLayoutForbidden());
 
-    RenderElement* object = container();
-    RenderObject* last = this;
+    RenderElement* ancestor = container();
 
     bool simplifiedNormalFlowLayout = needsSimplifiedNormalFlowLayout() && !selfNeedsLayout() && !normalChildNeedsLayout();
+    bool hasOutOfFlowPosition = !isText() && style()->hasOutOfFlowPosition();
 
-    while (object) {
+    while (ancestor) {
 #ifndef NDEBUG
         // FIXME: Remove this once we remove the special cases for counters, quotes and mathml
         // calling setNeedsLayout during preferred width computation.
-        SetLayoutNeededForbiddenScope layoutForbiddenScope(object, isSetNeedsLayoutForbidden());
+        SetLayoutNeededForbiddenScope layoutForbiddenScope(ancestor, isSetNeedsLayoutForbidden());
 #endif
         // Don't mark the outermost object of an unrooted subtree. That object will be
         // marked when the subtree is added to the document.
-        RenderElement* container = object->container();
-        if (!container && !object->isRenderView())
+        RenderElement* container = ancestor->container();
+        if (!container && !ancestor->isRenderView())
             return;
-        if (!last->isText() && last->style()->hasOutOfFlowPosition()) {
-            bool willSkipRelativelyPositionedInlines = !object->isRenderBlock() || object->isAnonymousBlock();
+        if (hasOutOfFlowPosition) {
+            bool willSkipRelativelyPositionedInlines = !ancestor->isRenderBlock() || ancestor->isAnonymousBlock();
             // Skip relatively positioned inlines and anonymous blocks to get to the enclosing RenderBlock.
-            while (object && (!object->isRenderBlock() || object->isAnonymousBlock()))
-                object = object->container();
-            if (!object || object->posChildNeedsLayout())
+            while (ancestor && (!ancestor->isRenderBlock() || ancestor->isAnonymousBlock()))
+                ancestor = ancestor->container();
+            if (!ancestor || ancestor->posChildNeedsLayout())
                 return;
             if (willSkipRelativelyPositionedInlines)
-                container = object->container();
-            object->setPosChildNeedsLayoutBit(true);
+                container = ancestor->container();
+            ancestor->setPosChildNeedsLayoutBit(true);
             simplifiedNormalFlowLayout = true;
-            ASSERT(!object->isSetNeedsLayoutForbidden());
         } else if (simplifiedNormalFlowLayout) {
-            if (object->needsSimplifiedNormalFlowLayout())
+            if (ancestor->needsSimplifiedNormalFlowLayout())
                 return;
-            object->setNeedsSimplifiedNormalFlowLayoutBit(true);
-            ASSERT(!object->isSetNeedsLayoutForbidden());
+            ancestor->setNeedsSimplifiedNormalFlowLayoutBit(true);
         } else {
-            if (object->normalChildNeedsLayout())
+            if (ancestor->normalChildNeedsLayout())
                 return;
-            object->setNormalChildNeedsLayoutBit(true);
-            ASSERT(!object->isSetNeedsLayoutForbidden());
+            ancestor->setNormalChildNeedsLayoutBit(true);
         }
+        ASSERT(!ancestor->isSetNeedsLayoutForbidden());
 
-        if (object == newRoot)
+        if (ancestor == newRoot)
             return;
 
-        last = object;
-        if (scheduleRelayout && objectIsRelayoutBoundary(last))
+        if (scheduleRelayout && objectIsRelayoutBoundary(ancestor))
             break;
-        object = container;
+
+        hasOutOfFlowPosition = ancestor->style()->hasOutOfFlowPosition();
+        ancestor = container;
     }
 
-    if (scheduleRelayout)
-        last->scheduleRelayout();
+    if (scheduleRelayout && ancestor)
+        scheduleRelayoutForSubtree(*ancestor);
 }
 
 #ifndef NDEBUG
@@ -2204,16 +2217,6 @@
     return false;
 }
 
-void RenderObject::scheduleRelayout()
-{
-    if (isRenderView())
-        toRenderView(*this).frameView().scheduleRelayout();
-    else {
-        if (isRooted())
-            view().frameView().scheduleRelayoutOfSubtree(*this);
-    }
-}
-
 void RenderObject::layout()
 {
     StackStats::LayoutCheckPoint layoutCheckPoint;

Modified: trunk/Source/WebCore/rendering/RenderObject.h (156903 => 156904)


--- trunk/Source/WebCore/rendering/RenderObject.h	2013-10-04 18:51:32 UTC (rev 156903)
+++ trunk/Source/WebCore/rendering/RenderObject.h	2013-10-04 19:22:38 UTC (rev 156904)
@@ -616,7 +616,7 @@
 
     RenderBoxModelObject* offsetParent() const;
 
-    void markContainingBlocksForLayout(bool scheduleRelayout = true, RenderObject* newRoot = 0);
+    void markContainingBlocksForLayout(bool scheduleRelayout = true, RenderElement* newRoot = 0);
     void setNeedsLayout(MarkingBehavior = MarkContainingBlockChain);
     void clearNeedsLayout();
     void setPreferredLogicalWidthsDirty(bool, MarkingBehavior = MarkContainingBlockChain);
@@ -653,8 +653,6 @@
     void setHasTransform(bool b = true) { m_bitfields.setHasTransform(b); }
     void setHasReflection(bool b = true) { m_bitfields.setHasReflection(b); }
 
-    void scheduleRelayout();
-
     virtual void paint(PaintInfo&, const LayoutPoint&);
 
     // Recursive function that computes the size and position of this object and all its descendants.
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to