Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 2c03fdfa8727a08843af973b6b7ddb5382ae0488
      
https://github.com/WebKit/WebKit/commit/2c03fdfa8727a08843af973b6b7ddb5382ae0488
  Author: Simon Fraser <[email protected]>
  Date:   2026-01-12 (Mon, 12 Jan 2026)

  Changed paths:
    M Source/WebCore/page/LocalFrameView.cpp
    M Source/WebCore/page/LocalFrameView.h
    M Source/WebCore/page/Page.cpp
    M Source/WebCore/page/Page.h
    M Source/WebKit/Shared/RemoteLayerTree/RemoteLayerBackingStore.mm
    M Source/WebKit/WebProcess/WebPage/DrawingArea.h
    M Source/WebKit/WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeContext.h
    M Source/WebKit/WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeContext.mm
    M 
Source/WebKit/WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.h
    M 
Source/WebKit/WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.mm
    M Source/WebKit/WebProcess/WebPage/WebPage.cpp

  Log Message:
  -----------
  Lots of CPU time under `traverseForPaintInvalidation`
https://bugs.webkit.org/show_bug.cgi?id=305246
rdar://165376215

Reviewed by Cameron McCormack.

The `traverseForPaintInvalidation()` call in question is the one called from
`LocalFrameView::invalidateImagesWithAsyncDecodes()`. Some debugging shows that 
there's a sequence of
events that can result in this getting called on every rendering update:
1. Either `RemoteLayerTreeDrawingArea::activityStateDidChange()` or 
`RemoteLayerTreeDrawingArea::dispatchAfterEnsuringDrawing()`
   are called; one way for this to happen is going into fullscreen, or tab 
switching.
2. They call `setNextRenderingUpdateRequiresSynchronousImageDecoding()` which 
sets state on the
   `RemoteLayerTreeContext`.
3. `Page::finalizeRenderingUpdateForRootFrame()` sees this bit and calls 
`invalidateImagesWithAsyncDecodes()`
   which does the `traverseForPaintInvalidation()`.

The problem is that the `m_nextRenderingUpdateRequiresSynchronousImageDecoding` 
flag on `RemoteLayerTreeContext`
remains true until some backing store paints, so if, after a tab switch, the 
page triggers lots of
rendering updates that don't involve painting, then we call 
`traverseForPaintInvalidation()` on each one for
no reason. This happens, for example, on a page with embedded YouTube videos.

This entire mechanism was added in 262585@main to avoid image decode flashing 
when we started to discard
image data in background tabs. However, 265328@main added logic to never async 
decode images which are visible
in the viewport, which made all of this logic redundant, so this PR simply 
removes it.

* Source/WebCore/page/LocalFrameView.cpp:
(WebCore::LocalFrameView::invalidateImagesWithAsyncDecodes): Deleted.
* Source/WebCore/page/LocalFrameView.h:
* Source/WebCore/page/Page.cpp:
(WebCore::Page::finalizeRenderingUpdateForRootFrame):
* Source/WebCore/page/Page.h:
* Source/WebKit/Shared/RemoteLayerTree/RemoteLayerBackingStore.mm:
(WebKit::RemoteLayerBackingStore::drawInContext):
* Source/WebKit/WebProcess/WebPage/DrawingArea.h:
(WebKit::DrawingArea::setNextRenderingUpdateRequiresSynchronousImageDecoding): 
Deleted.
* Source/WebKit/WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeContext.h:
(WebKit::RemoteLayerTreeContext::backingStoreCollection):
(WebKit::RemoteLayerTreeContext::setNextRenderingUpdateRequiresSynchronousImageDecoding):
 Deleted.
(WebKit::RemoteLayerTreeContext::nextRenderingUpdateRequiresSynchronousImageDecoding
 const): Deleted.
* Source/WebKit/WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeContext.mm:
(WebKit::RemoteLayerTreeContext::buildTransaction):
* Source/WebKit/WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.h:
* 
Source/WebKit/WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.mm:
(WebKit::RemoteLayerTreeDrawingArea::updateRendering):
(WebKit::RemoteLayerTreeDrawingArea::activityStateDidChange):
(WebKit::RemoteLayerTreeDrawingArea::dispatchAfterEnsuringDrawing):
(WebKit::RemoteLayerTreeDrawingArea::setNextRenderingUpdateRequiresSynchronousImageDecoding):
 Deleted.
* Source/WebKit/WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::willDestroyDecodedDataForAllImages):

Canonical link: https://commits.webkit.org/305476@main



To unsubscribe from these emails, change your notification settings at 
https://github.com/WebKit/WebKit/settings/notifications

Reply via email to