Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: a3488e2c4b49bd6eeb36474c4cdea2dbb66e8697
      
https://github.com/WebKit/WebKit/commit/a3488e2c4b49bd6eeb36474c4cdea2dbb66e8697
  Author: Said Abou-Hallawa <[email protected]>
  Date:   2024-12-19 (Thu, 19 Dec 2024)

  Changed paths:
    M Source/WebCore/Headers.cmake
    M Source/WebCore/WebCore.xcodeproj/project.pbxproj
    M Source/WebCore/platform/graphics/ImageBuffer.cpp
    M Source/WebCore/platform/graphics/ImageBuffer.h
    M Source/WebCore/platform/graphics/ImageBufferBackend.cpp
    M Source/WebCore/platform/graphics/ImageBufferBackend.h
    M Source/WebCore/platform/graphics/NullImageBufferBackend.h
    A Source/WebCore/platform/graphics/SnapshotIdentifier.h
    M Source/WebCore/platform/graphics/cg/ImageBufferCGBitmapBackend.cpp
    M Source/WebCore/platform/graphics/cg/ImageBufferCGBitmapBackend.h
    M Source/WebCore/platform/graphics/cg/ImageBufferCGPDFDocumentBackend.cpp
    M Source/WebCore/platform/graphics/cg/ImageBufferCGPDFDocumentBackend.h
    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/GPUProcess/GPUProcess.cpp
    M Source/WebKit/GPUProcess/GPUProcess.h
    M Source/WebKit/GPUProcess/graphics/RemoteDisplayListRecorder.cpp
    M Source/WebKit/GPUProcess/graphics/RemoteDisplayListRecorder.h
    M Source/WebKit/GPUProcess/graphics/RemoteDisplayListRecorder.messages.in
    M Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.cpp
    M Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.h
    M Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.messages.in
    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/DisplayListArgumentCoders.serialization.in
    M Source/WebKit/Shared/WTFArgumentCoders.serialization.in
    M Source/WebKit/Shared/WebCoreArgumentCoders.serialization.in
    M Source/WebKit/Sources.txt
    M Source/WebKit/UIProcess/API/Cocoa/WKWebView.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/WebKit.xcodeproj/project.pbxproj
    A 
Source/WebKit/WebProcess/GPU/graphics/ImageBufferRemotePDFDocumentBackend.cpp
    A 
Source/WebKit/WebProcess/GPU/graphics/ImageBufferRemotePDFDocumentBackend.h
    M Source/WebKit/WebProcess/GPU/graphics/RemoteDisplayListRecorderProxy.cpp
    M Source/WebKit/WebProcess/GPU/graphics/RemoteDisplayListRecorderProxy.h
    M Source/WebKit/WebProcess/GPU/graphics/RemoteImageBufferProxy.cpp
    M Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.cpp
    M Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.h
    M Source/WebKit/WebProcess/Model/ModelProcessModelPlayer.cpp
    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
    M Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm

  Log Message:
  -----------
  [Site isolation] Snapshotting should be composited in GPUProcess and sent 
directly to UIProcess
https://bugs.webkit.org/show_bug.cgi?id=284427
rdar://141254954

Reviewed by Matt Woodrow.

Site isolation puts a hard restriction on snapshotting. No WebContent process
is allowed to see the drawing of another remote frame drawing including the main
frame WebContent process. So the drawing of all frames will happen in GPUProcess
and the result will be sent directly to UIProcess.

The plan is to make all the remote frames draw their contents asynchronously 
into
separate DisplayLists in GPUProcess and then composite all these DisplayLists to
a PDFDocument or to an ShareableBitmap. This final result will sent directly to
UIProcess.

This PR is a step towards achieving this plan for site-isolation. In this PR the
main frame will be only snapshotted in GPUProcess and the result PDF 
SharedBuffer
will be sent to UIProcess.

The current workflow for PDF snapshotting when site-isolation = off is:

1. [WKWebView createPDFWithConfiguration] calls WebPageProxy::drawToPDF and 
sends
   a callback to be executed once WebProcess replies back.
2. WebPageProxy::drawToPDF sends the message WebPage::DrawToPDF to the main 
frame
   WebProcess.
3. WebPage::drawToPDF creates a local ImageBuffer with PDFDocument backend. Then
   it draws the main frame into this ImageBuffer.
4. Once the drawing is finished, the ImageBuffer is sunk into a SharedBuffer 
which
   holds the PDFDocument. The SharedBuffer is sent back to UIProcess through the
   completion handler.
5. UIProcess receives the ShareBuffer back from WebProcess and runs the callback
   which saves the returned buffer to an external file.

The new workflow for PDF snapshotting when site-isolation = on is:

1. [WKWebView createPDFWithConfiguration] calls 
WebPageProxy::drawCompositedToPDF()
   and sends a callback to be executed once WebProcess replies back.
