Skip to content

Commit

Permalink
Add support for css content-visibility: hidden
Browse files Browse the repository at this point in the history
https://bugs.webkit.org/show_bug.cgi?id=236710

Reviewed by Antti Koivisto.

This patch implements support for content-visibility: hidden [1].
It introduces the fake inherited property effectiveSkipsContent to keep
track for Elements whether content-visibility is hidden and whether elements
should be skipped for painting and hit testing.

Several points in 4.3. Restrictions and Clarifications [2] are addressed too:
- scrollIntoView is adapted [4.3.5]
- tab-order navigation and focusing take skipped contents into account [3].

[1] https://drafts.csswg.org/css-contain/#using-cv-hidden
[2] https://drafts.csswg.org/css-contain/#cv-notes
[3] https://drafts.csswg.org/css-contain/#valdef-content-visibility-hidden

* LayoutTests/TestExpectations:
* LayoutTests/imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-015-expected.txt:
* LayoutTests/imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-016-expected.txt:
* LayoutTests/imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-017-expected.txt:
* LayoutTests/imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-018-expected.txt:
* LayoutTests/imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-029-expected.txt:
* LayoutTests/imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-035-expected.txt:
* LayoutTests/imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-038-expected.txt:
* LayoutTests/imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-047-expected.txt:
* LayoutTests/imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-072-expected.txt:
* LayoutTests/imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-img-expected.txt:
* LayoutTests/imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-input-image-expected.txt:
* LayoutTests/imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-svg-expected.txt:
* LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/contain-intrinsic-size/auto-006-expected.txt:
* LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/contain-intrinsic-size/auto-009-expected.txt:
* LayoutTests/imported/w3c/web-platform-tests/css/css-sizing/contain-intrinsic-size/auto-010-expected.txt:
* LayoutTests/imported/w3c/web-platform-tests/html/semantics/embedded-content/the-embed-element/embed-document-under-content-visibility-focus-expected.txt:
* LayoutTests/imported/w3c/web-platform-tests/html/semantics/embedded-content/the-embed-element/embed-document-under-content-visibility-gbcr-expected.txt:
* Source/WebCore/dom/Element.cpp:
(WebCore::Element::isFocusable const): skipped contents are not focusable
* Source/WebCore/page/FrameView.cpp:
(WebCore::FrameView::scrollRectToVisible): do not scroll if the RenderObject is skipped content
* Source/WebCore/rendering/RenderBlock.cpp:
(WebCore::RenderBlock::paintContents): do not paint contents for c-v: hidden
* Source/WebCore/rendering/RenderElement.h:
(WebCore::RenderElement::visibleToHitTesting const): mark skipped content as not visible to hit testing
(WebCore::RenderElement::shouldApplyLayoutContainment const): c-v: hidden forces containment
(WebCore::RenderElement::shouldApplyPaintContainment const): c-v: hidden forces containment
(WebCore::RenderElement::shouldApplyLayoutOrPaintContainment const): c-v: hidden forces containment
(WebCore::RenderElement::shouldApplySizeContainment const): c-v: hidden forces containment
(WebCore::RenderElement::shouldApplyInlineSizeContainment const): c-v: hidden forces containment
(WebCore::RenderElement::shouldApplySizeOrInlineSizeContainment const): c-v: hidden forces containment
(WebCore::RenderElement::shouldApplyStyleContainment const): c-v: hidden forces containment
* Source/WebCore/rendering/RenderLayer.cpp:
(WebCore::RenderLayer::paintList): do not paint child layers of a c-v: hidden container
* Source/WebCore/rendering/RenderLayerBacking.cpp:
(WebCore::RenderLayerBacking::updateAfterDescendants):
* Source/WebCore/rendering/RenderObject.cpp:
(WebCore::RenderObject::isSkippedContent const):
(WebCore::RenderObject::shouldSkipContent const):
* Source/WebCore/rendering/RenderObject.h:
* Source/WebCore/rendering/RenderReplaced.cpp:
(WebCore::RenderReplaced::paint): do not paint contents for content-visibility: hidden
* Source/WebCore/rendering/RenderWidget.cpp:
(WebCore::RenderWidget::paint): do not paint contents for content-visibility: hidden
* Source/WebCore/rendering/style/RenderStyle.h:
(WebCore::RenderStyle::effectiveSkipsContent const):
(WebCore::RenderStyle::setEffectiveSkipsContent):
* Source/WebCore/rendering/style/StyleRareInheritedData.cpp:
(WebCore::StyleRareInheritedData::StyleRareInheritedData):
(WebCore::StyleRareInheritedData::operator== const):
* Source/WebCore/rendering/style/StyleRareInheritedData.h:
* Source/WebCore/style/StyleAdjuster.cpp:
(WebCore::Style::Adjuster::adjust const):
  • Loading branch information
