Title: [270209] trunk
Revision
270209
Author
[email protected]
Date
2020-11-27 18:31:28 -0800 (Fri, 27 Nov 2020)

Log Message

[LFC Display] Fix box locations for positioned elements
https://bugs.webkit.org/show_bug.cgi?id=219310

Source/WebCore:

Reviewed by Zalan Bujtas.

The code assumed that layout boxes were always positioned relative to their parents,
but border box geometry is actually relative to containing block. To keep track
of this when building the display tree, add PositioningContext which tracks
containing blocks for three types of positioning (fixed, absolute and in-flow),
and root-relative offsets for each.

The code then passes the appropriate containing block box + offset into the Display::BoxFactory
code, which uses the offset to compute absolute box rects.

* display/DisplayTreeBuilder.cpp:
(WebCore::Display::PositioningContext::PositioningContext):
(WebCore::Display::PositioningContext::m_absolutePositionContainer):
(WebCore::Display::PositioningContext::m_inFlowContainer):
(WebCore::Display::PositioningContext::contextForDescendants const):
(WebCore::Display::PositioningContext::containingBlockContextForLayoutBox const):
(WebCore::Display::PositioningContext::inFlowContainingBlockContext const):
(WebCore::Display::TreeBuilder::build):
(WebCore::Display::TreeBuilder::buildInlineDisplayTree const):
(WebCore::Display::TreeBuilder::recursiveBuildDisplayTree const):
* display/DisplayTreeBuilder.h:
* display/css/DisplayBoxFactory.cpp:
(WebCore::Display::BoxFactory::displayBoxForRootBox const):
(WebCore::Display::BoxFactory::displayBoxForBodyBox const):
(WebCore::Display::BoxFactory::displayBoxForLayoutBox const):
(WebCore::Display::BoxFactory::displayBoxForTextRun const):
(WebCore::Display::BoxFactory::setupBoxGeometry const):
(WebCore::Display::BoxFactory::constructBoxDecorationData const):
(WebCore::Display::BoxFactory::setupBoxModelBox const):
* display/css/DisplayBoxFactory.h:
* layout/layouttree/LayoutBox.cpp:
(WebCore::Layout::Box::containingBlock const):
* layout/layouttree/LayoutBox.h:
(WebCore::Layout::Box::isContainingBlockForInFlow const):
(WebCore::Layout::Box::isContainingBlockForFixedPosition const):
(WebCore::Layout::Box::isContainingBlockForOutOfFlowPosition const):

LayoutTests:

Reviewed by NOBODY (OOPS!).

Two table tests are now image failures because of webkit.org/b/219322.

* TestExpectations:

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (270208 => 270209)


--- trunk/LayoutTests/ChangeLog	2020-11-28 00:02:55 UTC (rev 270208)
+++ trunk/LayoutTests/ChangeLog	2020-11-28 02:31:28 UTC (rev 270209)
@@ -1,3 +1,14 @@
+2020-11-27  Simon Fraser  <[email protected]>
+
+        [LFC Display] Fix box locations for positioned elements
+        https://bugs.webkit.org/show_bug.cgi?id=219310
+
+        Reviewed by Zalan Bujtas.
+
+        Two table tests are now image failures because of webkit.org/b/219322.
+
+        * TestExpectations:
+
 2020-11-27  Aditya Keerthi  <[email protected]>
 
         [iOS][FCR] Add new look for meter element

Modified: trunk/LayoutTests/TestExpectations (270208 => 270209)


--- trunk/LayoutTests/TestExpectations	2020-11-28 00:02:55 UTC (rev 270208)
+++ trunk/LayoutTests/TestExpectations	2020-11-28 02:31:28 UTC (rev 270209)
@@ -4650,6 +4650,8 @@
 fast/layoutformattingcontext/block-only/min-max-and-preferred-width-simple.html [ ImageOnlyFailure ]
 fast/layoutformattingcontext/block-only/out-of-flow-is-never-float-box.html [ ImageOnlyFailure ]
 webkit.org/b/217054 fast/layoutformattingcontext/horizontal-sizing-with-trailing-letter-spacing.html [ Skip ]
+webkit.org/b/219322 fast/layoutformattingcontext/table-simple-border-collapse.html [ ImageOnlyFailure ]
+webkit.org/b/219322 fast/layoutformattingcontext/table-simple-border-collapse2.html [ ImageOnlyFailure ]
 
 # These tests are for iOS port.
 fast/shadow-dom/ios/ [ Skip ]