2. WebPageProxy::drawCompositedToPDF() generates a new SnapshotIdentifier and 
adds
   the callback into the HashMap `m_pdfSnapshots` which is indexed by 
SnapshotIdentifier.
   Then it sends the message WebPage::DrawCompositedToPDF with 
SnapshotIdentifier.
3. WebPage::drawCompositedToPDF() creates a RemoteImageBufferProxy with 
PDFDocument
   backend. Then it draws the main frame into this ImageBuffer.
4. Once the drawing is finished, it sends 
RemoteRenderingBackend::DidDrawCompositedToPDF
   along with RenderingResourceIdentifier of the RemoteImageBuffer, the
   SnapshotIdentifier and the PageIdentifier
5. RemoteRenderingBackend::didDrawCompositedToPDF() gets the specified 
ImageBuffer
   and sinks to a PDFDocument. Then it calls 
GPUProcess::didDrawCompositedToPDF()
6. GPUProcess::didDrawCompositedToPDF() sends 
GPUProcessProxy::DidDrawCompositedToPDF
   with the SharedBuffer, the SnapshotIdentifier and the PageIdentifier.
7. GPUProcessProxy::didDrawCompositedToPDF() uses the PageIdentifier to find the
   sender WebPageProxy. Then it calls WebPageProxy::didDrawCompositedToPDF().
8. WebPageProxy::didDrawCompositedToPDF() gets the associated callback using the
   SnapshotIdentifier and runs it which saves the SharedBuffer into a file.

Drawing to PDF context in GPUProcess is done by:

1. The new backend ImageBufferRemotePDFDocumentBackend is added to act like a 
null
   backend for PDF snapshotting in the WebProcess.
2  RemoteRenderingBackendProxy will create an RemoteImageBufferProxy with this
   backend if renderingMode is PDFDocument.
3. The DisplayList items BeginPage and EndPage are added to record beginPage()
   and endPage() of GraphicsContext.
4. The RemoteDisplayListRecorder messages BeginPage and EndPage are added to
   record beginPage() and endPage() of GraphicsContext in GPUProcess.
5. The new message RemoteImageBuffer::SinkToPDFDocument is added which returns
   the PDF document as SharedBuffer.
6. Make RemoteImageBufferProxy implement the virtual method sinkToPDFDocument
   and make it send the sync message RemoteImageBuffer::SinkToPDFDocument.

