Title: [276235] trunk
Revision
276235
Author
[email protected]
Date
2021-04-18 23:13:38 -0700 (Sun, 18 Apr 2021)

Log Message

Support contain: layout
https://bugs.webkit.org/show_bug.cgi?id=223569

Patch by Rob Buis <[email protected]> on 2021-04-18
Reviewed by Darin Adler.

Source/WebCore:

This patch implements layout containment as specified[1].
It adds shouldApplyLayoutContainment to check whether the
element applies for layout containment. Is so, then:
- an independent formatting context is established.
- any overflow is treated as ink overflow.
- an absolute positioning and fixed positioning
containing block is established.
- a stacking context is created.
- for baseline handling, the box is treated as having no
baseline. For grid/flexible box containers/items, this needs
a baseline synthesized from the border edges [2], for buttons it
requires a baseline synthesized from the margin edges [2, 3].

[1] https://drafts.csswg.org/css-contain-2/#layout-containment
[2] https://drafts.csswg.org/css-align-3/#synthesize-baseline
[3] https://www.w3.org/TR/CSS2/visudet.html#propdef-vertical-align

* rendering/RenderBlock.cpp:
(WebCore::RenderBlock::firstLineBaseline const):
(WebCore::RenderBlock::inlineBlockBaseline const):
* rendering/RenderBlockFlow.cpp:
(WebCore::RenderBlockFlow::firstLineBaseline const):
(WebCore::RenderBlockFlow::inlineBlockBaseline const):
* rendering/RenderBox.cpp:
(WebCore::RenderBox::createsNewFormattingContext const):
(WebCore::RenderBox::layoutOverflowRectForPropagation const):
* rendering/RenderBox.h:
* rendering/RenderButton.cpp:
(WebCore::RenderButton::baselinePosition const):
* rendering/RenderElement.h:
(WebCore::RenderElement::canContainFixedPositionObjects const):
(WebCore::RenderElement::canContainAbsolutelyPositionedObjects const):
* rendering/RenderFlexibleBox.cpp:
(WebCore::RenderFlexibleBox::firstLineBaseline const):
* rendering/RenderGrid.cpp:
(WebCore::RenderGrid::firstLineBaseline const):
* rendering/RenderListBox.cpp:
(WebCore::RenderListBox::baselinePosition const):
* rendering/RenderObject.cpp:
(WebCore::objectIsRelayoutBoundary):
(WebCore::shouldApplyLayoutContainment):
* rendering/RenderObject.h:
(WebCore::RenderObject::isAtomicInlineLevelBox const):
* rendering/RenderTable.cpp:
(WebCore::RenderTable::firstLineBaseline const):
* rendering/style/RenderStyle.h:
(WebCore::RenderStyle::containsLayout const):
* style/StyleAdjuster.cpp:
(WebCore::Style::Adjuster::adjust const):

LayoutTests:

Unskip tests that pass now.

* TestExpectations:

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (276234 => 276235)


--- trunk/LayoutTests/ChangeLog	2021-04-19 02:43:33 UTC (rev 276234)
+++ trunk/LayoutTests/ChangeLog	2021-04-19 06:13:38 UTC (rev 276235)
@@ -1,3 +1,14 @@
+2021-04-18  Rob Buis  <[email protected]>
+
+        Support contain: layout
+        https://bugs.webkit.org/show_bug.cgi?id=223569
+
+        Reviewed by Darin Adler.
+
+        Unskip tests that pass now.
+
+        * TestExpectations:
+
 2021-04-18  Diego Pino Garcia  <[email protected]>
 
         [GLIB] Unreviewed test gardening. Marked css-transforms/animation/rotate-composition.html as failure after r276231.

Modified: trunk/LayoutTests/TestExpectations (276234 => 276235)


--- trunk/LayoutTests/TestExpectations	2021-04-19 02:43:33 UTC (rev 276234)
+++ trunk/LayoutTests/TestExpectations	2021-04-19 06:13:38 UTC (rev 276235)
@@ -4678,21 +4678,8 @@
 
 # CSS containment tests that fail
 imported/w3c/web-platform-tests/css/css-contain/contain-animation-001.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-content-001.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-content-002.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-content-003.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-content-004.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-content-011.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-layout-006.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-layout-007.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-layout-013.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-layout-014.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-layout-016.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-layout-baseline-001.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-layout-baseline-002.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-layout-baseline-003.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-layout-baseline-004.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-layout-baseline-005.html [ ImageOnlyFailure ]