rwlbuis committed Nov 1, 2022
1 parent 742f3d6 commit faf9ff8
Show file tree
Hide file tree
Showing 32 changed files with 87 additions and 91 deletions.
40 changes: 7 additions & 33 deletions LayoutTests/TestExpectations
Original file line number Diff line number Diff line change
Expand Up @@ -4893,48 +4893,22 @@ webanimations/translate-property-and-translate-animation-with-delay-on-forced-la
# CSS containment tests that fail
imported/w3c/web-platform-tests/css/css-contain/contain-inline-size-bfc-floats-001.html [ ImageOnlyFailure ]
imported/w3c/web-platform-tests/css/css-contain/contain-inline-size-intrinsic.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 ]
imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-005.html [ ImageOnlyFailure ]
imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-006.html [ ImageOnlyFailure ]
imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-007.html [ ImageOnlyFailure ]
imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-008.html [ ImageOnlyFailure ]
imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-009.html [ ImageOnlyFailure ]
imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-010.html [ ImageOnlyFailure ]
imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-011.html [ ImageOnlyFailure ]
imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-019.sub.https.html [ ImageOnlyFailure ]
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/content-visibility/content-visibility-023.html [ ImageOnlyFailure ]
imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-024.html [ ImageOnlyFailure ]
imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-025.html [ ImageOnlyFailure ]
imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-032.html [ ImageOnlyFailure ]
imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-033.sub.https.html [ ImageOnlyFailure ]
imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-034.html [ ImageOnlyFailure ]
imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-037.html [ ImageOnlyFailure ]
imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-040.html [ ImageOnlyFailure ]
imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-041.html [ ImageOnlyFailure ]
imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-043.html [ ImageOnlyFailure ]
imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-045.html [ ImageOnlyFailure ]
imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-051.html [ ImageOnlyFailure ]
imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-056.html [ ImageOnlyFailure ]
imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-058.html [ ImageOnlyFailure ]
imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-064.html [ ImageOnlyFailure ]
imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-067.html [ ImageOnlyFailure ]
# forced layout
imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-035.html [ Skip ]
# c-v: auto
imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-075.html [ ImageOnlyFailure ]
imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-076.html [ ImageOnlyFailure ]
imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-078.html [ ImageOnlyFailure ]
imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-082.html [ ImageOnlyFailure ]
imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-083.html [ ImageOnlyFailure ]
imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-084.html [ ImageOnlyFailure ]
imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-with-top-layer-000.tentative.html [ ImageOnlyFailure ]
imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-with-top-layer-001.tentative.html [ ImageOnlyFailure ]
imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-with-top-layer-002.tentative.html [ ImageOnlyFailure ]
imported/w3c/web-platform-tests/css/css-contain/content-visibility/element-reassigned-to-skipped-slot.html [ ImageOnlyFailure ]
imported/w3c/web-platform-tests/css/css-contain/content-visibility/element-reassigned-to-slot-in-skipped-subtree.html [ ImageOnlyFailure ]
imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-with-top-layer-003.tentative.html [ ImageOnlyFailure ]
imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-canvas.html [ ImageOnlyFailure ]
imported/w3c/web-platform-tests/css/css-contain/content-visibility/content-visibility-video.html [ ImageOnlyFailure ]
imported/w3c/web-platform-tests/css/css-contain/content-visibility/scrollIntoView-target-with-contents-hidden.html [ ImageOnlyFailure ]
imported/w3c/web-platform-tests/css/css-contain/content-visibility/scrollIntoView-with-focus-target-with-contents-hidden.html [ ImageOnlyFailure ]
imported/w3c/web-platform-tests/css/css-contain/counter-scoping-001.html [ ImageOnlyFailure ]
imported/w3c/web-platform-tests/css/css-contain/counter-scoping-002.html [ ImageOnlyFailure ]
imported/w3c/web-platform-tests/css/css-contain/quote-scoping-001.html [ ImageOnlyFailure ]
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@

FAIL Content Visibility: hit testing assert_equals: center hits outer expected "outer" but got "inner"
PASS Content Visibility: hit testing

Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@

