[Webkit-unassigned] [Bug 264989] New: [content-visibility] REGRESSION(267547 at main): Blank panels on bing.com (content-visibility: auto)

bugzilla-daemon at webkit.org bugzilla-daemon at webkit.org
Thu Nov 16 15:55:33 PST 2023


https://bugs.webkit.org/show_bug.cgi?id=264989

            Bug ID: 264989
           Summary: [content-visibility] REGRESSION(267547 at main): Blank
                    panels on bing.com (content-visibility: auto)
           Product: WebKit
           Version: WebKit Nightly Build
          Hardware: Unspecified
                OS: Unspecified
            Status: NEW
          Keywords: InRadar
          Severity: Normal
          Priority: P2
         Component: Layout and Rendering
          Assignee: webkit-unassigned at lists.webkit.org
          Reporter: ntim at apple.com
                CC: bfulgham at webkit.org, rbuis at igalia.com,
                    simon.fraser at apple.com, zalan at apple.com

Created attachment 468635

  --> https://bugs.webkit.org/attachment.cgi?id=468635&action=review

Test reduction (from Alan Baradlay)

rdar://116822168

Some notes from Alan:

Layer content is not getting painted due to stale m_visibleDescendantStatusDirty on the “un-skipped” (scrolled back to viewport) self-painting layer’s parent layer.

RenderElement::styleWillChange’s willBeVisible branch needs some more involved dirty-ing

<div id=A style="content-visibility: auto">
  <div id=B style="position: relative;"></div>
</div>

1. When renderer (A) gets scrolled out, we call dirtyVisibleContentStatus() on its render layer (see RenderElement::styleWillChange) 
2. It triggers computeHasVisibleContent() call: we compute its visibility status ‘visible’ (note that renderer().isSkippedContent() is false as this is the root of the skipped content and not the actual skipped content)
3. we also compute renderer (B)’s layer’s visibility status. It’s hidden as it is a “skipped content”.
4. Now when renderer (A) gets scrolled back in, RenderElement::styleWillChange calls setHasVisibleContent on RenderLayer(A) but its m_hasVisibleContent is already true (see #2) so we early return (which makes RenderLayer (B) stay hidden).

The bug here is that when the content gets scrolled back in, and we get the RenderElement::styleWillChange() call on the content-visibility block (A), we treat it as if this layer was hidden (i.e. when it initially got scrolled out), but the layer (renderer) is not hidden at all, its subtree is. The current invalidation is not sufficient (and incorrect) and instead we should call dirtyVisibleContentStatus().

-- 
You are receiving this mail because:
You are the assignee for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.webkit.org/pipermail/webkit-unassigned/attachments/20231116/da202c22/attachment.htm>


More information about the webkit-unassigned mailing list