Modified: trunk/Source/WebCore/ChangeLog (270208 => 270209)


--- trunk/Source/WebCore/ChangeLog	2020-11-28 00:02:55 UTC (rev 270208)
+++ trunk/Source/WebCore/ChangeLog	2020-11-28 02:31:28 UTC (rev 270209)
@@ -1,3 +1,46 @@
+2020-11-27  Simon Fraser  <[email protected]>
+
+        [LFC Display] Fix box locations for positioned elements
+        https://bugs.webkit.org/show_bug.cgi?id=219310
+
+        Reviewed by Zalan Bujtas.
+
+        The code assumed that layout boxes were always positioned relative to their parents,
+        but border box geometry is actually relative to containing block. To keep track
+        of this when building the display tree, add PositioningContext which tracks
+        containing blocks for three types of positioning (fixed, absolute and in-flow),
+        and root-relative offsets for each.
+
+        The code then passes the appropriate containing block box + offset into the Display::BoxFactory
+        code, which uses the offset to compute absolute box rects.
+
+        * display/DisplayTreeBuilder.cpp:
+        (WebCore::Display::PositioningContext::PositioningContext):
+        (WebCore::Display::PositioningContext::m_absolutePositionContainer):
+        (WebCore::Display::PositioningContext::m_inFlowContainer):
+        (WebCore::Display::PositioningContext::contextForDescendants const):
+        (WebCore::Display::PositioningContext::containingBlockContextForLayoutBox const):
+        (WebCore::Display::PositioningContext::inFlowContainingBlockContext const):
+        (WebCore::Display::TreeBuilder::build):
+        (WebCore::Display::TreeBuilder::buildInlineDisplayTree const):
+        (WebCore::Display::TreeBuilder::recursiveBuildDisplayTree const):
+        * display/DisplayTreeBuilder.h:
+        * display/css/DisplayBoxFactory.cpp:
+        (WebCore::Display::BoxFactory::displayBoxForRootBox const):
+        (WebCore::Display::BoxFactory::displayBoxForBodyBox const):
+        (WebCore::Display::BoxFactory::displayBoxForLayoutBox const):
+        (WebCore::Display::BoxFactory::displayBoxForTextRun const):
+        (WebCore::Display::BoxFactory::setupBoxGeometry const):
+        (WebCore::Display::BoxFactory::constructBoxDecorationData const):
+        (WebCore::Display::BoxFactory::setupBoxModelBox const):
+        * display/css/DisplayBoxFactory.h:
+        * layout/layouttree/LayoutBox.cpp:
+        (WebCore::Layout::Box::containingBlock const):
+        * layout/layouttree/LayoutBox.h:
+        (WebCore::Layout::Box::isContainingBlockForInFlow const):
+        (WebCore::Layout::Box::isContainingBlockForFixedPosition const):
+        (WebCore::Layout::Box::isContainingBlockForOutOfFlowPosition const):
+
 2020-11-27  Aditya Keerthi  <[email protected]>
 
         [iOS][FCR] Add new look for meter element

Modified: trunk/Source/WebCore/display/DisplayTreeBuilder.cpp (270208 => 270209)