FAIL Content Visibility: hit testing (composited) assert_equals: center hits outer expected "outer" but got "inner"
PASS Content Visibility: hit testing (composited)

Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@

FAIL Content Visibility: hit testing (composited child) assert_equals: center hits outer expected "outer" but got "inner"
PASS Content Visibility: hit testing (composited child)

Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@

FAIL Content Visibility: hit testing (composited with a composited child) assert_equals: center hits outer expected "outer" but got "inner"
PASS Content Visibility: hit testing (composited with a composited child)

Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
This text should be visible.
This text should not be visible.
This text is also not visible.

FAIL innerText on locked element. assert_equals: expected "This text should be visible." but got "This text should be visible.\nThis text should not be visible.\nThis text is also not visible."
FAIL innerText on locked element. assert_equals: expected "This text should be visible." but got "This text should be visible.\n"

Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@


FAIL Testing focus and force layout on element with hidden flat-tree ancestor assert_not_equals: got disallowed value Element node <input id="slotted" type="text"></input>
PASS Testing focus and force layout on element with hidden flat-tree ancestor

Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@

FAIL Measure Forced Layout assert_equals: spacer forced expected 8 but got 108
FAIL Measure Forced Layout assert_equals: spacer when visible expected 108 but got 8

Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@




FAIL Tab order navigation skips hidden subtrees assert_equals: expected Element node <input id="five" type="text"></input> but got Element node <input id="two" type="text"></input>
PASS Tab order navigation skips hidden subtrees

Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@

PASS one.getBoundingClientRect():
FAIL two.getBoundingClientRect(): assert_equals: y expected 3007 but got 3041
FAIL three.getBoundingClientRect(): assert_equals: y expected 3007 but got 3075
FAIL four.getBoundingClientRect(): assert_equals: y expected 3007 but got 3109
FAIL five.getBoundingClientRect(): assert_equals: y expected 3007 but got 3143
FAIL three.getBoundingClientRect(): assert_equals: y expected 3007 but got 3041
FAIL four.getBoundingClientRect(): assert_equals: y expected 3007 but got 3041
FAIL five.getBoundingClientRect(): assert_equals: y expected 3007 but got 3041

Original file line number Diff line number Diff line change
@@ -1,7 +1,3 @@





PASS c-v:hidden <img> layout APIs shouldn't return zero when accessed from script.

Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@



PASS <input type=image> should return nonzero values for width and height in a c-v:hidden subtree.

Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
Hello World!
Hello World Again!

PASS getBBox() should return nonzero values in a c-v:hidden subtree.

Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@

