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