--- trunk/Source/WebCore/display/DisplayTreeBuilder.cpp	2020-11-28 00:02:55 UTC (rev 270208)
+++ trunk/Source/WebCore/display/DisplayTreeBuilder.cpp	2020-11-28 02:31:28 UTC (rev 270209)
@@ -46,6 +46,57 @@
 namespace WebCore {
 namespace Display {
 
+class PositioningContext {
+public:
+    PositioningContext(const Display::ContainerBox& rootDisplayBox)
+        : m_fixedPositionContainer({ rootDisplayBox, { } })
+        , m_absolutePositionContainer({ rootDisplayBox, { } })
+        , m_inFlowContainer ({ rootDisplayBox, { } })
+    {
+    }
+
+    PositioningContext contextForDescendants(const Layout::Box& layoutBox, const Layout::BoxGeometry geometry, const Display::ContainerBox& displayBox) const
+    {
+        auto currentOffset = containingBlockContextForLayoutBox(layoutBox).offsetFromRoot;
+
+        auto borderBoxRect = LayoutRect { Layout::BoxGeometry::borderBoxRect(geometry) };
+        currentOffset += toLayoutSize(borderBoxRect.location());
+
+        auto currentBoxes = ContainingBlockContext { displayBox, currentOffset };
+        return {
+            layoutBox.isContainingBlockForFixedPosition() ? currentBoxes : m_fixedPositionContainer,
+            layoutBox.isContainingBlockForOutOfFlowPosition() ? currentBoxes : m_absolutePositionContainer,
+            layoutBox.isContainingBlockForInFlow() ? currentBoxes : m_inFlowContainer
+        };
+    }
+
+    const ContainingBlockContext& containingBlockContextForLayoutBox(const Layout::Box& layoutBox) const
+    {
+        if (layoutBox.isFixedPositioned())
+            return m_fixedPositionContainer;
+
+        if (layoutBox.isOutOfFlowPositioned())
+            return m_absolutePositionContainer;
+
+        return m_inFlowContainer;
+    }
+    
+    const ContainingBlockContext& inFlowContainingBlockContext() const { return m_inFlowContainer; }
+
+private:
+    PositioningContext(const ContainingBlockContext& fixedContainer, const ContainingBlockContext& absoluteContainer, const ContainingBlockContext& inFlowContainer)
+        : m_fixedPositionContainer(fixedContainer)
+        , m_absolutePositionContainer(absoluteContainer)
+        , m_inFlowContainer(inFlowContainer)
+    {
+    }
+
+    ContainingBlockContext m_fixedPositionContainer;
+    ContainingBlockContext m_absolutePositionContainer;
+    ContainingBlockContext m_inFlowContainer;
+};
+
+
 TreeBuilder::TreeBuilder(float pixelSnappingFactor)
     : m_boxFactory(pixelSnappingFactor)
 {
@@ -70,11 +121,9 @@
     if (!rootLayoutBox.firstChild())
         return makeUnique<Tree>(WTFMove(rootDisplayContainerBox));
 
-    auto borderBoxRect = LayoutRect { Layout::BoxGeometry::borderBoxRect(geometry) };
-    auto offset = toLayoutSize(borderBoxRect.location());
     auto insertionPosition = InsertionPosition { *rootDisplayContainerBox };
 
-    recursiveBuildDisplayTree(layoutState, offset, *rootLayoutBox.firstChild(), insertionPosition);
+    recursiveBuildDisplayTree(layoutState, *rootLayoutBox.firstChild(), { *rootDisplayContainerBox }, insertionPosition);
 
 #if ENABLE(TREE_DEBUGGING)
     LOG_WITH_STREAM(FormattingContextLayout, stream << "Display tree:\n" << displayTreeAsText(*rootDisplayContainerBox));
@@ -95,7 +144,7 @@
     }
 }
 
-void TreeBuilder::buildInlineDisplayTree(const Layout::LayoutState& layoutState, LayoutSize offsetFromRoot, const Layout::ContainerBox& inlineFormattingRoot, InsertionPosition& insertionPosition) const
+void TreeBuilder::buildInlineDisplayTree(const Layout::LayoutState& layoutState, const Layout::ContainerBox& inlineFormattingRoot, const PositioningContext& positioningContext, InsertionPosition& insertionPosition) const
 {
     auto& inlineFormattingState = layoutState.establishedInlineFormattingState(inlineFormattingRoot);
 
@@ -102,31 +151,32 @@
     for (auto& run : inlineFormattingState.lineRuns()) {
         if (run.text()) {
             auto& lineGeometry = inlineFormattingState.lines().at(run.lineIndex());
-            auto textBox = m_boxFactory.displayBoxForTextRun(run, lineGeometry, offsetFromRoot);
+            auto textBox = m_boxFactory.displayBoxForTextRun(run, lineGeometry, positioningContext.inFlowContainingBlockContext());
             insert(WTFMove(textBox), insertionPosition);
             continue;
         }
 
         if (is<Layout::ContainerBox>(run.layoutBox())) {
-            recursiveBuildDisplayTree(layoutState, offsetFromRoot, run.layoutBox(), insertionPosition);
+            recursiveBuildDisplayTree(layoutState, run.layoutBox(), positioningContext, insertionPosition);
             continue;
         }
 
         auto geometry = layoutState.geometryForBox(run.layoutBox());
-        auto displayBox = m_boxFactory.displayBoxForLayoutBox(run.layoutBox(), geometry, offsetFromRoot);
+        auto displayBox = m_boxFactory.displayBoxForLayoutBox(run.layoutBox(), geometry, positioningContext.inFlowContainingBlockContext());
         insert(WTFMove(displayBox), insertionPosition);
     }
 }
 
-void TreeBuilder::recursiveBuildDisplayTree(const Layout::LayoutState& layoutState, LayoutSize offsetFromRoot, const Layout::Box& layoutBox, InsertionPosition& insertionPosition) const
+void TreeBuilder::recursiveBuildDisplayTree(const Layout::LayoutState& layoutState, const Layout::Box& layoutBox, const PositioningContext& positioningContext, InsertionPosition& insertionPosition) const
 {
     auto geometry = layoutState.geometryForBox(layoutBox);
     std::unique_ptr<Box> displayBox;
-    
+
+    auto& containingBlockContext = positioningContext.containingBlockContextForLayoutBox(layoutBox);
     if (layoutBox.isBodyBox())
-        displayBox = m_boxFactory.displayBoxForBodyBox(layoutBox, geometry, m_rootBackgroundPropgation, offsetFromRoot);
+        displayBox = m_boxFactory.displayBoxForBodyBox(layoutBox, geometry, containingBlockContext, m_rootBackgroundPropgation);
     else
-        displayBox = m_boxFactory.displayBoxForLayoutBox(layoutBox, geometry, offsetFromRoot);
+        displayBox = m_boxFactory.displayBoxForLayoutBox(layoutBox, geometry, containingBlockContext);
     
     insert(WTFMove(displayBox), insertionPosition);
 
@@ -137,16 +187,16 @@
     if (!layoutContainerBox.hasChild())
         return;
 
-    auto borderBoxRect = LayoutRect { Layout::BoxGeometry::borderBoxRect(geometry) };
-    offsetFromRoot += toLayoutSize(borderBoxRect.location());
+    ContainerBox& currentBox = downcast<ContainerBox>(*insertionPosition.currentChild);
+    auto insertionPositionForChildren = InsertionPosition { currentBox };
 
-    auto positionForChildren = InsertionPosition { downcast<ContainerBox>(*insertionPosition.currentChild) };
+    auto positioningContextForDescendants = positioningContext.contextForDescendants(layoutContainerBox, geometry, currentBox);
 
     enum class DescendantBoxInclusion { AllBoxes, OutOfFlowOnly };
     auto boxInclusion = DescendantBoxInclusion::AllBoxes;
 
     if (layoutContainerBox.establishesInlineFormattingContext()) {
-        buildInlineDisplayTree(layoutState, offsetFromRoot, downcast<Layout::ContainerBox>(layoutContainerBox), positionForChildren);
+        buildInlineDisplayTree(layoutState, downcast<Layout::ContainerBox>(layoutContainerBox), positioningContextForDescendants, insertionPositionForChildren);
         boxInclusion = DescendantBoxInclusion::OutOfFlowOnly;
     }
 
@@ -160,7 +210,7 @@
 
     for (auto& child : Layout::childrenOfType<Layout::Box>(layoutContainerBox)) {
         if (includeBox(boxInclusion, child) && layoutState.hasBoxGeometry(child))
-            recursiveBuildDisplayTree(layoutState, offsetFromRoot, child, positionForChildren);
+            recursiveBuildDisplayTree(layoutState, child, positioningContextForDescendants, insertionPositionForChildren);
     }
 }
 

Modified: trunk/Source/WebCore/display/DisplayTreeBuilder.h (270208 => 270209)


--- trunk/Source/WebCore/display/DisplayTreeBuilder.h	2020-11-28 00:02:55 UTC (rev 270208)
+++ trunk/Source/WebCore/display/DisplayTreeBuilder.h	2020-11-28 02:31:28 UTC (rev 270209)
@@ -49,6 +49,7 @@
 
 class Box;
 class ContainerBox;
+class PositioningContext;
 class Tree;
 
 class TreeBuilder {
@@ -59,14 +60,14 @@
 
 private:
     struct InsertionPosition {
-        Display::ContainerBox& container;
-        Display::Box* currentChild { nullptr };
+        ContainerBox& container;
+        Box* currentChild { nullptr };
     };
 
-    void recursiveBuildDisplayTree(const Layout::LayoutState&, LayoutSize offsetFromRoot, const Layout::Box&, InsertionPosition&) const;
+    void recursiveBuildDisplayTree(const Layout::LayoutState&, const Layout::Box&, const PositioningContext&, InsertionPosition&) const;
 
-    void buildInlineDisplayTree(const Layout::LayoutState&, LayoutSize offsetFromRoot, const Layout::ContainerBox&, InsertionPosition&) const;
-    
+    void buildInlineDisplayTree(const Layout::LayoutState&, const Layout::ContainerBox&, const PositioningContext&, InsertionPosition&) const;
+
     void insert(std::unique_ptr<Box>&&, InsertionPosition&) const;
 
     BoxFactory m_boxFactory;

Modified: trunk/Source/WebCore/display/css/DisplayBoxFactory.cpp (270208 => 270209)


--- trunk/Source/WebCore/display/css/DisplayBoxFactory.cpp	2020-11-28 00:02:55 UTC (rev 270208)
+++ trunk/Source/WebCore/display/css/DisplayBoxFactory.cpp	2020-11-28 02:31:28 UTC (rev 270209)
@@ -29,6 +29,7 @@
 #if ENABLE(LAYOUT_FORMATTING_CONTEXT)
 
 #include "DisplayBoxDecorationData.h"
+#include "DisplayBoxDecorationPainter.h"
 #include "DisplayContainerBox.h"
 #include "DisplayFillLayerImageGeometry.h"
 #include "DisplayImageBox.h"
@@ -81,11 +82,12 @@
     auto style = Style { rootLayoutBox.style(), styleForBackground };
 
     auto rootBox = makeUnique<ContainerBox>(snapRectToDevicePixels(borderBoxRect, m_pixelSnappingFactor), WTFMove(style));
-    setupBoxModelBox(*rootBox, rootLayoutBox, styleForBackground, geometry, { });
+    // We pass rootBox as its own containingBlockBox here to allow it to be a reference everywhere else.
+    setupBoxModelBox(*rootBox, rootLayoutBox, geometry, { *rootBox, { 0, 0 } }, styleForBackground);
     return rootBox;
 }
 
-std::unique_ptr<Box> BoxFactory::displayBoxForBodyBox(const Layout::Box& layoutBox, const Layout::BoxGeometry& geometry, RootBackgroundPropagation rootBackgroundPropagation, LayoutSize offsetFromRoot) const
+std::unique_ptr<Box> BoxFactory::displayBoxForBodyBox(const Layout::Box& layoutBox, const Layout::BoxGeometry& geometry, const ContainingBlockContext& containingBlockContext, RootBackgroundPropagation rootBackgroundPropagation) const
 {
     const RenderStyle* styleForBackground = &layoutBox.style();
     
@@ -93,20 +95,20 @@
         styleForBackground = nullptr;
     
     auto style = Style { layoutBox.style(), styleForBackground };
-    return displayBoxForLayoutBox(layoutBox, styleForBackground, geometry, offsetFromRoot, WTFMove(style));
+    return displayBoxForLayoutBox(layoutBox, geometry, containingBlockContext, styleForBackground, WTFMove(style));
 }
 
-std::unique_ptr<Box> BoxFactory::displayBoxForLayoutBox(const Layout::Box& layoutBox, const Layout::BoxGeometry& geometry, LayoutSize offsetFromRoot) const
+std::unique_ptr<Box> BoxFactory::displayBoxForLayoutBox(const Layout::Box& layoutBox, const Layout::BoxGeometry& geometry, const ContainingBlockContext& containingBlockContext) const
 {
     auto style = Style { layoutBox.style() };
-    return displayBoxForLayoutBox(layoutBox, &layoutBox.style(), geometry, offsetFromRoot, WTFMove(style));
+    return displayBoxForLayoutBox(layoutBox, geometry, containingBlockContext, &layoutBox.style(), WTFMove(style));
 }
 
-std::unique_ptr<Box> BoxFactory::displayBoxForLayoutBox(const Layout::Box& layoutBox, const RenderStyle* styleForBackground, const Layout::BoxGeometry& geometry, LayoutSize offsetFromRoot, Style&& style) const
+std::unique_ptr<Box> BoxFactory::displayBoxForLayoutBox(const Layout::Box& layoutBox, const Layout::BoxGeometry& geometry, const ContainingBlockContext& containingBlockContext, const RenderStyle* styleForBackground, Style&& style) const
 {
     // FIXME: Need to map logical to physical rects.
     auto borderBoxRect = LayoutRect { Layout::BoxGeometry::borderBoxRect(geometry) };
-    borderBoxRect.move(offsetFromRoot);
+    borderBoxRect.move(containingBlockContext.offsetFromRoot);
     auto pixelSnappedBorderBoxRect = snapRectToDevicePixels(borderBoxRect, m_pixelSnappingFactor);
 
     // FIXME: Handle isAnonymous()
@@ -118,7 +120,7 @@
             image = cachedImage->image();
 
         auto imageBox = makeUnique<ImageBox>(pixelSnappedBorderBoxRect, WTFMove(style), WTFMove(image));
-        setupBoxModelBox(*imageBox, layoutBox, styleForBackground, geometry, offsetFromRoot);
+        setupBoxModelBox(*imageBox, layoutBox, geometry, containingBlockContext, styleForBackground);
         return imageBox;
     }
     
@@ -125,7 +127,7 @@
     if (is<Layout::ContainerBox>(layoutBox)) {
         // FIXME: The decision to make a ContainerBox should be made based on whether this Display::Box will have children.
         auto containerBox = makeUnique<ContainerBox>(pixelSnappedBorderBoxRect, WTFMove(style));
-        setupBoxModelBox(*containerBox, layoutBox, styleForBackground, geometry, offsetFromRoot);
+        setupBoxModelBox(*containerBox, layoutBox, geometry, containingBlockContext, styleForBackground);
         return containerBox;
     }
 
@@ -132,7 +134,7 @@
     return makeUnique<Box>(snapRectToDevicePixels(borderBoxRect, m_pixelSnappingFactor), WTFMove(style));
 }
 
