Source/WebCore/ChangeLog

 12021-04-13 Rob Buis <rbuis@igalia.com>
 2
 3 Support contain: layout
 4 https://bugs.webkit.org/show_bug.cgi?id=223569
 5
 6 Reviewed by NOBODY (OOPS!).
 7
 8 This patch implements layout containment as specified[1].
 9 It adds shouldApplyLayoutContainment to check whether the
 10 element applies for layout containment. Is so, then:
 11 - an independent formatting context is established.
 12 - any overflow is treated as ink overflow.
 13 - an absolute positioning and fixed positioning
 14 containing block is established.
 15 - a stacking context is created.
 16 - for baseline handling, the box is treated as having no
 17 baseline. For grid/flexible box containers/items, this needs
 18 a baseline synthesized from the border edges [2], for buttons it
 19 requires a baseline synthesized from the margin edges [2, 3].
 20
 21 [1] https://drafts.csswg.org/css-contain-2/#layout-containment
 22 [2] https://drafts.csswg.org/css-align-3/#synthesize-baseline
 23 [3] https://www.w3.org/TR/CSS2/visudet.html#propdef-vertical-align
 24
 25 * rendering/RenderBlock.cpp:
 26 (WebCore::RenderBlock::firstLineBaseline const):
 27 (WebCore::RenderBlock::inlineBlockBaseline const):
 28 * rendering/RenderBlockFlow.cpp:
 29 (WebCore::RenderBlockFlow::firstLineBaseline const):
 30 (WebCore::RenderBlockFlow::inlineBlockBaseline const):
 31 * rendering/RenderBox.cpp:
 32 (WebCore::RenderBox::createsNewFormattingContext const):
 33 (WebCore::RenderBox::layoutOverflowRectForPropagation const):
 34 * rendering/RenderBox.h:
 35 * rendering/RenderButton.cpp:
 36 (WebCore::RenderButton::baselinePosition const):
 37 * rendering/RenderElement.h:
 38 (WebCore::RenderElement::canContainFixedPositionObjects const):
 39 (WebCore::RenderElement::canContainAbsolutelyPositionedObjects const):
 40 * rendering/RenderFlexibleBox.cpp:
 41 (WebCore::RenderFlexibleBox::firstLineBaseline const):
 42 * rendering/RenderGrid.cpp:
 43 (WebCore::RenderGrid::firstLineBaseline const):
 44 * rendering/RenderListBox.cpp:
 45 (WebCore::RenderListBox::baselinePosition const):
 46 * rendering/RenderObject.cpp:
 47 (WebCore::objectIsRelayoutBoundary):
 48 * rendering/RenderObject.h:
 49 (WebCore::RenderObject::isAtomicInlineLevelBox const):
 50 (WebCore::RenderObject::shouldApplyLayoutContainment const):
 51 * rendering/RenderTable.cpp:
 52 (WebCore::RenderTable::firstLineBaseline const):
 53 * rendering/style/RenderStyle.h:
 54 (WebCore::RenderStyle::containsLayout const):
 55 * style/StyleAdjuster.cpp:
 56 (WebCore::Style::Adjuster::adjust const):
 57
1582021-04-13 Frédéric Wang <fwang@igalia.com>
259
360 ASSERTION FAILED: !m_needExceptionCheck in CloneSerializer::serialize with postMessage({g:42})

Source/WebCore/rendering/RenderBlock.cpp

