Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: dace43e032d86999d6d06c321bd9fe671298166e
      
https://github.com/WebKit/WebKit/commit/dace43e032d86999d6d06c321bd9fe671298166e
  Author: Matt Woodrow <[email protected]>
  Date:   2025-09-22 (Mon, 22 Sep 2025)

  Changed paths:
    R LayoutTests/ipc/invalid-path-segments-crash-expected.txt
    R LayoutTests/ipc/invalid-path-segments-crash.html
    M Source/WTF/wtf/CallbackAggregator.h
    M Source/WebCore/Headers.cmake
    M Source/WebCore/WebCore.xcodeproj/project.pbxproj
    M Source/WebCore/page/RemoteFrameClient.h
    M Source/WebCore/page/RemoteFrameView.cpp
    M Source/WebCore/platform/graphics/displaylists/DisplayListItem.h
    M Source/WebCore/platform/graphics/displaylists/DisplayListItems.cpp
    M Source/WebCore/platform/graphics/displaylists/DisplayListItems.h
    M Source/WebCore/platform/graphics/displaylists/DisplayListRecorderImpl.cpp
    M Source/WebCore/platform/graphics/displaylists/DisplayListRecorderImpl.h
    M Source/WebKit/CMakeLists.txt
    M Source/WebKit/DerivedSources-input.xcfilelist
    M Source/WebKit/DerivedSources-output.xcfilelist
    M Source/WebKit/DerivedSources.make
    M Source/WebKit/GPUProcess/GPUProcess.cpp
    M Source/WebKit/GPUProcess/GPUProcess.h
    M Source/WebKit/GPUProcess/GPUProcess.messages.in
    A Source/WebKit/GPUProcess/graphics/RemoteDisplayListRecorder.messages.in
    M Source/WebKit/GPUProcess/graphics/RemoteGraphicsContext.h
    M Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.cpp
    M Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.h
    M Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.messages.in
    A Source/WebKit/GPUProcess/graphics/RemoteSnapshot.cpp
    A Source/WebKit/GPUProcess/graphics/RemoteSnapshot.h
    A Source/WebKit/GPUProcess/graphics/RemoteSnapshotDisplayListIdentifier.h
    A Source/WebKit/GPUProcess/graphics/RemoteSnapshotIdentifier.h
    A Source/WebKit/GPUProcess/graphics/RemoteSnapshotRecorder.cpp
    A Source/WebKit/GPUProcess/graphics/RemoteSnapshotRecorder.h
    A Source/WebKit/GPUProcess/graphics/RemoteSnapshotRecorder.messages.in
    A Source/WebKit/GPUProcess/graphics/RemoteSnapshotRecorderIdentifier.h
    M Source/WebKit/Platform/IPC/ObjectIdentifierReference.serialization.in
    M Source/WebKit/Scripts/webkit/messages.py
    M Source/WebKit/Scripts/webkit/tests/MessageArgumentDescriptions.cpp
    M Source/WebKit/Shared/WTFArgumentCoders.serialization.in
    M Source/WebKit/Sources.txt
    M Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm
    M Source/WebKit/UIProcess/Cocoa/GPUProcessProxyCocoa.mm
    M Source/WebKit/UIProcess/GPU/GPUProcessProxy.cpp
    M Source/WebKit/UIProcess/GPU/GPUProcessProxy.h
    M Source/WebKit/UIProcess/GPU/GPUProcessProxy.messages.in
    M Source/WebKit/UIProcess/WebPageProxy.cpp
    M Source/WebKit/UIProcess/WebPageProxy.h
    M Source/WebKit/UIProcess/WebPageProxy.messages.in
    M Source/WebKit/WebKit.xcodeproj/project.pbxproj
    M Source/WebKit/WebProcess/GPU/graphics/RemoteGraphicsContextProxy.cpp
    M Source/WebKit/WebProcess/GPU/graphics/RemoteGraphicsContextProxy.h
    M Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.cpp
    M Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.h
    A Source/WebKit/WebProcess/GPU/graphics/RemoteSnapshotRecorderProxy.cpp
    A Source/WebKit/WebProcess/GPU/graphics/RemoteSnapshotRecorderProxy.h
    M Source/WebKit/WebProcess/WebCoreSupport/WebPermissionController.cpp
    M Source/WebKit/WebProcess/WebCoreSupport/WebRemoteFrameClient.cpp
    M Source/WebKit/WebProcess/WebCoreSupport/WebRemoteFrameClient.h
    M Source/WebKit/WebProcess/WebPage/Cocoa/WebPageCocoa.mm
    M Source/WebKit/WebProcess/WebPage/WebPage.cpp
    M Source/WebKit/WebProcess/WebPage/WebPage.h
    M Source/WebKit/WebProcess/WebPage/WebPage.messages.in

  Log Message:
  -----------
  [Site isolation] Save As PDF does not render site isolated iframes