-std::unique_ptr<Box> BoxFactory::displayBoxForTextRun(const Layout::LineRun& run, const Layout::InlineLineGeometry& lineGeometry, LayoutSize offsetFromRoot) const
+std::unique_ptr<Box> BoxFactory::displayBoxForTextRun(const Layout::LineRun& run, const Layout::InlineLineGeometry& lineGeometry, const ContainingBlockContext& containingBlockContext) const
 {
     ASSERT(run.text());
     auto lineRect = lineGeometry.lineBoxLogicalRect();
@@ -140,16 +142,16 @@
 
     auto runRect = LayoutRect { run.logicalLeft(), run.logicalTop(), run.logicalWidth(), run.logicalHeight() };
     runRect.moveBy(lineLayoutRect.location());
-    runRect.move(offsetFromRoot);
+    runRect.move(containingBlockContext.offsetFromRoot);
 
     auto style = Style { run.layoutBox().style() };
     return makeUnique<TextBox>(snapRectToDevicePixels(runRect, m_pixelSnappingFactor), WTFMove(style), run);
 }
 
-void BoxFactory::setupBoxGeometry(BoxModelBox& box, const Layout::Box&, const Layout::BoxGeometry& layoutGeometry, LayoutSize offsetFromRoot) const
+void BoxFactory::setupBoxGeometry(BoxModelBox& box, const Layout::Box&, const Layout::BoxGeometry& layoutGeometry, const ContainingBlockContext& containingBlockContext) const
 {
     auto borderBoxRect = LayoutRect { Layout::BoxGeometry::borderBoxRect(layoutGeometry) };
-    borderBoxRect.move(offsetFromRoot);
+    borderBoxRect.move(containingBlockContext.offsetFromRoot);
 
     auto paddingBoxRect = LayoutRect { layoutGeometry.paddingBox() };
     paddingBoxRect.moveBy(borderBoxRect.location());
@@ -169,7 +171,7 @@
     }
 }
 