@@LayoutUnit RenderBlock::minLineHeightForReplacedRenderer(bool isFirstLine, Layou
25742574
25752575Optional<LayoutUnit> RenderBlock::firstLineBaseline() const
25762576{
 2577 if (shouldApplyLayoutContainment())
 2578 return Optional<LayoutUnit>();
 2579
25772580 if (isWritingModeRoot() && !isRubyRun())
25782581 return Optional<LayoutUnit>();
25792582

@@Optional<LayoutUnit> RenderBlock::firstLineBaseline() const
25892592
25902593Optional<LayoutUnit> RenderBlock::inlineBlockBaseline(LineDirectionMode lineDirection) const
25912594{
 2595 if (shouldApplyLayoutContainment())
 2596 return Optional<LayoutUnit>(synthesizedBaselineFromBorderBox(*this, lineDirection) + (lineDirection == HorizontalLine ? marginBottom(): marginLeft()));
 2597
25922598 if (isWritingModeRoot() && !isRubyRun())
25932599 return Optional<LayoutUnit>();
25942600

Source/WebCore/rendering/RenderBlockFlow.cpp

@@Optional<LayoutUnit> RenderBlockFlow::firstLineBaseline() const
31113111 if (isWritingModeRoot() && !isRubyRun() && !isGridItem())
31123112 return WTF::nullopt;
31133113
 3114 if (shouldApplyLayoutContainment())
 3115 return WTF::nullopt;
 3116
31143117 if (!childrenInline())
31153118 return RenderBlock::firstLineBaseline();
31163119

@@Optional<LayoutUnit> RenderBlockFlow::inlineBlockBaseline(LineDirectionMode line
31333136 if (isWritingModeRoot() && !isRubyRun())
31343137 return WTF::nullopt;
31353138
 3139 if (shouldApplyLayoutContainment())
 3140 return RenderBlock::inlineBlockBaseline(lineDirection);
 3141
31363142 if (style().display() == DisplayType::InlineBlock) {
31373143 // 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'
31383144 // property has a computed value other than 'visible'. see https://www.w3.org/TR/CSS22/visudet.html

Source/WebCore/rendering/RenderBox.cpp

@@bool RenderBox::createsNewFormattingContext() const
46784678{
46794679 return isInlineBlockOrInlineTable() || isFloatingOrOutOfFlowPositioned() || hasOverflowClip() || isFlexItemIncludingDeprecated()
46804680 || isTableCell() || isTableCaption() || isFieldset() || isWritingModeRoot() || isDocumentElementRenderer() || isRenderFragmentedFlow() || isRenderFragmentContainer()
4681  || isGridItem() || style().specifiesColumns() || style().columnSpan() == ColumnSpan::All || style().display() == DisplayType::FlowRoot;
 4681 || style().containsLayout() || isGridItem() || style().specifiesColumns() || style().columnSpan() == ColumnSpan::All || style().display() == DisplayType::FlowRoot;
46824682}
46834683
46844684bool RenderBox::avoidsFloats() const

@@LayoutRect RenderBox::layoutOverflowRectForPropagation(const RenderStyle* parent
49254925{
49264926 // Only propagate interior layout overflow if we don't clip it.
49274927 LayoutRect rect = borderBoxRect();
4928  if (!hasOverflowClip())
 4928 if (!shouldApplyLayoutContainment() && !hasOverflowClip())
49294929 rect.unite(layoutOverflowRect());
49304930
49314931 bool hasTransform = this->hasTransform();

Source/WebCore/rendering/RenderBox.h

@@public:
5454 {
5555 return isDocumentElementRenderer() || isPositioned() || createsGroup() || hasOverflowClip()
5656 || hasTransformRelatedProperty() || hasHiddenBackface() || hasReflection() || style().specifiesColumns()
57  || !style().hasAutoUsedZIndex() || hasRunningAcceleratedAnimations();
 57 || style().containsLayout() || !style().hasAutoUsedZIndex() || hasRunningAcceleratedAnimations();
5858 }
5959
6060 bool requiresLayerWithScrollableArea() const;

Source/WebCore/rendering/RenderButton.cpp

@@static LayoutUnit synthesizedBaselineFromContentBox(const RenderBox& box, LineDi
148148 return direction == HorizontalLine ? box.borderTop() + box.paddingTop() + box.contentHeight() : box.borderRight() + box.paddingRight() + box.contentWidth();
149149}
150150
151 LayoutUnit RenderButton::baselinePosition(FontBaseline, bool, LineDirectionMode direction, LinePositionMode) const
 151LayoutUnit RenderButton::baselinePosition(FontBaseline fontBaseline, bool firstLine, LineDirectionMode direction, LinePositionMode mode) const
152152{
 153 if (shouldApplyLayoutContainment())
 154 return RenderFlexibleBox::baselinePosition(fontBaseline, firstLine, direction, mode);
153155 // We cannot rely on RenderFlexibleBox::baselinePosition() because of flexboxes have some special behavior
154156 // regarding baselines that shouldn't apply to buttons.
155157 LayoutUnit baseline = firstLineBaseline().valueOr(synthesizedBaselineFromContentBox(*this, direction));

Source/WebCore/rendering/RenderElement.h

@@inline bool RenderElement::canContainFixedPositionObjects() const
429429 return isRenderView()
430430 || (hasTransform() && isRenderBlock())
431431 || isSVGForeignObject()
 432 || shouldApplyLayoutContainment()
432433 || isOutOfFlowRenderFragmentedFlow();
433434}
434435

@@inline bool RenderElement::canContainAbsolutelyPositionedObjects() const
437438 return style().position() != PositionType::Static
438439 || (isRenderBlock() && hasTransformRelatedProperty())
439440 || isSVGForeignObject()
 441 || shouldApplyLayoutContainment()
440442 || isRenderView();
441443}
442444

Source/WebCore/rendering/RenderFlexibleBox.cpp

@@LayoutUnit RenderFlexibleBox::baselinePosition(FontBaseline, bool, LineDirection
155155
156156Optional<LayoutUnit> RenderFlexibleBox::firstLineBaseline() const
157157{
158  if (isWritingModeRoot() || m_numberOfInFlowChildrenOnFirstLine <= 0)
 158 if (isWritingModeRoot() || m_numberOfInFlowChildrenOnFirstLine <= 0 || shouldApplyLayoutContainment())
159159 return Optional<LayoutUnit>();
160160 RenderBox* baselineChild = nullptr;
161161 int childNumber = 0;

Source/WebCore/rendering/RenderGrid.cpp

@@LayoutUnit RenderGrid::baselinePosition(FontBaseline, bool, LineDirectionMode di
12591259
12601260Optional<LayoutUnit> RenderGrid::firstLineBaseline() const
12611261{
1262  if (isWritingModeRoot() || !m_grid.hasGridItems())
 1262 if (isWritingModeRoot() || !m_grid.hasGridItems() || shouldApplyLayoutContainment())
12631263 return WTF::nullopt;
12641264
12651265 const RenderBox* baselineChild = nullptr;

Source/WebCore/rendering/RenderListBox.cpp

@@RenderBox::LogicalExtentComputedValues RenderListBox::computeLogicalHeight(Layou
275275
276276LayoutUnit RenderListBox::baselinePosition(FontBaseline baselineType, bool firstLine, LineDirectionMode lineDirection, LinePositionMode linePositionMode) const
277277{
278  return RenderBox::baselinePosition(baselineType, firstLine, lineDirection, linePositionMode) - baselineAdjustment;
 278 auto baseline = RenderBox::baselinePosition(baselineType, firstLine, lineDirection, linePositionMode);
 279 if (!shouldApplyLayoutContainment())
 280 baseline -= baselineAdjustment;
 281 return baseline;
279282}
280283
281284LayoutRect RenderListBox::itemBoundingBoxRect(const LayoutPoint& additionalOffset, int index)

Source/WebCore/rendering/RenderObject.cpp

@@static inline bool objectIsRelayoutBoundary(const RenderElement* object)
502502 if (object->isTextControl())
503503 return true;
504504
 505 if (object->shouldApplyLayoutContainment())
 506 return true;
 507
505508 if (object->isSVGRoot())
506509 return true;
507510

Source/WebCore/rendering/RenderObject.h

@@public:
183183 virtual bool createsAnonymousWrapper() const { return false; }
184184 //////////////////////////////////////////
185185
 186 bool isAtomicInlineLevelBox() const
 187 {
 188 return style().isDisplayInlineType() && !(style().display() == DisplayType::Inline && !isReplaced());
 189 }
 190
 191 inline bool shouldApplyLayoutContainment() const
 192 {
 193 return style().containsLayout() && (!isInline() || isAtomicInlineLevelBox()) && !isRubyText() && (!isTablePart() || isRenderBlockFlow());
 194 }
 195
186196#if ENABLE(TREE_DEBUGGING)
187197 void showNodeTreeForThis() const;
188198 void showRenderTreeForThis() const;

Source/WebCore/rendering/RenderTable.cpp

@@Optional<LayoutUnit> RenderTable::firstLineBaseline() const
15001500 // doesn't define the baseline of a 'table' only an 'inline-table').
15011501 // This is also needed to properly determine the baseline of a cell if it has a table child.
15021502
1503  if (isWritingModeRoot())
 1503 if (isWritingModeRoot() || shouldApplyLayoutContainment())
15041504 return Optional<LayoutUnit>();
15051505
15061506 recalcSectionsIfNeeded();

Source/WebCore/rendering/style/RenderStyle.h

@@public:
522522 }
523523 bool hasAspectRatio() const { return aspectRatioType() == AspectRatioType::Ratio || aspectRatioType() == AspectRatioType::AutoAndRatio; }
524524 OptionSet<Containment> contain() const { return m_rareNonInheritedData->contain; }
 525 bool containsLayout() const { return m_rareNonInheritedData->contain.contains(Containment::Layout); }
525526 BoxAlignment boxAlign() const { return static_cast<BoxAlignment>(m_rareNonInheritedData->deprecatedFlexibleBox->align); }
526527 BoxDirection boxDirection() const { return static_cast<BoxDirection>(m_inheritedFlags.boxDirection); }
527528 float boxFlex() const { return m_rareNonInheritedData->deprecatedFlexibleBox->flex; }

Source/WebCore/style/StyleAdjuster.cpp

@@void Adjuster::adjust(RenderStyle& style, const RenderStyle* userAgentAppearance
437437 style.setUsedZIndex(0);
438438#endif
439439
 440 // contain: layout creates a stacking context.
 441 if (style.hasAutoUsedZIndex() && style.containsLayout())
 442 style.setUsedZIndex(0);
 443
440444 // Cull out any useless layers and also repeat patterns into additional layers.
441445 style.adjustBackgroundLayers();
442446 style.adjustMaskLayers();

LayoutTests/ChangeLog

 12021-04-13 Rob Buis <rbuis@igalia.com>
 2
 3 Support contain: layout
 4 https://bugs.webkit.org/show_bug.cgi?id=223569
 5
 6 Reviewed by NOBODY (OOPS!).
 7
 8 Unskip tests that pass now.
 9
 10 * TestExpectations:
 11
1122021-04-13 Peng Liu <peng.liu6@apple.com>
213
314 [macOS] Netflix videos opened in background tab never become playable after foregrounding

LayoutTests/TestExpectations

@@webkit.org/b/220928 imported/w3c/web-platform-tests/css/css-color/predefined-015
46794679
46804680# CSS containment tests that fail
46814681imported/w3c/web-platform-tests/css/css-contain/contain-animation-001.html [ ImageOnlyFailure ]
4682 imported/w3c/web-platform-tests/css/css-contain/contain-content-001.html [ ImageOnlyFailure ]
4683 imported/w3c/web-platform-tests/css/css-contain/contain-content-002.html [ ImageOnlyFailure ]
4684 imported/w3c/web-platform-tests/css/css-contain/contain-content-003.html [ ImageOnlyFailure ]
4685 imported/w3c/web-platform-tests/css/css-contain/contain-content-004.html [ ImageOnlyFailure ]
4686 imported/w3c/web-platform-tests/css/css-contain/contain-content-011.html [ ImageOnlyFailure ]
4687 imported/w3c/web-platform-tests/css/css-contain/contain-layout-006.html [ ImageOnlyFailure ]
4688 imported/w3c/web-platform-tests/css/css-contain/contain-layout-007.html [ ImageOnlyFailure ]
4689 imported/w3c/web-platform-tests/css/css-contain/contain-layout-013.html [ ImageOnlyFailure ]
4690 imported/w3c/web-platform-tests/css/css-contain/contain-layout-014.html [ ImageOnlyFailure ]
4691 imported/w3c/web-platform-tests/css/css-contain/contain-layout-016.html [ ImageOnlyFailure ]
4692 imported/w3c/web-platform-tests/css/css-contain/contain-layout-baseline-001.html [ ImageOnlyFailure ]
4693 imported/w3c/web-platform-tests/css/css-contain/contain-layout-baseline-002.html [ ImageOnlyFailure ]
4694 imported/w3c/web-platform-tests/css/css-contain/contain-layout-baseline-003.html [ ImageOnlyFailure ]
4695 imported/w3c/web-platform-tests/css/css-contain/contain-layout-baseline-004.html [ ImageOnlyFailure ]
4696 imported/w3c/web-platform-tests/css/css-contain/contain-layout-baseline-005.html [ ImageOnlyFailure ]
 4682# webkit-ruby-text
 4683imported/w3c/web-platform-tests/css/css-contain/contain-layout-017.html [ ImageOnlyFailure ]
46974684imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-001.html [ ImageOnlyFailure ]
46984685imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-003.html [ ImageOnlyFailure ]
46994686imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-004.html [ ImageOnlyFailure ]

@@imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visib
47084695imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-020.html [ ImageOnlyFailure ]
47094696imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-021.html [ ImageOnlyFailure ]
47104697imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-022.html [ ImageOnlyFailure ]
4711 imported/w3c/web-platform-tests/css/css-contain/contain-layout-button-001.html [ ImageOnlyFailure ]
4712 imported/w3c/web-platform-tests/css/css-contain/contain-layout-cell-001.html [ ImageOnlyFailure ]
4713 imported/w3c/web-platform-tests/css/css-contain/contain-layout-cell-002.html [ ImageOnlyFailure ]
4714 imported/w3c/web-platform-tests/css/css-contain/contain-layout-containing-block-absolute-001.html [ ImageOnlyFailure ]
4715 imported/w3c/web-platform-tests/css/css-contain/contain-layout-containing-block-fixed-001.html [ ImageOnlyFailure ]
4716 imported/w3c/web-platform-tests/css/css-contain/contain-layout-flexbox-001.html [ ImageOnlyFailure ]
4717 imported/w3c/web-platform-tests/css/css-contain/contain-layout-formatting-context-float-001.html [ ImageOnlyFailure ]
4718 imported/w3c/web-platform-tests/css/css-contain/contain-layout-formatting-context-margin-001.html [ ImageOnlyFailure ]
4719 imported/w3c/web-platform-tests/css/css-contain/contain-layout-grid-001.html [ ImageOnlyFailure ]
4720 imported/w3c/web-platform-tests/css/css-contain/contain-layout-ifc-022.html [ ImageOnlyFailure ]
4721 imported/w3c/web-platform-tests/css/css-contain/contain-layout-independent-formatting-context-001.html [ ImageOnlyFailure ]
4722 imported/w3c/web-platform-tests/css/css-contain/contain-layout-ink-overflow-013.html [ ImageOnlyFailure ]
4723 imported/w3c/web-platform-tests/css/css-contain/contain-layout-ink-overflow-014.html [ ImageOnlyFailure ]
4724 imported/w3c/web-platform-tests/css/css-contain/contain-layout-ink-overflow-015.html [ ImageOnlyFailure ]
4725 imported/w3c/web-platform-tests/css/css-contain/contain-layout-ink-overflow-016.html [ ImageOnlyFailure ]
4726 imported/w3c/web-platform-tests/css/css-contain/contain-layout-ink-overflow-017.html [ ImageOnlyFailure ]
4727 imported/w3c/web-platform-tests/css/css-contain/contain-layout-ink-overflow-018.html [ ImageOnlyFailure ]
4728 imported/w3c/web-platform-tests/css/css-contain/contain-layout-ink-overflow-019.html [ ImageOnlyFailure ]
4729 imported/w3c/web-platform-tests/css/css-contain/contain-layout-ink-overflow-020.html [ ImageOnlyFailure ]
4730 imported/w3c/web-platform-tests/css/css-contain/contain-layout-overflow-001.html [ ImageOnlyFailure ]
4731 imported/w3c/web-platform-tests/css/css-contain/contain-layout-overflow-002.html [ ImageOnlyFailure ]
47324698imported/w3c/web-platform-tests/css/css-contain/contain-layout-size-003.html [ ImageOnlyFailure ]
4733 imported/w3c/web-platform-tests/css/css-contain/contain-layout-stacking-context-001.html [ ImageOnlyFailure ]
4734 imported/w3c/web-platform-tests/css/css-contain/contain-layout-suppress-baseline-001.html [ ImageOnlyFailure ]
4735 imported/w3c/web-platform-tests/css/css-contain/contain-layout-suppress-baseline-002.html [ ImageOnlyFailure ]
47364699imported/w3c/web-platform-tests/css/css-contain/contain-paint-001.html [ ImageOnlyFailure ]
47374700imported/w3c/web-platform-tests/css/css-contain/contain-paint-004.html [ ImageOnlyFailure ]
47384701imported/w3c/web-platform-tests/css/css-contain/contain-paint-005.html [ ImageOnlyFailure ]