FAIL Basic usage assert_equals: Size containment with no last remembered size - clientWidth expected 1 but got 100
FAIL Last remembered size can be 0 assert_equals: Using last remembered size - clientWidth expected 0 but got 100
FAIL Last remembered size can be set to 0 after losing display:none assert_equals: Using the new last remembered size - clientWidth expected 0 but got 100
FAIL Last remembered size is logical assert_equals: Using last remembered size - clientWidth expected 100 but got 0
FAIL Last remembered size survives box destruction assert_equals: Still using last remembered size - clientWidth expected 100 but got 0
FAIL Last remembered size survives display type changes assert_equals: Using last remembered size - clientWidth expected 100 but got 0
FAIL Losing cis:auto removes last remembered size assert_equals: Basic size containment - clientWidth expected 0 but got 100
FAIL Losing cis:auto removes last remembered size even if size doesn't change assert_equals: Size containment with no last remembered size - clientWidth expected 1 but got 100
FAIL Losing cis:auto removes last remembered size immediately assert_equals: Basic size containment - clientWidth expected 0 but got 100
FAIL Losing cis:auto during display:none doesn't remove last remembered size assert_equals: Using last remembered size - clientWidth expected 100 but got 75
FAIL Lack of cis:auto during box creation removes last remembered size assert_equals: Using last remembered size - clientWidth expected 100 but got 75
FAIL Last remembered size can be removed synchronously assert_equals: Using last remembered size - clientWidth expected 100 but got 75
PASS Disconnected element can briefly keep last remembered size
FAIL Disconnected element ends up losing last remembered size assert_equals: Using last remembered size - clientWidth expected 100 but got 75
FAIL Disconnected element ends up losing last remembered size even if size was 0x0 assert_equals: Size containment with no last remembered size - clientWidth expected 1 but got 0
FAIL Last remembered size survives becoming inline assert_equals: Still using previous last remembered size - clientWidth expected 100 but got 0
FAIL Last remembered size can be set to 0x0 after losing display:inline assert_equals: Last remembered size is now 0x0 - clientWidth expected 0 but got 100
FAIL Basic usage assert_equals: Sizing normally - clientWidth expected 100 but got 1
FAIL Last remembered size can be 0 assert_equals: Using last remembered size - clientHeight expected 0 but got 2
FAIL Last remembered size can be set to 0 after losing display:none assert_equals: Sizing normally - clientWidth expected 100 but got 0
FAIL Last remembered size is logical assert_equals: Sizing normally - clientWidth expected 100 but got 0
FAIL Last remembered size survives box destruction assert_equals: Sizing normally - clientWidth expected 100 but got 0
FAIL Last remembered size survives display type changes assert_equals: Sizing normally - clientWidth expected 100 but got 0
FAIL Losing cis:auto removes last remembered size assert_equals: Sizing normally - clientWidth expected 100 but got 0
FAIL Losing cis:auto removes last remembered size even if size doesn't change assert_equals: Sizing normally - clientWidth expected 100 but got 0
FAIL Losing cis:auto removes last remembered size immediately assert_equals: Sizing normally - clientWidth expected 100 but got 0
FAIL Losing cis:auto during display:none doesn't remove last remembered size assert_equals: Sizing normally - clientWidth expected 100 but got 0
FAIL Lack of cis:auto during box creation removes last remembered size assert_equals: Sizing normally - clientWidth expected 100 but got 0
FAIL Last remembered size can be removed synchronously assert_equals: Sizing normally - clientWidth expected 100 but got 0
FAIL Disconnected element can briefly keep last remembered size assert_equals: Sizing normally - clientWidth expected 100 but got 0
FAIL Disconnected element ends up losing last remembered size assert_equals: Sizing normally - clientWidth expected 100 but got 0
PASS Disconnected element ends up losing last remembered size even if size was 0x0
FAIL Last remembered size survives becoming inline assert_equals: Still using previous last remembered size - clientWidth expected 100 but got 1
FAIL Last remembered size can be set to 0x0 after losing display:inline assert_equals: Last remembered size is now 0x0 - clientHeight expected 0 but got 2

Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@

FAIL Only recording last remembered inline size assert_equals: Using last remembered inline size - clientWidth expected 100 but got 0
FAIL Only recording last remembered block size assert_equals: Using last remembered block size - clientWidth expected 2 but got 0
FAIL Only recording last remembered inline size assert_equals: Using last remembered inline size - clientWidth expected 100 but got 2
FAIL Only recording last remembered block size assert_equals: Using last remembered block size - clientHeight expected 50 but got 1
FAIL contain:inline-size prevents recording last remembered inline size assert_equals: Size containment for inline axis - clientWidth expected 20 but got 0
FAIL contain:inline-size can keep previous last remembered inline size assert_equals: Size containment for inline axis - clientWidth expected 20 but got 0

Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@

FAIL Last remembered size supports multiple fragments assert_equals: Using last remembered size - fragment #1 width expected 50 but got 0
FAIL Last remembered size is updated when 2nd fragment changes size assert_equals: Using updated last remembered size - fragment #1 width expected 50 but got 0
FAIL Last remembered size supports multiple fragments assert_equals: Using last remembered size - fragment #1 height expected 150 but got 1
FAIL Last remembered size is updated when 2nd fragment changes size assert_equals: Using updated last remembered size - fragment #1 height expected 175 but got 1

Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@


PASS ensure onload happens

Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@


PASS ensure onload happens

3 changes: 2 additions & 1 deletion Source/WebCore/dom/Element.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -751,7 +751,8 @@ bool Element::isFocusable() const
// focusable as long as their canvas is displayed and visible.
if (auto* canvas = ancestorsOfType<HTMLCanvasElement>(*this).first())
return canvas->isFocusableWithoutResolvingFullStyle();
}
} else if (renderer()->isSkippedContent())
return false;