-std::unique_ptr<BoxDecorationData> BoxFactory::constructBoxDecorationData(const Layout::Box& layoutBox, const RenderStyle* styleForBackground, const Layout::BoxGeometry& layoutGeometry, LayoutSize offsetFromRoot) const
+std::unique_ptr<BoxDecorationData> BoxFactory::constructBoxDecorationData(const Layout::Box& layoutBox, const Layout::BoxGeometry& layoutGeometry, const RenderStyle* styleForBackground, LayoutSize offsetFromRoot) const
 {
     auto boxDecorationData = makeUnique<BoxDecorationData>();
 
@@ -197,15 +199,15 @@
     return boxDecorationData;
 }
 
-void BoxFactory::setupBoxModelBox(BoxModelBox& box, const Layout::Box& layoutBox, const RenderStyle* styleForBackground, const Layout::BoxGeometry& layoutGeometry, LayoutSize offsetFromRoot) const
+void BoxFactory::setupBoxModelBox(BoxModelBox& box, const Layout::Box& layoutBox, const Layout::BoxGeometry& layoutGeometry, const ContainingBlockContext& containingBlockContext, const RenderStyle* styleForBackground) const
 {
-    setupBoxGeometry(box, layoutBox, layoutGeometry, offsetFromRoot);
+    setupBoxGeometry(box, layoutBox, layoutGeometry, containingBlockContext);
 
     auto& renderStyle = layoutBox.style();
     if (!(styleForBackground && styleForBackground->hasBackground()) && !renderStyle.hasBorder())
         return;
 
-    auto boxDecorationData = constructBoxDecorationData(layoutBox, styleForBackground, layoutGeometry, offsetFromRoot);
+    auto boxDecorationData = constructBoxDecorationData(layoutBox, layoutGeometry, styleForBackground, containingBlockContext.offsetFromRoot);
     box.setBoxDecorationData(WTFMove(boxDecorationData));
 }
 

