Title: [282524] releases/WebKitGTK/webkit-2.32/Source/WebCore
Revision
282524
Author
[email protected]
Date
2021-09-16 03:00:31 -0700 (Thu, 16 Sep 2021)

Log Message

Merge r277698 - The containing block for a fixed renderer has to be a type of RenderBlock
https://bugs.webkit.org/show_bug.cgi?id=225924
<rdar://77968716>

Reviewed by Simon Fraser.

While an atomic inline level box with layout containment can certainly be the containing block for fixed (and absolute) boxes,
the current render tree logic requires a containing block to be the type of RenderBlock.

* rendering/RenderElement.cpp:
(WebCore::nearestNonAnonymousContainingBlockIncludingSelf): make this function static so that we can call it from containingBlockForFixedPosition()
(WebCore::RenderElement::containingBlockForFixedPosition const):
(WebCore::RenderElement::containingBlockForAbsolutePosition const):

Modified Paths

Diff

Modified: releases/WebKitGTK/webkit-2.32/Source/WebCore/ChangeLog (282523 => 282524)


--- releases/WebKitGTK/webkit-2.32/Source/WebCore/ChangeLog	2021-09-16 09:55:12 UTC (rev 282523)
+++ releases/WebKitGTK/webkit-2.32/Source/WebCore/ChangeLog	2021-09-16 10:00:31 UTC (rev 282524)
@@ -1,3 +1,19 @@
+2021-05-18  Alan Bujtas  <[email protected]>
+
+        The containing block for a fixed renderer has to be a type of RenderBlock
+        https://bugs.webkit.org/show_bug.cgi?id=225924
+        <rdar://77968716>
+
+        Reviewed by Simon Fraser.
+
+        While an atomic inline level box with layout containment can certainly be the containing block for fixed (and absolute) boxes,
+        the current render tree logic requires a containing block to be the type of RenderBlock.
+
+        * rendering/RenderElement.cpp:
+        (WebCore::nearestNonAnonymousContainingBlockIncludingSelf): make this function static so that we can call it from containingBlockForFixedPosition()
+        (WebCore::RenderElement::containingBlockForFixedPosition const):
+        (WebCore::RenderElement::containingBlockForAbsolutePosition const):
+
 2021-05-17  Wenson Hsieh  <[email protected]>
 
         [GPU Process] Object identifiers with the deleted value should cause MESSAGE_CHECKs

Modified: releases/WebKitGTK/webkit-2.32/Source/WebCore/rendering/RenderElement.cpp (282523 => 282524)


--- releases/WebKitGTK/webkit-2.32/Source/WebCore/rendering/RenderElement.cpp	2021-09-16 09:55:12 UTC (rev 282523)
+++ releases/WebKitGTK/webkit-2.32/Source/WebCore/rendering/RenderElement.cpp	2021-09-16 10:00:31 UTC (rev 282524)
@@ -589,24 +589,23 @@
     return RenderPtr<RenderObject>(&renderer);
 }
 
-RenderBlock* RenderElement::containingBlockForFixedPosition() const
+static inline RenderBlock* nearestNonAnonymousContainingBlockIncludingSelf(RenderElement* renderer)
 {
-    auto* renderer = parent();
-    while (renderer && !renderer->canContainFixedPositionObjects())
-        renderer = renderer->parent();
-
-    ASSERT(!renderer || !renderer->isAnonymousBlock());
+    while (renderer && (!is<RenderBlock>(*renderer) || renderer->isAnonymousBlock()))
+        renderer = renderer->containingBlock();
     return downcast<RenderBlock>(renderer);
 }
 
+RenderBlock* RenderElement::containingBlockForFixedPosition() const
+{
+    auto* ancestor = parent();
+    while (ancestor && !ancestor->canContainFixedPositionObjects())
+        ancestor = ancestor->parent();
+    return nearestNonAnonymousContainingBlockIncludingSelf(ancestor);
+}
+
 RenderBlock* RenderElement::containingBlockForAbsolutePosition() const
 {
-    auto nearestNonAnonymousContainingBlockIncludingSelf = [&] (auto* renderer) {
-        while (renderer && (!is<RenderBlock>(*renderer) || renderer->isAnonymousBlock()))
-            renderer = renderer->containingBlock();
-        return downcast<RenderBlock>(renderer);
-    };
-
     if (is<RenderInline>(*this) && style().position() == PositionType::Relative) {
         // A relatively positioned RenderInline forwards its absolute positioned descendants to
         // its nearest non-anonymous containing block (to avoid having positioned objects list in RenderInlines).

Modified: releases/WebKitGTK/webkit-2.32/Source/WebCore/rendering/RenderElement.h (282523 => 282524)


--- releases/WebKitGTK/webkit-2.32/Source/WebCore/rendering/RenderElement.h	2021-09-16 09:55:12 UTC (rev 282523)
+++ releases/WebKitGTK/webkit-2.32/Source/WebCore/rendering/RenderElement.h	2021-09-16 10:00:31 UTC (rev 282524)
@@ -70,6 +70,7 @@
     RenderObject* firstChild() const { return m_firstChild; }
     RenderObject* lastChild() const { return m_lastChild; }
 
+    // Note that even if these 2 "canContain" functions return true for a particular renderer, it does not necessarily mean the renderer is the containing block (see containingBlockForAbsolute(Fixed)Position).
     bool canContainFixedPositionObjects() const;
     bool canContainAbsolutelyPositionedObjects() const;
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to