https://bugs.webkit.org/show_bug.cgi?id=282664
rdar://139325001

Reviewed by Kimmo Kinnunen.

Changes the DrawRemoteToPDF triangle IPC (UI -> WCP -> GPUP -> UI) into two IPC
calls with async reply:

WebPage::DrawToSnapshot(UI <-> WCP)  which builds a cross-process snapshot (as a
set of DisplayLists) in the GPUP and returns once this is fully available.

GPUProcess::sinkSnapshotToPDF (UI <-> GPUP) which consumes a snapshot object and
converts it into a SharedBuffer to return. We have the option to add other
versions of this which sink into a bitmap instead.

Using these lets us take advantage of the existing async reply handlers, where a
process crash will cause the handlers to be resolved. This should mean that we
always resolve the pending PDF generation, even if child process crashes.

Uses the newly available RemoteDisplayListRecorderProxy, and creates a
snapshotting specific subclass RemoteSnapshotRecorderProxy.  This directly
generates GPUP display lists, (including recording placeholder items for remote
subframes) while drawing the WCP content, and then a new API
sinkSnapshotRecorderIntoSnapshotFrame to transfer that display list into the
GPU's snapshot object.

When painting encounters a remote frame it requests that frame to also create a
GPUP display list to be included into the same snapshot. The outer frame records
a DrawPlaceholder command as a placeholder for the inner frame's display list.
This is only exposed on the snapshot recorder, since it has no meaning for a
generic GraphicsContext.

All functions return an async callback, and a new callback aggregator is
introduced so that we don't resolve back to the UI process until all involved
frames have had a confirmed response from the GPUP.

On the GPUP side, we store all the accumulated display lists in a
'RemoteSnapshot' object, accessed from the main thread. The DisplayList type
isn't properly threadsafe, but should work correctly since the causes of races
(like mutating Font or Gradient) only happen in the web process, never in the
GPUP versions of these. We do unfortunately have to track the work queue that
these display lists were created on, so that we can dispatch them back for
destruction. A truly threadsafe DisplayList would simplify this code immensely.

Removed old crashtest that was specific to the old WebProcess -> GPU
drawRemoteToPDF (and ImageBufferDisplayListBackend usage), which isn't possible
with the new API.