Modified: trunk/Source/WebCore/display/css/DisplayBoxFactory.h (270208 => 270209)


--- trunk/Source/WebCore/display/css/DisplayBoxFactory.h	2020-11-28 00:02:55 UTC (rev 270208)
+++ trunk/Source/WebCore/display/css/DisplayBoxFactory.h	2020-11-28 02:31:28 UTC (rev 270209)
@@ -39,7 +39,6 @@
 class BoxGeometry;
 class ContainerBox;
 class InlineLineGeometry;
-class ReplacedBox;
 struct LineRun;
 }
 
@@ -48,6 +47,7 @@
 class Box;
 class BoxDecorationData;
 class BoxModelBox;
+class ContainerBox;
 class Style;
 
 enum class RootBackgroundPropagation : uint8_t {
@@ -55,6 +55,11 @@
     BodyToRoot,
 };
 
+struct ContainingBlockContext {
+    const Display::ContainerBox& box;
+    LayoutSize offsetFromRoot;
+};
+
 class BoxFactory {
 public:
     explicit BoxFactory(float pixelSnappingFactor);
@@ -62,18 +67,18 @@
     static RootBackgroundPropagation determineRootBackgroundPropagation(const Layout::ContainerBox& rootLayoutBox);
 
     std::unique_ptr<Box> displayBoxForRootBox(const Layout::ContainerBox&, const Layout::BoxGeometry&, RootBackgroundPropagation) const;
-    std::unique_ptr<Box> displayBoxForBodyBox(const Layout::Box&, const Layout::BoxGeometry&, RootBackgroundPropagation, LayoutSize offsetFromRoot) const;
-    std::unique_ptr<Box> displayBoxForLayoutBox(const Layout::Box&, const Layout::BoxGeometry&, LayoutSize offsetFromRoot) const;
+    std::unique_ptr<Box> displayBoxForBodyBox(const Layout::Box&, const Layout::BoxGeometry&, const ContainingBlockContext&, RootBackgroundPropagation) const;
+    std::unique_ptr<Box> displayBoxForLayoutBox(const Layout::Box&, const Layout::BoxGeometry&, const ContainingBlockContext&) const;
 
-    std::unique_ptr<Box> displayBoxForTextRun(const Layout::LineRun&, const Layout::InlineLineGeometry&, LayoutSize offsetFromRoot) const;
+    std::unique_ptr<Box> displayBoxForTextRun(const Layout::LineRun&, const Layout::InlineLineGeometry&, const ContainingBlockContext&) const;
 
 private:
-    std::unique_ptr<Box> displayBoxForLayoutBox(const Layout::Box&, const RenderStyle* styleForBackground, const Layout::BoxGeometry&, LayoutSize offsetFromRoot, Style&&) const;
+    std::unique_ptr<Box> displayBoxForLayoutBox(const Layout::Box&, const Layout::BoxGeometry&, const ContainingBlockContext&, const RenderStyle* styleForBackground, Style&&) const;
 
-    void setupBoxGeometry(BoxModelBox&, const Layout::Box&, const Layout::BoxGeometry&, LayoutSize offsetFromRoot) const;
-    void setupBoxModelBox(BoxModelBox&, const Layout::Box&, const RenderStyle* styleForBackground, const Layout::BoxGeometry&, LayoutSize offsetFromRoot) const;
+    void setupBoxGeometry(BoxModelBox&, const Layout::Box&, const Layout::BoxGeometry&, const ContainingBlockContext&) const;
+    void setupBoxModelBox(BoxModelBox&, const Layout::Box&, const Layout::BoxGeometry&, const ContainingBlockContext&, const RenderStyle* styleForBackground) const;
 
-    std::unique_ptr<BoxDecorationData> constructBoxDecorationData(const Layout::Box&, const RenderStyle* styleForBackground, const Layout::BoxGeometry&, LayoutSize offsetFromRoot) const;
+    std::unique_ptr<BoxDecorationData> constructBoxDecorationData(const Layout::Box&, const Layout::BoxGeometry&, const RenderStyle* styleForBackground, LayoutSize offsetFromRoot) const;
 
     static const Layout::ContainerBox* documentElementBoxFromRootBox(const Layout::ContainerBox& rootLayoutBox);
     static const Layout::Box* bodyBoxFromRootBox(const Layout::ContainerBox& rootLayoutBox);

Modified: trunk/Source/WebCore/layout/layouttree/LayoutBox.cpp (270208 => 270209)


--- trunk/Source/WebCore/layout/layouttree/LayoutBox.cpp	2020-11-28 00:02:55 UTC (rev 270208)
+++ trunk/Source/WebCore/layout/layouttree/LayoutBox.cpp	2020-11-28 02:31:28 UTC (rev 270209)
@@ -208,7 +208,7 @@
     if (!isPositioned() || isInFlowPositioned()) {
         auto* ancestor = &parent();
         for (; !is<InitialContainingBlock>(*ancestor); ancestor = &ancestor->parent()) {
-            if (ancestor->isBlockContainer() || ancestor->establishesFormattingContext())
+            if (ancestor->isContainingBlockForInFlow())
                 return *ancestor;
         }
         return *ancestor;
@@ -217,7 +217,7 @@
     if (isFixedPositioned()) {
         auto* ancestor = &parent();
         for (; !is<InitialContainingBlock>(*ancestor); ancestor = &ancestor->parent()) {
-            if (ancestor->style().hasTransform())
+            if (ancestor->isContainingBlockForFixedPosition())
                 return *ancestor;
         }
         return *ancestor;
@@ -226,7 +226,7 @@
     if (isOutOfFlowPositioned()) {
         auto* ancestor = &parent();
         for (; !is<InitialContainingBlock>(*ancestor); ancestor = &ancestor->parent()) {
-            if (ancestor->isPositioned() || ancestor->style().hasTransform())
+            if (ancestor->isContainingBlockForOutOfFlowPosition())
                 return *ancestor;
         }
         return *ancestor;

Modified: trunk/Source/WebCore/layout/layouttree/LayoutBox.h (270208 => 270209)


--- trunk/Source/WebCore/layout/layouttree/LayoutBox.h	2020-11-28 00:02:55 UTC (rev 270208)
+++ trunk/Source/WebCore/layout/layouttree/LayoutBox.h	2020-11-28 02:31:28 UTC (rev 270209)
@@ -97,6 +97,10 @@
     const ContainerBox& formattingContextRoot() const;
     const InitialContainingBlock& initialContainingBlock() const;
 
+    bool isContainingBlockForInFlow() const;
+    bool isContainingBlockForFixedPosition() const;
+    bool isContainingBlockForOutOfFlowPosition() const;
+
     bool isInFormattingContextOf(const ContainerBox&) const;
 
     bool isAnonymous() const { return m_isAnonymous; }
@@ -214,9 +218,24 @@
     bool m_isAnonymous : 1;
 };
 
+inline bool Box::isContainingBlockForInFlow() const
+{
+    return isBlockContainer() || establishesFormattingContext();
 }
+
+inline bool Box::isContainingBlockForFixedPosition() const
+{
+    return isInitialContainingBlock() || style().hasTransform();
 }
 
+inline bool Box::isContainingBlockForOutOfFlowPosition() const
+{
+    return isInitialContainingBlock() || isPositioned() || style().hasTransform();
+}
+
+}
+}
+
 #define SPECIALIZE_TYPE_TRAITS_LAYOUT_BOX(ToValueTypeName, predicate) \
 SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::Layout::ToValueTypeName) \
     static bool isType(const WebCore::Layout::Box& box) { return box.predicate; } \
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to