Title: [204667] trunk/Source/WebCore
Revision
204667
Author
[email protected]
Date
2016-08-19 16:09:14 -0700 (Fri, 19 Aug 2016)

Log Message

RenderObject::containingBlock() cleanup.
https://bugs.webkit.org/show_bug.cgi?id=161013

Reviewed by Simon Fraser.

Move ::containingBlockForAbsolutePosition and ::containingBlockForFixedPosition
to RenderElement after tightening containingBlock() callsites.

No change in functionality.

* dom/Element.cpp:
(WebCore::layoutOverflowRectContainsAllDescendants):
* rendering/RenderElement.cpp:
(WebCore::RenderElement::containingBlockForFixedPosition):
(WebCore::RenderElement::containingBlockForAbsolutePosition):
* rendering/RenderElement.h:
* rendering/RenderInline.cpp:
(WebCore::RenderInline::styleWillChange):
* rendering/RenderObject.cpp:
(WebCore::RenderObject::containingBlock):
(WebCore::RenderObject::containingBlockForFixedPosition): Deleted.
(WebCore::RenderObject::containingBlockForAbsolutePosition): Deleted.
* rendering/RenderObject.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (204666 => 204667)


--- trunk/Source/WebCore/ChangeLog	2016-08-19 22:55:32 UTC (rev 204666)
+++ trunk/Source/WebCore/ChangeLog	2016-08-19 23:09:14 UTC (rev 204667)
@@ -1,3 +1,29 @@
+2016-08-19  Zalan Bujtas  <[email protected]>
+
+        RenderObject::containingBlock() cleanup.
+        https://bugs.webkit.org/show_bug.cgi?id=161013
+
+        Reviewed by Simon Fraser.
+
+        Move ::containingBlockForAbsolutePosition and ::containingBlockForFixedPosition
+        to RenderElement after tightening containingBlock() callsites.
+
+        No change in functionality.
+
+        * dom/Element.cpp:
+        (WebCore::layoutOverflowRectContainsAllDescendants):
+        * rendering/RenderElement.cpp:
+        (WebCore::RenderElement::containingBlockForFixedPosition):
+        (WebCore::RenderElement::containingBlockForAbsolutePosition):
+        * rendering/RenderElement.h:
+        * rendering/RenderInline.cpp:
+        (WebCore::RenderInline::styleWillChange):
+        * rendering/RenderObject.cpp:
+        (WebCore::RenderObject::containingBlock):
+        (WebCore::RenderObject::containingBlockForFixedPosition): Deleted.
+        (WebCore::RenderObject::containingBlockForAbsolutePosition): Deleted.
+        * rendering/RenderObject.h:
+
 2016-08-19  Dean Jackson  <[email protected]>
 
         Implement preferLowPowerToHighPerformance for WebGL

Modified: trunk/Source/WebCore/dom/Element.cpp (204666 => 204667)


--- trunk/Source/WebCore/dom/Element.cpp	2016-08-19 22:55:32 UTC (rev 204666)
+++ trunk/Source/WebCore/dom/Element.cpp	2016-08-19 23:09:14 UTC (rev 204667)
@@ -979,37 +979,40 @@
     return result;
 }
 
