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; } \