* Source/WTF/wtf/CallbackAggregator.h:
(WTF::SuccessCallbackAggregatorOnThread::create):
(WTF::SuccessCallbackAggregatorOnThread::~SuccessCallbackAggregatorOnThread):
(WTF::SuccessCallbackAggregatorOnThread::failed):
(WTF::SuccessCallbackAggregatorOnThread::CompletionHandler<void):
(WTF::SuccessCallbackAggregatorOnThread::SuccessCallbackAggregatorOnThread):
* Source/WebCore/Headers.cmake:
* Source/WebCore/WebCore.xcodeproj/project.pbxproj:
* Source/WebCore/page/RemoteFrameClient.h:
* Source/WebCore/page/RemoteFrameView.cpp:
(WebCore::RemoteFrameView::paintContents):
* Source/WebCore/platform/graphics/displaylists/DisplayListItem.h:
* Source/WebCore/platform/graphics/displaylists/DisplayListItems.cpp:
(WebCore::DisplayList::DrawPlaceholder::DrawPlaceholder):
(WebCore::DisplayList::DrawPlaceholder::apply const):
(WebCore::DisplayList::DrawPlaceholder::dump const):
* Source/WebCore/platform/graphics/displaylists/DisplayListItems.h:
* Source/WebCore/platform/graphics/displaylists/DisplayListRecorderImpl.cpp:
(WebCore::DisplayList::RecorderImpl::drawPlaceholder):
* Source/WebCore/platform/graphics/displaylists/DisplayListRecorderImpl.h:
* Source/WebKit/CMakeLists.txt:
* Source/WebKit/DerivedSources-input.xcfilelist:
* Source/WebKit/DerivedSources-output.xcfilelist:
* Source/WebKit/DerivedSources.make:
* Source/WebKit/GPUProcess/GPUProcess.cpp:
(WebKit::GPUProcess::getOrCreateSnapshot):
(WebKit::GPUProcess::sinkCompletedSnapshotToPDF):
(WebKit::GPUProcess::releaseSnapshot):
(WebKit::GPUProcess::didDrawRemoteToPDF): Deleted.
* Source/WebKit/GPUProcess/GPUProcess.h:
* Source/WebKit/GPUProcess/GPUProcess.messages.in:
* Source/WebKit/GPUProcess/graphics/RemoteDisplayListRecorder.messages.in: 
Copied from Source/WebKit/UIProcess/GPU/GPUProcessProxy.messages.in.
* Source/WebKit/GPUProcess/graphics/RemoteGraphicsContext.h:
* Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.cpp:
(WebKit::RemoteRenderingBackend::createSnapshotRecorder):
(WebKit::RemoteRenderingBackend::sinkSnapshotRecorderIntoSnapshotFrame):
(WebKit::RemoteRenderingBackend::didDrawRemoteToPDF): Deleted.
* Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.h:
* Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.messages.in:
* Source/WebKit/GPUProcess/graphics/RemoteSnapshot.cpp: Added.
(WebKit::RemoteSnapshot::create):
(WebKit::RemoteSnapshot::addFrameReference):
(WebKit::RemoteSnapshot::setFrame):
(WebKit::RemoteSnapshot::applyFrame const):
(WebKit::RemoteSnapshot::isComplete const):
(WebKit::RemoteSnapshot::DisplayListAndReleaseDispatcher::DisplayListAndReleaseDispatcher):
(WebKit::RemoteSnapshot::DisplayListAndReleaseDispatcher::~DisplayListAndReleaseDispatcher):
(WebKit::RemoteSnapshot::drawToPDF):
* Source/WebKit/GPUProcess/graphics/RemoteSnapshot.h: Added.
* Source/WebKit/GPUProcess/graphics/RemoteSnapshotDisplayListIdentifier.h: 
Added.
* Source/WebKit/GPUProcess/graphics/RemoteSnapshotIdentifier.h: Added.
* Source/WebKit/GPUProcess/graphics/RemoteSnapshotRecorder.cpp: Added.
(WebKit::RemoteSnapshotRecorder::create):
(WebKit::RemoteSnapshotRecorder::RemoteSnapshotRecorder):
(WebKit::RemoteSnapshotRecorder::startListeningForIPC):
(WebKit::RemoteSnapshotRecorder::stopListeningForIPC):
(WebKit::RemoteSnapshotRecorder::snapshot const):
(WebKit::RemoteSnapshotRecorder::drawSnapshotFrame):
* Source/WebKit/GPUProcess/graphics/RemoteSnapshotRecorder.h: Added.
* Source/WebKit/GPUProcess/graphics/RemoteSnapshotRecorder.messages.in: Copied 
from Source/WebKit/UIProcess/GPU/GPUProcessProxy.messages.in.
* Source/WebKit/GPUProcess/graphics/RemoteSnapshotRecorderIdentifier.h: Added.
* 
Source/WebKit/GPUProcess/webrtc/RemoteAudioMediaStreamTrackRendererInternalUnitManager.cpp:
(WebKit::RemoteAudioMediaStreamTrackRendererInternalUnitManagerUnit::RemoteAudioMediaStreamTrackRendererInternalUnitManagerUnit):
* Source/WebKit/Platform/IPC/ObjectIdentifierReference.serialization.in:
* Source/WebKit/Scripts/webkit/messages.py:
(atomic_object_identifier):
(serialized_identifiers):
* Source/WebKit/Scripts/webkit/tests/MessageArgumentDescriptions.cpp:
(IPC::serializedIdentifiers):
* Source/WebKit/Shared/WTFArgumentCoders.serialization.in:
* Source/WebKit/Sources.txt:
* Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm:
(-[WKWebView createPDFWithConfiguration:completionHandler:]):
* Source/WebKit/UIProcess/Cocoa/GPUProcessProxyCocoa.mm:
(WebKit::GPUProcessProxy::sinkCompletedSnapshotToPDF):
* Source/WebKit/UIProcess/GPU/GPUProcessProxy.cpp:
(WebKit::GPUProcessProxy::releaseSnapshot):
(WebKit::GPUProcessProxy::didDrawRemoteToPDF): Deleted.
* Source/WebKit/UIProcess/GPU/GPUProcessProxy.h:
* Source/WebKit/UIProcess/GPU/GPUProcessProxy.messages.in:
* Source/WebKit/UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::drawToPDF):
(WebKit::WebPageProxy::drawFrameToSnapshot):
(WebKit::WebPageProxy::drawRemoteToPDF): Deleted.
(WebKit::WebPageProxy::didDrawRemoteToPDF): Deleted.
* Source/WebKit/UIProcess/WebPageProxy.h:
* Source/WebKit/UIProcess/WebPageProxy.messages.in:
* Source/WebKit/WebKit.xcodeproj/project.pbxproj:
* Source/WebKit/WebProcess/GPU/graphics/RemoteGraphicsContextProxy.cpp:
* Source/WebKit/WebProcess/GPU/graphics/RemoteGraphicsContextProxy.h:
* Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.cpp:
(WebKit::RemoteRenderingBackendProxy::createSnapshotRecorder):
(WebKit::RemoteRenderingBackendProxy::sinkSnapshotRecorderIntoSnapshotFrame):
(WebKit::RemoteRenderingBackendProxy::didDrawRemoteToPDF): Deleted.
* Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.h:
* Source/WebKit/WebProcess/GPU/graphics/RemoteSnapshotRecorderProxy.cpp: Added.
(WebKit::RemoteSnapshotRecorderProxy::RemoteSnapshotRecorderProxy):
(WebKit::RemoteSnapshotRecorderProxy::drawSnapshotFrame):
* Source/WebKit/WebProcess/GPU/graphics/RemoteSnapshotRecorderProxy.h: Added.
(WebKit::RemoteSnapshotRecorderProxy::identifier const):
* Source/WebKit/WebProcess/WebCoreSupport/WebPermissionController.cpp:
(WebKit::WebPermissionController::query):
* Source/WebKit/WebProcess/WebCoreSupport/WebRemoteFrameClient.cpp:
(WebKit::WebRemoteFrameClient::paintContents):
* Source/WebKit/WebProcess/WebCoreSupport/WebRemoteFrameClient.h:
* Source/WebKit/WebProcess/WebPage/WebPage.cpp:
(WebKit::m_toolbarsAreVisible):
(WebKit::WebPage::~WebPage):
(WebKit::WebPage::executeEditingCommand):
(WebKit::WebPage::dumpHistoryForTesting):
(WebKit::WebPage::tryMarkLayersVolatile):
(WebKit::WebPage::updateIsInWindow):
(WebKit::WebPage::setActivityState):
(WebKit::WebPage::updatePreferences):
(WebKit::WebPage::drawToPDF):
(WebKit::WebPage::paintRemoteFrameContents):
(WebKit::WebPage::drawToSnapshot):
(WebKit::WebPage::drawFrameToSnapshot):
(WebKit::WebPage::insertTextAsync):
(WebKit::WebPage::didCommitLoad):
(WebKit::WebPage::updateWebsitePolicies):
(WebKit::WebPage::setIsNavigatingToAppBoundDomain):
(WebKit::WebPage::drawRemoteToPDF): Deleted.
* Source/WebKit/WebProcess/WebPage/WebPage.h:
* Source/WebKit/WebProcess/WebPage/WebPage.messages.in:

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



To unsubscribe from these emails, change your notification settings at 
https://github.com/WebKit/WebKit/settings/notifications
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to