return isFocusableWithoutResolvingFullStyle();
}
Expand Down
3 changes: 3 additions & 0 deletions Source/WebCore/page/FrameView.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2600,6 +2600,9 @@ bool FrameView::scrollRectToVisible(const LayoutRect& absoluteRect, const Render
if (options.revealMode == SelectionRevealMode::DoNotReveal)
return false;

if (renderer.isSkippedContent())
return false;

auto* layer = renderer.enclosingLayer();
if (!layer)
return false;
Expand Down
2 changes: 1 addition & 1 deletion Source/WebCore/rendering/RenderBlock.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1134,7 +1134,7 @@ void RenderBlock::paintContents(PaintInfo& paintInfo, const LayoutPoint& paintOf
// Style is non-final if the element has a pending stylesheet before it. We end up with renderers with such styles if a script
// forces renderer construction by querying something layout dependent.
// Avoid FOUC by not painting. Switching to final style triggers repaint.
if (style().isNotFinal())
if (style().isNotFinal() || shouldSkipContent())
return;

if (childrenInline())
Expand Down
17 changes: 10 additions & 7 deletions Source/WebCore/rendering/RenderElement.h
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,9 @@ class RenderElement : public RenderObject {
if (style().visibility() != Visibility::Visible)
return false;

if (isSkippedContent())
return false;

if ((!hitTestRequest || !hitTestRequest->ignoreCSSPointerEventsProperty()) && style().effectivePointerEvents() == PointerEvents::None)
return false;

Expand Down Expand Up @@ -521,37 +524,37 @@ inline bool RenderElement::shouldApplySizeOrStyleContainment(bool containsAccord

inline bool RenderElement::shouldApplyLayoutContainment() const
{
return shouldApplyLayoutOrPaintContainment(style().containsLayout());
return shouldApplyLayoutOrPaintContainment(style().containsLayout() || style().contentVisibility() != ContentVisibility::Visible);
}

inline bool RenderElement::shouldApplyPaintContainment() const
{
return shouldApplyLayoutOrPaintContainment(style().containsPaint());
return shouldApplyLayoutOrPaintContainment(style().containsPaint() || style().contentVisibility() != ContentVisibility::Visible);
}

inline bool RenderElement::shouldApplyLayoutOrPaintContainment() const
{
return shouldApplyLayoutOrPaintContainment(style().containsLayoutOrPaint());
return shouldApplyLayoutOrPaintContainment(style().containsLayoutOrPaint() || style().contentVisibility() != ContentVisibility::Visible);
}

inline bool RenderElement::shouldApplySizeContainment() const
{
return shouldApplySizeOrStyleContainment(style().containsSize());
return shouldApplySizeOrStyleContainment(style().containsSize() || style().contentVisibility() == ContentVisibility::Hidden);
}

inline bool RenderElement::shouldApplyInlineSizeContainment() const
{
return shouldApplySizeOrStyleContainment(style().containsInlineSize());
return shouldApplySizeOrStyleContainment(style().containsInlineSize() || style().contentVisibility() == ContentVisibility::Hidden);
}

inline bool RenderElement::shouldApplySizeOrInlineSizeContainment() const
{
return shouldApplySizeOrStyleContainment(style().containsSizeOrInlineSize());
return shouldApplySizeOrStyleContainment(style().containsSizeOrInlineSize() || style().contentVisibility() == ContentVisibility::Hidden);
}

inline bool RenderElement::shouldApplyStyleContainment() const
{
return shouldApplySizeOrStyleContainment(style().containsStyle());
return shouldApplySizeOrStyleContainment(style().containsStyle() || style().contentVisibility() != ContentVisibility::Visible);
}

inline bool RenderElement::shouldApplyAnyContainment() const
Expand Down
2 changes: 1 addition & 1 deletion Source/WebCore/rendering/RenderLayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3389,7 +3389,7 @@ void RenderLayer::paintList(LayerList layerIterator, GraphicsContext& context, c
if (layerIterator.begin() == layerIterator.end())
return;

if (!hasSelfPaintingLayerDescendant())
if (!hasSelfPaintingLayerDescendant() || renderer().shouldSkipContent())
return;

#if ASSERT_ENABLED
Expand Down
3 changes: 2 additions & 1 deletion Source/WebCore/rendering/RenderLayerBacking.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1611,7 +1611,8 @@ void RenderLayerBacking::updateAfterDescendants()
m_graphicsLayer->setContentsOpaque(!m_hasSubpixelRounding && m_owningLayer.backgroundIsKnownToBeOpaqueInRect(compositedBounds()));
}

m_graphicsLayer->setContentsVisible(m_owningLayer.hasVisibleContent() || hasVisibleNonCompositedDescendants());
bool isSkippedContent = renderer().isSkippedContent();
m_graphicsLayer->setContentsVisible(!isSkippedContent && (m_owningLayer.hasVisibleContent() || hasVisibleNonCompositedDescendants()));
if (m_scrollContainerLayer) {
m_scrollContainerLayer->setContentsVisible(renderer().style().visibility() == Visibility::Visible);

Expand Down

0 comments on commit faf9ff8

Please sign in to comment.