+# webkit-ruby-text
+imported/w3c/web-platform-tests/css/css-contain/contain-layout-017.html [ ImageOnlyFailure ]
 imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-001.html [ ImageOnlyFailure ]
 imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-003.html [ ImageOnlyFailure ]
 imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-004.html [ ImageOnlyFailure ]
@@ -4707,31 +4694,7 @@
 imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-020.html [ ImageOnlyFailure ]
 imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-021.html [ ImageOnlyFailure ]
 imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-022.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-layout-button-001.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-layout-cell-001.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-layout-cell-002.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-layout-containing-block-absolute-001.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-layout-containing-block-fixed-001.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-layout-flexbox-001.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-layout-formatting-context-float-001.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-layout-formatting-context-margin-001.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-layout-grid-001.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-layout-ifc-022.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-layout-independent-formatting-context-001.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-layout-ink-overflow-013.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-layout-ink-overflow-014.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-layout-ink-overflow-015.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-layout-ink-overflow-016.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-layout-ink-overflow-017.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-layout-ink-overflow-018.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-layout-ink-overflow-019.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-layout-ink-overflow-020.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-layout-overflow-001.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-layout-overflow-002.html [ ImageOnlyFailure ]
 imported/w3c/web-platform-tests/css/css-contain/contain-layout-size-003.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-layout-stacking-context-001.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-layout-suppress-baseline-001.html [ ImageOnlyFailure ]
-imported/w3c/web-platform-tests/css/css-contain/contain-layout-suppress-baseline-002.html [ ImageOnlyFailure ]
 imported/w3c/web-platform-tests/css/css-contain/contain-paint-001.html [ ImageOnlyFailure ]
 imported/w3c/web-platform-tests/css/css-contain/contain-paint-004.html [ ImageOnlyFailure ]
 imported/w3c/web-platform-tests/css/css-contain/contain-paint-005.html [ ImageOnlyFailure ]

Modified: trunk/Source/WebCore/ChangeLog (276234 => 276235)


--- trunk/Source/WebCore/ChangeLog	2021-04-19 02:43:33 UTC (rev 276234)
+++ trunk/Source/WebCore/ChangeLog	2021-04-19 06:13:38 UTC (rev 276235)
@@ -1,3 +1,60 @@
+2021-04-18  Rob Buis  <[email protected]>
+
+        Support contain: layout
+        https://bugs.webkit.org/show_bug.cgi?id=223569
+
+        Reviewed by Darin Adler.
+
+        This patch implements layout containment as specified[1].
+        It adds shouldApplyLayoutContainment to check whether the
+        element applies for layout containment. Is so, then:
+        - an independent formatting context is established.
+        - any overflow is treated as ink overflow.
+        - an absolute positioning and fixed positioning
+        containing block is established.
+        - a stacking context is created.
+        - for baseline handling, the box is treated as having no
+        baseline. For grid/flexible box containers/items, this needs
+        a baseline synthesized from the border edges [2], for buttons it
+        requires a baseline synthesized from the margin edges [2, 3].
+
+        [1] https://drafts.csswg.org/css-contain-2/#layout-containment
+        [2] https://drafts.csswg.org/css-align-3/#synthesize-baseline
+        [3] https://www.w3.org/TR/CSS2/visudet.html#propdef-vertical-align
+
+        * rendering/RenderBlock.cpp:
+        (WebCore::RenderBlock::firstLineBaseline const):
+        (WebCore::RenderBlock::inlineBlockBaseline const):
+        * rendering/RenderBlockFlow.cpp:
+        (WebCore::RenderBlockFlow::firstLineBaseline const):
+        (WebCore::RenderBlockFlow::inlineBlockBaseline const):
+        * rendering/RenderBox.cpp:
+        (WebCore::RenderBox::createsNewFormattingContext const):
+        (WebCore::RenderBox::layoutOverflowRectForPropagation const):
+        * rendering/RenderBox.h:
+        * rendering/RenderButton.cpp:
+        (WebCore::RenderButton::baselinePosition const):
+        * rendering/RenderElement.h:
+        (WebCore::RenderElement::canContainFixedPositionObjects const):
+        (WebCore::RenderElement::canContainAbsolutelyPositionedObjects const):
+        * rendering/RenderFlexibleBox.cpp:
+        (WebCore::RenderFlexibleBox::firstLineBaseline const):
+        * rendering/RenderGrid.cpp:
+        (WebCore::RenderGrid::firstLineBaseline const):
+        * rendering/RenderListBox.cpp:
+        (WebCore::RenderListBox::baselinePosition const):
+        * rendering/RenderObject.cpp:
+        (WebCore::objectIsRelayoutBoundary):
+        (WebCore::shouldApplyLayoutContainment):
+        * rendering/RenderObject.h:
+        (WebCore::RenderObject::isAtomicInlineLevelBox const):
+        * rendering/RenderTable.cpp:
+        (WebCore::RenderTable::firstLineBaseline const):
+        * rendering/style/RenderStyle.h:
+        (WebCore::RenderStyle::containsLayout const):
+        * style/StyleAdjuster.cpp:
+        (WebCore::Style::Adjuster::adjust const):
+
 2021-04-18  Sam Weinig  <[email protected]>
 
         GraphicsLayer::distributeOpacity, GraphicsLayer::setOpacityInternal and GraphicsLayer::accumulatedOpacity are never used