-static bool layoutOverflowRectContainsAllDescendants(const RenderElement& renderer)
+static bool layoutOverflowRectContainsAllDescendants(const RenderBox& renderBox)
 {
-    if (renderer.isRenderView())
+    if (renderBox.isRenderView())
         return true;
 
-    if (!renderer.element())
+    if (!renderBox.element())
         return false;
 
     // If there are any position:fixed inside of us, game over.
-    if (auto viewPositionedObjects = renderer.view().positionedObjects()) {
-        for (RenderBox* it : *viewPositionedObjects) {
-            if (it != &renderer && it->style().position() == FixedPosition && renderer.element()->contains(it->element()))
+    if (auto* viewPositionedObjects = renderBox.view().positionedObjects()) {
+        for (auto* positionedBox : *viewPositionedObjects) {
+            if (positionedBox == &renderBox)
+                continue;
+            if (positionedBox->style().position() == FixedPosition && renderBox.element()->contains(positionedBox->element()))
                 return false;
         }
     }
 
-    if (renderer.canContainAbsolutelyPositionedObjects()) {
+    if (renderBox.canContainAbsolutelyPositionedObjects()) {
         // Our layout overflow will include all descendant positioned elements.
         return true;
     }
 
     // This renderer may have positioned descendants whose containing block is some ancestor.
-    if (auto containingBlock = renderer.containingBlockForAbsolutePosition()) {
-        if (auto positionedObjects = containingBlock->positionedObjects()) {
-            for (RenderBox* it : *positionedObjects) {
-                if (it != &renderer && renderer.element()->contains(it->element()))
+    if (auto* containingBlock = renderBox.containingBlockForAbsolutePosition()) {
+        if (auto* positionedObjects = containingBlock->positionedObjects()) {
+            for (auto* positionedBox : *positionedObjects) {
+                if (positionedBox == &renderBox)
+                    continue;
+                if (renderBox.element()->contains(positionedBox->element()))
                     return false;
             }
         }
     }
-    
     return false;
 }
 

Modified: trunk/Source/WebCore/rendering/RenderElement.cpp (204666 => 204667)


--- trunk/Source/WebCore/rendering/RenderElement.cpp	2016-08-19 22:55:32 UTC (rev 204666)
+++ trunk/Source/WebCore/rendering/RenderElement.cpp	2016-08-19 23:09:14 UTC (rev 204667)
@@ -647,6 +647,29 @@
         cache->childrenChanged(this);
 }
 
+RenderBlock* RenderElement::containingBlockForFixedPosition() const
+{
+    auto* renderer = parent();
+    while (renderer && !renderer->canContainFixedPositionObjects())
+        renderer = renderer->parent();
+
+    ASSERT(!renderer || !renderer->isAnonymousBlock());
+    return downcast<RenderBlock>(renderer);
+}
+
+RenderBlock* RenderElement::containingBlockForAbsolutePosition() const
+{
+    // A relatively positioned RenderInline forwards its absolute positioned descendants to
+    // its nearest non-anonymous containing block (to avoid having a positioned objects list in all RenderInlines).
+    auto* renderer = isRenderInline() ? const_cast<RenderElement*>(downcast<RenderElement>(this)) : parent();
+    while (renderer && !renderer->canContainAbsolutelyPositionedObjects())
+        renderer = renderer->parent();
+    // Make sure we only return non-anonymous RenderBlock as containing block.
+    while (renderer && (!is<RenderBlock>(*renderer) || renderer->isAnonymousBlock()))
+        renderer = renderer->containingBlock();
+    return downcast<RenderBlock>(renderer);
+}
+
 static void addLayers(RenderElement& renderer, RenderLayer* parentLayer, RenderElement*& newObject, RenderLayer*& beforeChild)
 {
     if (renderer.hasLayer()) {

Modified: trunk/Source/WebCore/rendering/RenderElement.h (204666 => 204667)


--- trunk/Source/WebCore/rendering/RenderElement.h	2016-08-19 22:55:32 UTC (rev 204666)
+++ trunk/Source/WebCore/rendering/RenderElement.h	2016-08-19 23:09:14 UTC (rev 204667)
@@ -218,6 +218,8 @@
     void adjustComputedFontSizesOnBlocks(float size, float visibleWidth);
     WEBCORE_EXPORT void resetTextAutosizing();
 #endif
+    RenderBlock* containingBlockForFixedPosition() const;
+    RenderBlock* containingBlockForAbsolutePosition() const;
 
 protected:
     enum BaseTypeFlag {

Modified: trunk/Source/WebCore/rendering/RenderInline.cpp (204666 => 204667)


--- trunk/Source/WebCore/rendering/RenderInline.cpp	2016-08-19 22:55:32 UTC (rev 204666)
+++ trunk/Source/WebCore/rendering/RenderInline.cpp	2016-08-19 23:09:14 UTC (rev 204667)
@@ -168,10 +168,9 @@
 void RenderInline::styleWillChange(StyleDifference diff, const RenderStyle& newStyle)
 {
     RenderBoxModelObject::styleWillChange(diff, newStyle);
-
-    // Check if this inline can hold absolute positioned elmements even after the style change.
+    // RenderInlines forward their absolute positioned descendants to their (non-anonymous) containing block.
+    // Check if this non-anonymous containing block can hold the absolute positioned elements when the inline is no longer positioned.
     if (canContainAbsolutelyPositionedObjects() && newStyle.position() == StaticPosition) {
-        // RenderInlines forward their absolute positioned descendants to their (non-anonymous) containing block.
         auto* container = containingBlockForAbsolutePosition();
         if (container && !container->canContainAbsolutelyPositionedObjects())
             container->removePositionedObjects(nullptr, NewContainingBlock);

Modified: trunk/Source/WebCore/rendering/RenderObject.cpp (204666 => 204667)


--- trunk/Source/WebCore/rendering/RenderObject.cpp	2016-08-19 22:55:32 UTC (rev 204666)
+++ trunk/Source/WebCore/rendering/RenderObject.cpp	2016-08-19 23:09:14 UTC (rev 204667)
@@ -568,7 +568,7 @@
 
 RenderBlock* RenderObject::containingBlock() const
 {
-    auto containingBlockForRenderer = [](const RenderObject& renderer)
+    auto containingBlockForRenderer = [](const RenderElement& renderer)
     {
         auto& style = renderer.style();
         if (style.position() == AbsolutePosition)
@@ -582,44 +582,13 @@
         return containingBlockForObjectInFlow();
 
     if (!parent() && is<RenderScrollbarPart>(*this)) {
-        if (auto* renderer = downcast<RenderScrollbarPart>(*this).rendererOwningScrollbar())
-            return containingBlockForRenderer(*renderer);
+        if (auto* scrollbarPart = downcast<RenderScrollbarPart>(*this).rendererOwningScrollbar())
+            return containingBlockForRenderer(*scrollbarPart);
         return nullptr;
     }
-    return containingBlockForRenderer(*this);
+    return containingBlockForRenderer(downcast<RenderElement>(*this));
 }
 
-RenderBlock* RenderObject::containingBlockForFixedPosition() const
-{
-    auto* renderer = parent();
-    while (renderer && !renderer->canContainFixedPositionObjects())
-        renderer = renderer->parent();
-
-    ASSERT(!renderer || !renderer->isAnonymousBlock());
-    return downcast<RenderBlock>(renderer);
-}
-
-RenderBlock* RenderObject::containingBlockForAbsolutePosition() const
-{
-    // RenderInlines forward their absolute positioned descendants to the containing block, so
-    // we need to start searching from 'this' and not from 'parent()'.
-    auto* renderer = isRenderInline() ? const_cast<RenderElement*>(downcast<RenderElement>(this)) : parent();
-    while (renderer && !renderer->canContainAbsolutelyPositionedObjects())
-        renderer = renderer->parent();
-
-    // For a relatively positioned inline, return its nearest non-anonymous containing block,
-    // not the inline itself, to avoid having a positioned objects list in all RenderInlines
-    // and use RenderBlock* as RenderElement::containingBlock's return type.
-    // Use RenderBlock::container() to obtain the inline.
-    if (renderer && !is<RenderBlock>(*renderer))
-        renderer = renderer->containingBlock();
-
-    while (renderer && renderer->isAnonymousBlock())
-        renderer = renderer->containingBlock();
-
-    return downcast<RenderBlock>(renderer);
-}
-
 RenderBlock* RenderObject::containingBlockForObjectInFlow() const
 {
     auto* renderer = parent();

Modified: trunk/Source/WebCore/rendering/RenderObject.h (204666 => 204667)


--- trunk/Source/WebCore/rendering/RenderObject.h	2016-08-19 22:55:32 UTC (rev 204666)
+++ trunk/Source/WebCore/rendering/RenderObject.h	2016-08-19 23:09:14 UTC (rev 204667)
@@ -600,8 +600,6 @@
 
     // returns the containing block level element for this element.
     RenderBlock* containingBlock() const;
-    RenderBlock* containingBlockForFixedPosition() const;
-    RenderBlock* containingBlockForAbsolutePosition() const;
     RenderBlock* containingBlockForObjectInFlow() const;
 
     // Convert the given local point to absolute coordinates. If MapCoordinatesFlags includes UseTransforms, take transforms into account.
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to