* Source/WebCore/Headers.cmake:
* Source/WebCore/WebCore.xcodeproj/project.pbxproj:
* Source/WebCore/platform/graphics/ImageBuffer.cpp:
(WebCore::ImageBuffer::sinkIntoPDFDocument):
(WebCore::ImageBuffer::sinkToPDFDocument): Deleted.
* Source/WebCore/platform/graphics/ImageBuffer.h:
* Source/WebCore/platform/graphics/ImageBufferBackend.cpp:
(WebCore::ImageBufferBackend::calculateSafeBackendSize):
(WebCore::ImageBufferBackend::sinkIntoPDFDocument):
(WebCore::ImageBufferBackend::sinkToPDFDocument): Deleted.
* Source/WebCore/platform/graphics/ImageBufferBackend.h:
* Source/WebCore/platform/graphics/NullImageBufferBackend.h:
* Source/WebCore/platform/graphics/SnapshotIdentifier.h: Added.
* Source/WebCore/platform/graphics/cg/ImageBufferCGBitmapBackend.cpp:
(WebCore::ImageBufferCGBitmapBackend::calculateSafeBackendSize): Deleted.
* Source/WebCore/platform/graphics/cg/ImageBufferCGBitmapBackend.h:
* Source/WebCore/platform/graphics/cg/ImageBufferCGPDFDocumentBackend.cpp:
(WebCore::ImageBufferCGPDFDocumentBackend::sinkIntoPDFDocument):
(WebCore::ImageBufferCGPDFDocumentBackend::sinkToPDFDocument): Deleted.
* Source/WebCore/platform/graphics/cg/ImageBufferCGPDFDocumentBackend.h:
* Source/WebCore/platform/graphics/displaylists/DisplayListItem.h:
* Source/WebCore/platform/graphics/displaylists/DisplayListItems.cpp:
(WebCore::DisplayList::ClipToImageBuffer::apply const):
(WebCore::DisplayList::DrawImageBuffer::apply const):
(WebCore::DisplayList::BeginPage::apply const):
(WebCore::DisplayList::BeginPage::dump const):
(WebCore::DisplayList::EndPage::apply const):
* Source/WebCore/platform/graphics/displaylists/DisplayListItems.h:
(WebCore::DisplayList::BeginPage::BeginPage):
(WebCore::DisplayList::BeginPage::pageSize const):
(WebCore::DisplayList::EndPage::dump const):
* Source/WebCore/platform/graphics/displaylists/DisplayListRecorderImpl.cpp:
(WebCore::DisplayList::RecorderImpl::beginPage):
(WebCore::DisplayList::RecorderImpl::endPage):
* Source/WebCore/platform/graphics/displaylists/DisplayListRecorderImpl.h:
* Source/WebKit/GPUProcess/GPUProcess.cpp:
(WebKit::GPUProcess::didDrawCompositedToPDF):
* Source/WebKit/GPUProcess/GPUProcess.h:
* Source/WebKit/GPUProcess/graphics/RemoteDisplayListRecorder.cpp:
(WebKit::RemoteDisplayListRecorder::beginPage):
(WebKit::RemoteDisplayListRecorder::endPage):
* Source/WebKit/GPUProcess/graphics/RemoteDisplayListRecorder.h:
* Source/WebKit/GPUProcess/graphics/RemoteDisplayListRecorder.messages.in:
* Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.cpp:
(WebKit::RemoteRenderingBackend::didCreateImageBuffer):
(WebKit::RemoteRenderingBackend::didDrawCompositedToPDF):
(WebKit::allocateImageBufferInternal):
* Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.h:
* Source/WebKit/GPUProcess/graphics/RemoteRenderingBackend.messages.in:
* Source/WebKit/Platform/IPC/ObjectIdentifierReference.serialization.in:
* Source/WebKit/Scripts/webkit/messages.py:
(serialized_identifiers):
* Source/WebKit/Scripts/webkit/tests/MessageArgumentDescriptions.cpp:
(IPC::serializedIdentifiers):
* Source/WebKit/Shared/DisplayListArgumentCoders.serialization.in:
* Source/WebKit/Shared/WTFArgumentCoders.serialization.in:
* Source/WebKit/Shared/WebCoreArgumentCoders.serialization.in:
* Source/WebKit/Sources.txt:
* Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm:
(-[WKWebView createPDFWithConfiguration:completionHandler:]):
* Source/WebKit/UIProcess/GPU/GPUProcessProxy.cpp:
(WebKit::GPUProcessProxy::didDrawCompositedToPDF):
* Source/WebKit/UIProcess/GPU/GPUProcessProxy.h:
* Source/WebKit/UIProcess/GPU/GPUProcessProxy.messages.in:
* Source/WebKit/UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::drawCompositedToPDF):
(WebKit::WebPageProxy::didDrawCompositedToPDF):
* Source/WebKit/UIProcess/WebPageProxy.h:
* Source/WebKit/WebKit.xcodeproj/project.pbxproj:
* 
Source/WebKit/WebProcess/GPU/graphics/ImageBufferRemotePDFDocumentBackend.cpp: 
Added.
(WebKit::ImageBufferRemotePDFDocumentBackend::calculateBytesPerRow):
(WebKit::ImageBufferRemotePDFDocumentBackend::calculateMemoryCost):
(WebKit::ImageBufferRemotePDFDocumentBackend::create):
(WebKit::ImageBufferRemotePDFDocumentBackend::debugDescription const):
* Source/WebKit/WebProcess/GPU/graphics/ImageBufferRemotePDFDocumentBackend.h: 
Copied from Source/WebCore/platform/graphics/cg/ImageBufferCGBitmapBackend.h.
* Source/WebKit/WebProcess/GPU/graphics/RemoteDisplayListRecorderProxy.cpp:
(WebKit::RemoteDisplayListRecorderProxy::beginPage):
(WebKit::RemoteDisplayListRecorderProxy::endPage):
* Source/WebKit/WebProcess/GPU/graphics/RemoteDisplayListRecorderProxy.h:
* Source/WebKit/WebProcess/GPU/graphics/RemoteImageBufferProxy.cpp:
(WebKit::RemoteImageBufferProxy::didCreateBackend):
* Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.cpp:
(WebKit::RemoteRenderingBackendProxy::createImageBuffer):
(WebKit::RemoteRenderingBackendProxy::didDrawCompositedToPDF):
* Source/WebKit/WebProcess/GPU/graphics/RemoteRenderingBackendProxy.h:
* Source/WebKit/WebProcess/Model/ModelProcessModelPlayer.cpp:
* Source/WebKit/WebProcess/WebPage/Cocoa/WebPageCocoa.mm:
(WebKit::WebPage::pdfSnapshotAtSize):
* Source/WebKit/WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::drawMainFrameToPDF):
(WebKit::WebPage::drawToPDF):
(WebKit::WebPage::drawCompositedToPDF):
* Source/WebKit/WebProcess/WebPage/WebPage.h:
* Source/WebKit/WebProcess/WebPage/WebPage.messages.in:
* Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm:
(WebKit::WebPage::drawToPDFiOS):

Canonical link: https://commits.webkit.org/288138@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