Modified: trunk/Source/WebCore/rendering/RenderBlock.cpp (276234 => 276235)


--- trunk/Source/WebCore/rendering/RenderBlock.cpp	2021-04-19 02:43:33 UTC (rev 276234)
+++ trunk/Source/WebCore/rendering/RenderBlock.cpp	2021-04-19 06:13:38 UTC (rev 276235)
@@ -2575,6 +2575,9 @@
 
 Optional<LayoutUnit> RenderBlock::firstLineBaseline() const
 {
+    if (shouldApplyLayoutContainment(*this))
+        return WTF::nullopt;
+
     if (isWritingModeRoot() && !isRubyRun())
         return Optional<LayoutUnit>();
 
@@ -2590,6 +2593,9 @@
 
 Optional<LayoutUnit> RenderBlock::inlineBlockBaseline(LineDirectionMode lineDirection) const
 {
+    if (shouldApplyLayoutContainment(*this))
+        return synthesizedBaselineFromBorderBox(*this, lineDirection) + (lineDirection == HorizontalLine ? marginBottom() : marginLeft());
+
     if (isWritingModeRoot() && !isRubyRun())
         return Optional<LayoutUnit>();
 

Modified: trunk/Source/WebCore/rendering/RenderBlockFlow.cpp (276234 => 276235)


--- trunk/Source/WebCore/rendering/RenderBlockFlow.cpp	2021-04-19 02:43:33 UTC (rev 276234)
+++ trunk/Source/WebCore/rendering/RenderBlockFlow.cpp	2021-04-19 06:13:38 UTC (rev 276235)
@@ -3112,6 +3112,9 @@
     if (isWritingModeRoot() && !isRubyRun() && !isGridItem())
         return WTF::nullopt;
 
+    if (shouldApplyLayoutContainment(*this))
+        return WTF::nullopt;
+
     if (!childrenInline())
         return RenderBlock::firstLineBaseline();
 
@@ -3134,6 +3137,9 @@
     if (isWritingModeRoot() && !isRubyRun())
         return WTF::nullopt;
 
+    if (shouldApplyLayoutContainment(*this))
+        return RenderBlock::inlineBlockBaseline(lineDirection);
+
     if (style().display() == DisplayType::InlineBlock) {
         // The baseline of an 'inline-block' is the baseline of its last line box in the normal flow, unless it has either no in-flow line boxes or if its 'overflow'
         // property has a computed value other than 'visible'. see https://www.w3.org/TR/CSS22/visudet.html

Modified: trunk/Source/WebCore/rendering/RenderBox.cpp (276234 => 276235)


--- trunk/Source/WebCore/rendering/RenderBox.cpp	2021-04-19 02:43:33 UTC (rev 276234)
+++ trunk/Source/WebCore/rendering/RenderBox.cpp	2021-04-19 06:13:38 UTC (rev 276235)
@@ -4678,7 +4678,7 @@
 {
     return isInlineBlockOrInlineTable() || isFloatingOrOutOfFlowPositioned() || hasOverflowClip() || isFlexItemIncludingDeprecated()
         || isTableCell() || isTableCaption() || isFieldset() || isWritingModeRoot() || isDocumentElementRenderer() || isRenderFragmentedFlow() || isRenderFragmentContainer()
-        || isGridItem() || style().specifiesColumns() || style().columnSpan() == ColumnSpan::All || style().display() == DisplayType::FlowRoot;
+        || style().containsLayout() || isGridItem() || style().specifiesColumns() || style().columnSpan() == ColumnSpan::All || style().display() == DisplayType::FlowRoot;
 }
 
 bool RenderBox::avoidsFloats() const
@@ -4925,7 +4925,7 @@
 {
     // Only propagate interior layout overflow if we don't clip it.
     LayoutRect rect = borderBoxRect();
-    if (!hasOverflowClip())
+    if (!shouldApplyLayoutContainment(*this) && !hasOverflowClip())
         rect.unite(layoutOverflowRect());
 
     bool hasTransform = this->hasTransform();

Modified: trunk/Source/WebCore/rendering/RenderBox.h (276234 => 276235)


--- trunk/Source/WebCore/rendering/RenderBox.h	2021-04-19 02:43:33 UTC (rev 276234)
+++ trunk/Source/WebCore/rendering/RenderBox.h	2021-04-19 06:13:38 UTC (rev 276235)
@@ -54,7 +54,7 @@
     {
         return isDocumentElementRenderer() || isPositioned() || createsGroup() || hasOverflowClip()
             || hasTransformRelatedProperty() || hasHiddenBackface() || hasReflection() || style().specifiesColumns()
-            || !style().hasAutoUsedZIndex() || hasRunningAcceleratedAnimations();
+            || style().containsLayout() || !style().hasAutoUsedZIndex() || hasRunningAcceleratedAnimations();
     }
 
     bool requiresLayerWithScrollableArea() const;

Modified: trunk/Source/WebCore/rendering/RenderButton.cpp (276234 => 276235)


--- trunk/Source/WebCore/rendering/RenderButton.cpp	2021-04-19 02:43:33 UTC (rev 276234)
+++ trunk/Source/WebCore/rendering/RenderButton.cpp	2021-04-19 06:13:38 UTC (rev 276235)
@@ -148,8 +148,10 @@
     return direction == HorizontalLine ? box.borderTop() + box.paddingTop() + box.contentHeight() : box.borderRight() + box.paddingRight() + box.contentWidth();
 }
 
-LayoutUnit RenderButton::baselinePosition(FontBaseline, bool, LineDirectionMode direction, LinePositionMode) const
+LayoutUnit RenderButton::baselinePosition(FontBaseline fontBaseline, bool firstLine, LineDirectionMode direction, LinePositionMode mode) const
 {
+    if (shouldApplyLayoutContainment(*this))
+        return RenderFlexibleBox::baselinePosition(fontBaseline, firstLine, direction, mode);
     // We cannot rely on RenderFlexibleBox::baselinePosition() because of flexboxes have some special behavior
     // regarding baselines that shouldn't apply to buttons.
     LayoutUnit baseline = firstLineBaseline().valueOr(synthesizedBaselineFromContentBox(*this, direction));

Modified: trunk/Source/WebCore/rendering/RenderElement.h (276234 => 276235)


--- trunk/Source/WebCore/rendering/RenderElement.h	2021-04-19 02:43:33 UTC (rev 276234)
+++ trunk/Source/WebCore/rendering/RenderElement.h	2021-04-19 06:13:38 UTC (rev 276235)
@@ -429,6 +429,7 @@
     return isRenderView()
         || (hasTransform() && isRenderBlock())
         || isSVGForeignObject()
+        || shouldApplyLayoutContainment(*this)
         || isOutOfFlowRenderFragmentedFlow();
 }
 
@@ -437,6 +438,7 @@
     return style().position() != PositionType::Static
         || (isRenderBlock() && hasTransformRelatedProperty())
         || isSVGForeignObject()
+        || shouldApplyLayoutContainment(*this)
         || isRenderView();
 }
 

Modified: trunk/Source/WebCore/rendering/RenderFlexibleBox.cpp (276234 => 276235)


--- trunk/Source/WebCore/rendering/RenderFlexibleBox.cpp	2021-04-19 02:43:33 UTC (rev 276234)
+++ trunk/Source/WebCore/rendering/RenderFlexibleBox.cpp	2021-04-19 06:13:38 UTC (rev 276235)
@@ -155,7 +155,7 @@
 
 Optional<LayoutUnit> RenderFlexibleBox::firstLineBaseline() const
 {
-    if (isWritingModeRoot() || m_numberOfInFlowChildrenOnFirstLine <= 0)
+    if (isWritingModeRoot() || m_numberOfInFlowChildrenOnFirstLine <= 0 || shouldApplyLayoutContainment(*this))
         return Optional<LayoutUnit>();
     RenderBox* baselineChild = nullptr;
     int childNumber = 0;

Modified: trunk/Source/WebCore/rendering/RenderGrid.cpp (276234 => 276235)


--- trunk/Source/WebCore/rendering/RenderGrid.cpp	2021-04-19 02:43:33 UTC (rev 276234)
+++ trunk/Source/WebCore/rendering/RenderGrid.cpp	2021-04-19 06:13:38 UTC (rev 276235)
@@ -1259,7 +1259,7 @@
 
 Optional<LayoutUnit> RenderGrid::firstLineBaseline() const
 {
-    if (isWritingModeRoot() || !m_grid.hasGridItems())
+    if (isWritingModeRoot() || !m_grid.hasGridItems() || shouldApplyLayoutContainment(*this))
         return WTF::nullopt;
 
     const RenderBox* baselineChild = nullptr;

Modified: trunk/Source/WebCore/rendering/RenderListBox.cpp (276234 => 276235)


--- trunk/Source/WebCore/rendering/RenderListBox.cpp	2021-04-19 02:43:33 UTC (rev 276234)
+++ trunk/Source/WebCore/rendering/RenderListBox.cpp	2021-04-19 06:13:38 UTC (rev 276235)
@@ -275,7 +275,10 @@
 
 LayoutUnit RenderListBox::baselinePosition(FontBaseline baselineType, bool firstLine, LineDirectionMode lineDirection, LinePositionMode linePositionMode) const
 {
-    return RenderBox::baselinePosition(baselineType, firstLine, lineDirection, linePositionMode) - baselineAdjustment;
+    auto baseline = RenderBox::baselinePosition(baselineType, firstLine, lineDirection, linePositionMode);
+    if (!shouldApplyLayoutContainment(*this))
+        baseline -= baselineAdjustment;
+    return baseline;
 }
 
 LayoutRect RenderListBox::itemBoundingBoxRect(const LayoutPoint& additionalOffset, int index)

Modified: trunk/Source/WebCore/rendering/RenderObject.cpp (276234 => 276235)


--- trunk/Source/WebCore/rendering/RenderObject.cpp	2021-04-19 02:43:33 UTC (rev 276234)
+++ trunk/Source/WebCore/rendering/RenderObject.cpp	2021-04-19 06:13:38 UTC (rev 276235)
@@ -502,6 +502,9 @@
     if (object->isTextControl())
         return true;
 
+    if (shouldApplyLayoutContainment(*object))
+        return true;
+
     if (object->isSVGRoot())
         return true;
 
@@ -2440,3 +2443,8 @@
 }
 
 #endif
+
+bool WebCore::shouldApplyLayoutContainment(const WebCore::RenderObject& renderer)
+{
+    return renderer.style().containsLayout() && (!renderer.isInline() || renderer.isAtomicInlineLevelBox()) && !renderer.isRubyText() && (!renderer.isTablePart() || renderer.isRenderBlockFlow());
+}

Modified: trunk/Source/WebCore/rendering/RenderObject.h (276234 => 276235)


--- trunk/Source/WebCore/rendering/RenderObject.h	2021-04-19 02:43:33 UTC (rev 276234)
+++ trunk/Source/WebCore/rendering/RenderObject.h	2021-04-19 06:13:38 UTC (rev 276235)
@@ -203,6 +203,8 @@
     bool isRenderInline() const;
     bool isRenderLayerModelObject() const;
 
+    inline bool isAtomicInlineLevelBox() const;
+
     virtual bool isCounter() const { return false; }
     virtual bool isQuote() const { return false; }
 
@@ -1175,6 +1177,11 @@
     return nextSibling;
 }
 
+bool RenderObject::isAtomicInlineLevelBox() const
+{
+    return style().isDisplayInlineType() && !(style().display() == DisplayType::Inline && !isReplaced());
+}
+
 WTF::TextStream& operator<<(WTF::TextStream&, const RenderObject&);
 
 #if ENABLE(TREE_DEBUGGING)
@@ -1183,6 +1190,8 @@
 void printGraphicsLayerTreeForLiveDocuments();
 #endif
 
+bool shouldApplyLayoutContainment(const RenderObject&);
+
 } // namespace WebCore
 
 #define SPECIALIZE_TYPE_TRAITS_RENDER_OBJECT(ToValueTypeName, predicate) \

Modified: trunk/Source/WebCore/rendering/RenderTable.cpp (276234 => 276235)


--- trunk/Source/WebCore/rendering/RenderTable.cpp	2021-04-19 02:43:33 UTC (rev 276234)
+++ trunk/Source/WebCore/rendering/RenderTable.cpp	2021-04-19 06:13:38 UTC (rev 276235)
@@ -1498,7 +1498,7 @@
     // doesn't define the baseline of a 'table' only an 'inline-table').
     // This is also needed to properly determine the baseline of a cell if it has a table child.
 
-    if (isWritingModeRoot())
+    if (isWritingModeRoot() || shouldApplyLayoutContainment(*this))
         return Optional<LayoutUnit>();
 
     recalcSectionsIfNeeded();

Modified: trunk/Source/WebCore/rendering/style/RenderStyle.h (276234 => 276235)


--- trunk/Source/WebCore/rendering/style/RenderStyle.h	2021-04-19 02:43:33 UTC (rev 276234)
+++ trunk/Source/WebCore/rendering/style/RenderStyle.h	2021-04-19 06:13:38 UTC (rev 276235)
@@ -524,6 +524,7 @@
     }
     bool hasAspectRatio() const { return aspectRatioType() == AspectRatioType::Ratio || aspectRatioType() == AspectRatioType::AutoAndRatio; }
     OptionSet<Containment> contain() const { return m_rareNonInheritedData->contain; }
+    bool containsLayout() const { return m_rareNonInheritedData->contain.contains(Containment::Layout); }
     BoxAlignment boxAlign() const { return static_cast<BoxAlignment>(m_rareNonInheritedData->deprecatedFlexibleBox->align); }
     BoxDirection boxDirection() const { return static_cast<BoxDirection>(m_inheritedFlags.boxDirection); }
     float boxFlex() const { return m_rareNonInheritedData->deprecatedFlexibleBox->flex; }

Modified: trunk/Source/WebCore/style/StyleAdjuster.cpp (276234 => 276235)


--- trunk/Source/WebCore/style/StyleAdjuster.cpp	2021-04-19 02:43:33 UTC (rev 276234)
+++ trunk/Source/WebCore/style/StyleAdjuster.cpp	2021-04-19 06:13:38 UTC (rev 276235)
@@ -437,6 +437,10 @@
         style.setUsedZIndex(0);
 #endif
 
+    // contain: layout creates a stacking context.
+    if (style.hasAutoUsedZIndex() && style.containsLayout())
+        style.setUsedZIndex(0);
+
     // Cull out any useless layers and also repeat patterns into additional layers.
     style.adjustBackgroundLayers();
     style.adjustMaskLayers();
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to