Title: [257667] trunk/Source/WebKit
Revision
257667
Author
jer.no...@apple.com
Date
2020-02-28 16:32:18 -0800 (Fri, 28 Feb 2020)

Log Message

[GPUP] Implement Modern EME API in the GPU Process
https://bugs.webkit.org/show_bug.cgi?id=208090

Reviewed by Alex Christensen.

IPC::SharedBufferDataReference is made more efficient by using the same encode/decode path as is used in
WebCoreArgumentCoders: the SharedBuffer is copied into shared memory, and only a handle is passed across
the XPC boundary. This requires existing users to handle receiving a IPC::SharedBufferDataHandle on the
remote side of the XPC boundary, but this is trivial, and many call sites require a SharedBuffer on the
remote side in the first place. This code could be improved by allowing the SharedMemory object be adopted
by the SharedBuffer object at creation time, potentially leading to zero-copy decoding, but is not done in
this patch.

* NetworkProcess/NetworkResourceLoader.cpp:
(WebKit::NetworkResourceLoader::bufferingTimerFired):
(WebKit::NetworkResourceLoader::sendBuffer):
* NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.cpp:
(WebKit::ServiceWorkerFetchTask::didReceiveData):
(WebKit::ServiceWorkerFetchTask::didReceiveSharedBuffer):
* NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.h:
* NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.messages.in:
* Platform/IPC/HandleMessage.h:
* Platform/IPC/SharedBufferDataReference.h:
(IPC::SharedBufferDataReference::SharedBufferDataReference):
(IPC::SharedBufferDataReference::buffer):
(IPC::SharedBufferDataReference::buffer const):
(IPC::SharedBufferDataReference::data const):
(IPC::SharedBufferDataReference::size const):
(IPC::SharedBufferDataReference::isEmpty const):
(IPC::SharedBufferDataReference::encode const):
(IPC::SharedBufferDataReference::decode):
* Shared/WebCoreArgumentCoders.cpp:
(IPC::ArgumentCoder<RefPtr<WebCore::SharedBuffer>>::encode):
(IPC::ArgumentCoder<RefPtr<WebCore::SharedBuffer>>::decode):
* Shared/WebCoreArgumentCoders.h:
* UIProcess/Cocoa/WebPageProxyCocoa.mm:
(WebKit::WebPageProxy::platformRegisterAttachment):
* UIProcess/WebPageProxy.cpp:
* UIProcess/WebPageProxy.h:
* UIProcess/WebPageProxy.messages.in:
* WebProcess/Automation/WebAutomationSessionProxy.cpp:
* WebProcess/Network/WebResourceLoader.cpp:
(WebKit::WebResourceLoader::didReceiveSharedBuffer):
(WebKit::WebResourceLoader::didReceiveData):
* WebProcess/Network/WebResourceLoader.h:
* WebProcess/Network/WebResourceLoader.messages.in:
* WebProcess/Storage/WebServiceWorkerFetchTaskClient.cpp:
(WebKit::WebServiceWorkerFetchTaskClient::didReceiveData):
(WebKit::WebServiceWorkerFetchTaskClient::didReceiveBlobChunk):
* WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:
(WebKit::WebFrameLoaderClient::finishedLoadingIcon):
* WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::getSelectionAsWebArchiveData):
(WebKit::WebPage::getWebArchiveOfFrame):
(WebKit::WebPage::drawPagesToPDF):
(WebKit::WebPage::urlSchemeTaskDidReceiveData):
(WebKit::WebPage::updateAttachmentAttributes):
* WebProcess/WebPage/WebPage.h:

Modified Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (257666 => 257667)


--- trunk/Source/WebKit/ChangeLog	2020-02-29 00:18:02 UTC (rev 257666)
+++ trunk/Source/WebKit/ChangeLog	2020-02-29 00:32:18 UTC (rev 257667)
@@ -1,3 +1,64 @@
+2020-02-28  Jer Noble  <jer.no...@apple.com>
+
+        [GPUP] Implement Modern EME API in the GPU Process
+        https://bugs.webkit.org/show_bug.cgi?id=208090
+
+        Reviewed by Alex Christensen.
+
+        IPC::SharedBufferDataReference is made more efficient by using the same encode/decode path as is used in
+        WebCoreArgumentCoders: the SharedBuffer is copied into shared memory, and only a handle is passed across
+        the XPC boundary. This requires existing users to handle receiving a IPC::SharedBufferDataHandle on the
+        remote side of the XPC boundary, but this is trivial, and many call sites require a SharedBuffer on the
+        remote side in the first place. This code could be improved by allowing the SharedMemory object be adopted
+        by the SharedBuffer object at creation time, potentially leading to zero-copy decoding, but is not done in
+        this patch.
+
+        * NetworkProcess/NetworkResourceLoader.cpp:
+        (WebKit::NetworkResourceLoader::bufferingTimerFired):
+        (WebKit::NetworkResourceLoader::sendBuffer):
+        * NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.cpp:
+        (WebKit::ServiceWorkerFetchTask::didReceiveData):
+        (WebKit::ServiceWorkerFetchTask::didReceiveSharedBuffer):
+        * NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.h:
+        * NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.messages.in:
+        * Platform/IPC/HandleMessage.h:
+        * Platform/IPC/SharedBufferDataReference.h:
+        (IPC::SharedBufferDataReference::SharedBufferDataReference):
+        (IPC::SharedBufferDataReference::buffer):
+        (IPC::SharedBufferDataReference::buffer const):
+        (IPC::SharedBufferDataReference::data const):
+        (IPC::SharedBufferDataReference::size const):
+        (IPC::SharedBufferDataReference::isEmpty const):
+        (IPC::SharedBufferDataReference::encode const):
+        (IPC::SharedBufferDataReference::decode):
+        * Shared/WebCoreArgumentCoders.cpp:
+        (IPC::ArgumentCoder<RefPtr<WebCore::SharedBuffer>>::encode):
+        (IPC::ArgumentCoder<RefPtr<WebCore::SharedBuffer>>::decode):
+        * Shared/WebCoreArgumentCoders.h:
+        * UIProcess/Cocoa/WebPageProxyCocoa.mm:
+        (WebKit::WebPageProxy::platformRegisterAttachment):
+        * UIProcess/WebPageProxy.cpp:
+        * UIProcess/WebPageProxy.h:
+        * UIProcess/WebPageProxy.messages.in:
+        * WebProcess/Automation/WebAutomationSessionProxy.cpp:
+        * WebProcess/Network/WebResourceLoader.cpp:
+        (WebKit::WebResourceLoader::didReceiveSharedBuffer):
+        (WebKit::WebResourceLoader::didReceiveData):
+        * WebProcess/Network/WebResourceLoader.h:
+        * WebProcess/Network/WebResourceLoader.messages.in:
+        * WebProcess/Storage/WebServiceWorkerFetchTaskClient.cpp:
+        (WebKit::WebServiceWorkerFetchTaskClient::didReceiveData):
+        (WebKit::WebServiceWorkerFetchTaskClient::didReceiveBlobChunk):
+        * WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:
+        (WebKit::WebFrameLoaderClient::finishedLoadingIcon):
+        * WebProcess/WebPage/WebPage.cpp:
+        (WebKit::WebPage::getSelectionAsWebArchiveData):
+        (WebKit::WebPage::getWebArchiveOfFrame):
+        (WebKit::WebPage::drawPagesToPDF):
+        (WebKit::WebPage::urlSchemeTaskDidReceiveData):
+        (WebKit::WebPage::updateAttachmentAttributes):
+        * WebProcess/WebPage/WebPage.h:
+
 2020-02-28  Adrian Perez de Castro  <ape...@igalia.com>
 
         Unreviewed non-unified soures builds fix.

Modified: trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp (257666 => 257667)


--- trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp	2020-02-29 00:18:02 UTC (rev 257666)
+++ trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp	2020-02-29 00:32:18 UTC (rev 257667)
@@ -950,7 +950,7 @@
     if (m_bufferedData->isEmpty())
         return;
 
-    send(Messages::WebResourceLoader::DidReceiveData({ *m_bufferedData }, m_bufferedDataEncodedDataLength));
+    send(Messages::WebResourceLoader::DidReceiveSharedBuffer({ *m_bufferedData }, m_bufferedDataEncodedDataLength));
 
     m_bufferedData = SharedBuffer::create();
     m_bufferedDataEncodedDataLength = 0;
@@ -960,7 +960,7 @@
 {
     ASSERT(!isSynchronous());
 
-    send(Messages::WebResourceLoader::DidReceiveData({ buffer }, encodedDataLength));
+    send(Messages::WebResourceLoader::DidReceiveSharedBuffer({ buffer }, encodedDataLength));
 }
 
 void NetworkResourceLoader::tryStoreAsCacheEntry()

Modified: trunk/Source/WebKit/NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.cpp (257666 => 257667)


--- trunk/Source/WebKit/NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.cpp	2020-02-29 00:18:02 UTC (rev 257666)
+++ trunk/Source/WebKit/NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.cpp	2020-02-29 00:32:18 UTC (rev 257667)
@@ -155,9 +155,18 @@
         return;
 
     ASSERT(!m_timeoutTimer.isActive());
-    sendToClient(Messages::WebResourceLoader::DidReceiveData { IPC::SharedBufferDataReference { data.data(), data.size() }, encodedDataLength });
+    sendToClient(Messages::WebResourceLoader::DidReceiveData { data, encodedDataLength });
 }
 
+void ServiceWorkerFetchTask::didReceiveSharedBuffer(const IPC::SharedBufferDataReference& data, int64_t encodedDataLength)
+{
+    if (m_isDone)
+        return;
+
+    ASSERT(!m_timeoutTimer.isActive());
+    sendToClient(Messages::WebResourceLoader::DidReceiveSharedBuffer { data, encodedDataLength });
+}
+
 void ServiceWorkerFetchTask::didReceiveFormData(const IPC::FormDataReference& formData)
 {
     if (m_isDone)

Modified: trunk/Source/WebKit/NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.h (257666 => 257667)


--- trunk/Source/WebKit/NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.h	2020-02-29 00:18:02 UTC (rev 257666)
+++ trunk/Source/WebKit/NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.h	2020-02-29 00:32:18 UTC (rev 257667)
@@ -44,6 +44,7 @@
 namespace IPC {
 class Connection;
 class DataReference;
+class SharedBufferDataReference;
 class Decoder;
 class FormDataReference;
 }
@@ -79,6 +80,7 @@
     void didReceiveRedirectResponse(WebCore::ResourceResponse&&);
     void didReceiveResponse(WebCore::ResourceResponse&&, bool needsContinueDidReceiveResponseMessage);
     void didReceiveData(const IPC::DataReference&, int64_t encodedDataLength);
+    void didReceiveSharedBuffer(const IPC::SharedBufferDataReference&, int64_t encodedDataLength);
     void didReceiveFormData(const IPC::FormDataReference&);
     void didFinish();
     void didFail(const WebCore::ResourceError&);

Modified: trunk/Source/WebKit/NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.messages.in (257666 => 257667)


--- trunk/Source/WebKit/NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.messages.in	2020-02-29 00:18:02 UTC (rev 257666)
+++ trunk/Source/WebKit/NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.messages.in	2020-02-29 00:32:18 UTC (rev 257667)
@@ -27,7 +27,8 @@
     DidFail(WebCore::ResourceError error)
     DidReceiveRedirectResponse(WebCore::ResourceResponse response)
     DidReceiveResponse(WebCore::ResourceResponse response, bool needsContinueDidReceiveResponseMessage)
-    DidReceiveData(IPC::SharedBufferDataReference data, int64_t encodedDataLength)
+    DidReceiveData(IPC::DataReference data, int64_t encodedDataLength)
+    DidReceiveSharedBuffer(IPC::SharedBufferDataReference data, int64_t encodedDataLength)
     DidReceiveFormData(IPC::FormDataReference data)
     DidFinish()
 }

Modified: trunk/Source/WebKit/Platform/IPC/HandleMessage.h (257666 => 257667)


--- trunk/Source/WebKit/Platform/IPC/HandleMessage.h	2020-02-29 00:18:02 UTC (rev 257666)
+++ trunk/Source/WebKit/Platform/IPC/HandleMessage.h	2020-02-29 00:32:18 UTC (rev 257667)
@@ -96,12 +96,6 @@
     typedef std::remove_const_t<std::remove_reference_t<T>> Type;
 };
 
-class DataReference;
-class SharedBufferDataReference;
-template<> struct CodingType<const SharedBufferDataReference&> {
-    typedef DataReference Type;
-};
-
 template<typename... Ts>
 struct CodingType<std::tuple<Ts...>> {
     typedef std::tuple<typename CodingType<Ts>::Type...> Type;

Modified: trunk/Source/WebKit/Platform/IPC/SharedBufferDataReference.h (257666 => 257667)


--- trunk/Source/WebKit/Platform/IPC/SharedBufferDataReference.h	2020-02-29 00:18:02 UTC (rev 257666)
+++ trunk/Source/WebKit/Platform/IPC/SharedBufferDataReference.h	2020-02-29 00:32:18 UTC (rev 257667)
@@ -25,9 +25,8 @@
 
 #pragma once
 
-#include "Encoder.h"
+#include "WebCoreArgumentCoders.h"
 #include <WebCore/SharedBuffer.h>
-#include <wtf/Variant.h>
 
 namespace IPC {
 
@@ -34,31 +33,37 @@
 class SharedBufferDataReference {
 public:
     SharedBufferDataReference() = default;
+    SharedBufferDataReference(RefPtr<WebCore::SharedBuffer>&& buffer) : m_buffer(WTFMove(buffer)) { }
+    SharedBufferDataReference(Ref<WebCore::SharedBuffer>&& buffer) : m_buffer(WTFMove(buffer)) { }
     SharedBufferDataReference(const WebCore::SharedBuffer& buffer)
-        : m_data(buffer) { }
-    SharedBufferDataReference(const uint8_t* data, size_t size)
-        : m_data(std::make_pair(data, size)) { }
+        : m_buffer(WebCore::SharedBuffer::create())
+    {
+        m_buffer->append(buffer);
+    }
 
+    RefPtr<WebCore::SharedBuffer>& buffer() { return m_buffer; }
+    const RefPtr<WebCore::SharedBuffer>& buffer() const { return m_buffer; }
+
+    const char* data() const { return m_buffer ? m_buffer->data() : nullptr; }
+    size_t size() const { return m_buffer ? m_buffer->size() : 0; }
+    bool isEmpty() const { return m_buffer ? m_buffer->isEmpty() : true; }
+
     void encode(Encoder& encoder) const
     {
-        switchOn(m_data,
-            [encoder = &encoder] (const Ref<const WebCore::SharedBuffer>& buffer) mutable {
-                uint64_t bufferSize = buffer->size();
-                encoder->reserve(bufferSize + sizeof(uint64_t));
-                *encoder << bufferSize;
-                for (const auto& element : buffer.get())
-                    encoder->encodeFixedLengthData(reinterpret_cast<const uint8_t*>(element.segment->data()), element.segment->size(), 1);
-            }, [encoder = &encoder] (const std::pair<const uint8_t*, size_t>& pair) mutable {
-                uint64_t bufferSize = pair.second;
-                encoder->reserve(bufferSize + sizeof(uint64_t));
-                *encoder << bufferSize;
-                encoder->encodeFixedLengthData(pair.first, pair.second, 1);
-            }
-        );
+        encoder << m_buffer;
     }
 
+    static Optional<SharedBufferDataReference> decode(Decoder& decoder)
+    {
+        Optional<RefPtr<WebCore::SharedBuffer>> buffer;
+        decoder >> buffer;
+        if (!buffer)
+            return WTF::nullopt;
+        return { WTFMove(*buffer) };
+    }
+
 private:
-    Variant<std::pair<const uint8_t*, size_t>, Ref<const WebCore::SharedBuffer>> m_data;
+    RefPtr<WebCore::SharedBuffer> m_buffer;
 };
 
 }

Modified: trunk/Source/WebKit/Shared/WebCoreArgumentCoders.cpp (257666 => 257667)


--- trunk/Source/WebKit/Shared/WebCoreArgumentCoders.cpp	2020-02-29 00:18:02 UTC (rev 257666)
+++ trunk/Source/WebKit/Shared/WebCoreArgumentCoders.cpp	2020-02-29 00:32:18 UTC (rev 257667)
@@ -3203,4 +3203,18 @@
 }
 #endif
 
+void ArgumentCoder<RefPtr<WebCore::SharedBuffer>>::encode(Encoder& encoder, const RefPtr<WebCore::SharedBuffer>& buffer)
+{
+    encodeSharedBuffer(encoder, buffer.get());
+}
+
+Optional<RefPtr<SharedBuffer>> ArgumentCoder<RefPtr<WebCore::SharedBuffer>>::decode(Decoder& decoder)
+{
+    RefPtr<SharedBuffer> buffer;
+    if (!decodeSharedBuffer(decoder, buffer))
+        return WTF::nullopt;
+
+    return buffer;
+}
+
 } // namespace IPC

Modified: trunk/Source/WebKit/Shared/WebCoreArgumentCoders.h (257666 => 257667)


--- trunk/Source/WebKit/Shared/WebCoreArgumentCoders.h	2020-02-29 00:18:02 UTC (rev 257666)
+++ trunk/Source/WebKit/Shared/WebCoreArgumentCoders.h	2020-02-29 00:32:18 UTC (rev 257667)
@@ -101,6 +101,7 @@
 class ResourceRequest;
 class ResourceResponse;
 class SecurityOrigin;
+class SharedBuffer;
 class SpringTimingFunction;
 class StepsTimingFunction;
 class StickyPositionViewportConstraints;
@@ -830,6 +831,11 @@
 };
 #endif
 
+template<> struct ArgumentCoder<RefPtr<WebCore::SharedBuffer>> {
+    static void encode(Encoder&, const RefPtr<WebCore::SharedBuffer>&);
+    static Optional<RefPtr<WebCore::SharedBuffer>> decode(Decoder&);
+};
+
 } // namespace IPC
 
 namespace WTF {

Modified: trunk/Source/WebKit/UIProcess/Cocoa/WebPageProxyCocoa.mm (257666 => 257667)


--- trunk/Source/WebKit/UIProcess/Cocoa/WebPageProxyCocoa.mm	2020-02-29 00:18:02 UTC (rev 257666)
+++ trunk/Source/WebKit/UIProcess/Cocoa/WebPageProxyCocoa.mm	2020-02-29 00:32:18 UTC (rev 257667)
@@ -33,6 +33,7 @@
 #import "PageClient.h"
 #import "SafeBrowsingSPI.h"
 #import "SafeBrowsingWarning.h"
+#import "SharedBufferDataReference.h"
 #import "WebPageMessages.h"
 #import "WebProcessProxy.h"
 #import "WebsiteDataStore.h"
@@ -183,13 +184,12 @@
 
 #if ENABLE(ATTACHMENT_ELEMENT)
 
-void WebPageProxy::platformRegisterAttachment(Ref<API::Attachment>&& attachment, const String& preferredFileName, const IPC::DataReference& dataReference)
+void WebPageProxy::platformRegisterAttachment(Ref<API::Attachment>&& attachment, const String& preferredFileName, const IPC::SharedBufferDataReference& dataReference)
 {
     if (dataReference.isEmpty())
         return;
 
-    auto buffer = SharedBuffer::create(dataReference.data(), dataReference.size());
-    auto fileWrapper = adoptNS([pageClient().allocFileWrapperInstance() initRegularFileWithContents:buffer->createNSData().autorelease()]);
+    auto fileWrapper = adoptNS([pageClient().allocFileWrapperInstance() initRegularFileWithContents:dataReference.buffer()->createNSData().autorelease()]);
     [fileWrapper setPreferredFilename:preferredFileName];
     attachment->setFileWrapper(fileWrapper.get());
 }

Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.cpp (257666 => 257667)


--- trunk/Source/WebKit/UIProcess/WebPageProxy.cpp	2020-02-29 00:18:02 UTC (rev 257666)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.cpp	2020-02-29 00:32:18 UTC (rev 257667)
@@ -6917,13 +6917,13 @@
     callback->performCallback();
 }
 
-void WebPageProxy::dataCallback(const IPC::DataReference& dataReference, CallbackID callbackID)
+void WebPageProxy::dataCallback(const IPC::SharedBufferDataReference& dataReference, CallbackID callbackID)
 {
     auto callback = m_callbacks.take<DataCallback>(callbackID);
     if (!callback)
         return;
 
-    callback->performCallbackWithReturnValue(API::Data::create(dataReference.data(), dataReference.size()).ptr());
+    callback->performCallbackWithReturnValue(API::Data::create(reinterpret_cast<const uint8_t*>(dataReference.data()), dataReference.size()).ptr());
 }
 
 void WebPageProxy::boolCallback(bool result, CallbackID callbackID)
@@ -9092,7 +9092,7 @@
     });
 }
 
-void WebPageProxy::finishedLoadingIcon(CallbackID callbackID, const IPC::DataReference& data)
+void WebPageProxy::finishedLoadingIcon(CallbackID callbackID, const IPC::SharedBufferDataReference& data)
 {
     dataCallback(data, callbackID);
 }
@@ -9323,7 +9323,7 @@
     send(Messages::WebPage::UpdateAttachmentAttributes(attachment.identifier(), attachment.fileSizeForDisplay(), attachment.contentType(), attachment.fileName(), WTFMove(dataReference), callbackID));
 }
 
-void WebPageProxy::registerAttachmentIdentifierFromData(const String& identifier, const String& contentType, const String& preferredFileName, const IPC::DataReference& data)
+void WebPageProxy::registerAttachmentIdentifierFromData(const String& identifier, const String& contentType, const String& preferredFileName, const IPC::SharedBufferDataReference& data)
 {
     MESSAGE_CHECK(m_process, IdentifierToAttachmentMap::isValidKey(identifier));
 
@@ -9430,7 +9430,7 @@
 
 #if !PLATFORM(COCOA)
 
-void WebPageProxy::platformRegisterAttachment(Ref<API::Attachment>&&, const String&, const IPC::DataReference&)
+void WebPageProxy::platformRegisterAttachment(Ref<API::Attachment>&&, const String&, const IPC::SharedBufferDataReference&)
 {
 }
 

Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.h (257666 => 257667)


--- trunk/Source/WebKit/UIProcess/WebPageProxy.h	2020-02-29 00:18:02 UTC (rev 257666)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.h	2020-02-29 00:32:18 UTC (rev 257667)
@@ -194,6 +194,7 @@
 namespace IPC {
 class Decoder;
 class FormDataReference;
+class SharedBufferDataReference;
 }
 
 namespace WebCore {
@@ -1513,7 +1514,7 @@
     void didRestoreScrollPosition();
 
     void getLoadDecisionForIcon(const WebCore::LinkIcon&, WebKit::CallbackID);
-    void finishedLoadingIcon(WebKit::CallbackID, const IPC::DataReference&);
+    void finishedLoadingIcon(WebKit::CallbackID, const IPC::SharedBufferDataReference&);
 
     void setFocus(bool focused);
     void setWindowFrame(const WebCore::FloatRect&);
@@ -2014,7 +2015,7 @@
     void didReceiveEvent(uint32_t opaqueType, bool handled);
 
     void voidCallback(CallbackID);
-    void dataCallback(const IPC::DataReference&, CallbackID);
+    void dataCallback(const IPC::SharedBufferDataReference&, CallbackID);
     void imageCallback(const ShareableBitmap::Handle&, CallbackID);
     void boolCallback(bool result, CallbackID);
     void stringCallback(const String&, CallbackID);
@@ -2192,12 +2193,12 @@
     void stopAllURLSchemeTasks(WebProcessProxy* = nullptr);
 
 #if ENABLE(ATTACHMENT_ELEMENT)
-    void registerAttachmentIdentifierFromData(const String&, const String& contentType, const String& preferredFileName, const IPC::DataReference&);
+    void registerAttachmentIdentifierFromData(const String&, const String& contentType, const String& preferredFileName, const IPC::SharedBufferDataReference&);
     void registerAttachmentIdentifierFromFilePath(const String&, const String& contentType, const String& filePath);
     void registerAttachmentsFromSerializedData(Vector<WebCore::SerializedAttachmentData>&&);
     void cloneAttachmentData(const String& fromIdentifier, const String& toIdentifier);
 
-    void platformRegisterAttachment(Ref<API::Attachment>&&, const String& preferredFileName, const IPC::DataReference&);
+    void platformRegisterAttachment(Ref<API::Attachment>&&, const String& preferredFileName, const IPC::SharedBufferDataReference&);
     void platformRegisterAttachment(Ref<API::Attachment>&&, const String& filePath);
     void platformCloneAttachment(Ref<API::Attachment>&& fromAttachment, Ref<API::Attachment>&& toAttachment);
 

Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.messages.in (257666 => 257667)


--- trunk/Source/WebKit/UIProcess/WebPageProxy.messages.in	2020-02-29 00:18:02 UTC (rev 257666)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.messages.in	2020-02-29 00:32:18 UTC (rev 257667)
@@ -530,7 +530,7 @@
     DidRestoreScrollPosition()
 
     GetLoadDecisionForIcon(struct WebCore::LinkIcon icon, WebKit::CallbackID callbackID)
-    FinishedLoadingIcon(WebKit::CallbackID callbackID, IPC::DataReference data);
+    FinishedLoadingIcon(WebKit::CallbackID callbackID, IPC::SharedBufferDataReference data);
 
 #if PLATFORM(MAC)
     DidHandleAcceptedCandidate()

Modified: trunk/Source/WebKit/WebProcess/Automation/WebAutomationSessionProxy.cpp (257666 => 257667)


--- trunk/Source/WebKit/WebProcess/Automation/WebAutomationSessionProxy.cpp	2020-02-29 00:18:02 UTC (rev 257666)
+++ trunk/Source/WebKit/WebProcess/Automation/WebAutomationSessionProxy.cpp	2020-02-29 00:32:18 UTC (rev 257667)
@@ -37,6 +37,7 @@
 #include "WebPage.h"
 #include "WebProcess.h"
 #include <_javascript_Core/APICast.h>
+#include <_javascript_Core/Exception.h>
 #include <_javascript_Core/JSObject.h>
 #include <_javascript_Core/JSStringRefPrivate.h>
 #include <_javascript_Core/OpaqueJSString.h>

Modified: trunk/Source/WebKit/WebProcess/Network/WebResourceLoader.cpp (257666 => 257667)


--- trunk/Source/WebKit/WebProcess/Network/WebResourceLoader.cpp	2020-02-29 00:18:02 UTC (rev 257666)
+++ trunk/Source/WebKit/WebProcess/Network/WebResourceLoader.cpp	2020-02-29 00:32:18 UTC (rev 257667)
@@ -26,11 +26,11 @@
 #include "config.h"
 #include "WebResourceLoader.h"
 
-#include "DataReference.h"
 #include "FormDataReference.h"
 #include "Logging.h"
 #include "NetworkProcessConnection.h"
 #include "NetworkResourceLoaderMessages.h"
+#include "SharedBufferDataReference.h"
 #include "WebCoreArgumentCoders.h"
 #include "WebErrors.h"
 #include "WebFrame.h"
@@ -190,27 +190,47 @@
     m_coreLoader->didReceiveResponse(response, WTFMove(policyDecisionCompletionHandler));
 }
 
-void WebResourceLoader::didReceiveData(const IPC::DataReference& data, int64_t encodedDataLength)
+void WebResourceLoader::didReceiveSharedBuffer(IPC::SharedBufferDataReference&& data, int64_t encodedDataLength)
 {
+    LOG(Network, "(WebProcess) WebResourceLoader::didReceiveSharedBuffer of size %lu for '%s'", data.size(), m_coreLoader->url().string().latin1().data());
+    ASSERT_WITH_MESSAGE(!m_isProcessingNetworkResponse, "Network process should not send data until we've validated the response");
+
+    if (UNLIKELY(m_interceptController.isIntercepting(m_coreLoader->identifier()))) {
+        deferReceivingSharedBuffer(WTFMove(data), encodedDataLength);
+        return;
+    }
+
+    processReceivedData(reinterpret_cast<const char*>(data.data()), data.size(), encodedDataLength);
+}
+
+void WebResourceLoader::didReceiveData(IPC::DataReference&& data, int64_t encodedDataLength)
+{
     LOG(Network, "(WebProcess) WebResourceLoader::didReceiveData of size %lu for '%s'", data.size(), m_coreLoader->url().string().latin1().data());
     ASSERT_WITH_MESSAGE(!m_isProcessingNetworkResponse, "Network process should not send data until we've validated the response");
 
     if (UNLIKELY(m_interceptController.isIntercepting(m_coreLoader->identifier()))) {
-        auto buffer = WebCore::SharedBuffer::create(data.data(), data.size());
-        m_interceptController.defer(m_coreLoader->identifier(), [this, protectedThis = makeRef(*this), buffer = WTFMove(buffer), encodedDataLength]() mutable {
-            IPC::DataReference data(reinterpret_cast<const uint8_t*>(buffer->data()), buffer->size());
-            if (m_coreLoader)
-                didReceiveData(data, encodedDataLength);
-        });
+        deferReceivingSharedBuffer({ WebCore::SharedBuffer::create(data.data(), data.size()) }, encodedDataLength);
         return;
     }
+    processReceivedData(reinterpret_cast<const char*>(data.data()), data.size(), encodedDataLength);
+}
 
+void WebResourceLoader::deferReceivingSharedBuffer(IPC::SharedBufferDataReference&& data, int64_t encodedDataLength)
+{
+    m_interceptController.defer(m_coreLoader->identifier(), [this, protectedThis = makeRef(*this), data = "" encodedDataLength]() mutable {
+        if (m_coreLoader)
+            didReceiveSharedBuffer(WTFMove(data), encodedDataLength);
+    });
+}
+
+void WebResourceLoader::processReceivedData(const char* data, size_t size, int64_t encodedDataLength)
+{
     if (!m_numBytesReceived) {
         RELEASE_LOG_IF_ALLOWED("didReceiveData: Started receiving data");
     }
-    m_numBytesReceived += data.size();
+    m_numBytesReceived += size;
 
-    m_coreLoader->didReceiveData(reinterpret_cast<const char*>(data.data()), data.size(), encodedDataLength, DataPayloadBytes);
+    m_coreLoader->didReceiveData(data, size, encodedDataLength, DataPayloadBytes);
 }
 
 void WebResourceLoader::didFinishResourceLoad(const NetworkLoadMetrics& networkLoadMetrics)

Modified: trunk/Source/WebKit/WebProcess/Network/WebResourceLoader.h (257666 => 257667)


--- trunk/Source/WebKit/WebProcess/Network/WebResourceLoader.h	2020-02-29 00:18:02 UTC (rev 257666)
+++ trunk/Source/WebKit/WebProcess/Network/WebResourceLoader.h	2020-02-29 00:32:18 UTC (rev 257667)
@@ -36,7 +36,7 @@
 #include <wtf/RefPtr.h>
 
 namespace IPC {
-class DataReference;
+class SharedBufferDataReference;
 class FormDataReference;
 }
 
@@ -83,7 +83,8 @@
     void willSendRequest(WebCore::ResourceRequest&&, IPC::FormDataReference&& requestBody, WebCore::ResourceResponse&&);
     void didSendData(uint64_t bytesSent, uint64_t totalBytesToBeSent);
     void didReceiveResponse(const WebCore::ResourceResponse&, bool needsContinueDidReceiveResponseMessage);
-    void didReceiveData(const IPC::DataReference&, int64_t encodedDataLength);
+    void didReceiveData(IPC::DataReference&&, int64_t encodedDataLength);
+    void didReceiveSharedBuffer(IPC::SharedBufferDataReference&&, int64_t encodedDataLength);
     void didFinishResourceLoad(const WebCore::NetworkLoadMetrics&);
     void didFailResourceLoad(const WebCore::ResourceError&);
     void didFailServiceWorkerLoad(const WebCore::ResourceError&);
@@ -92,6 +93,9 @@
 
     void stopLoadingAfterXFrameOptionsOrContentSecurityPolicyDenied(const WebCore::ResourceResponse&);
 
+    void deferReceivingSharedBuffer(IPC::SharedBufferDataReference&&, int64_t encodedDataLength);
+    void processReceivedData(const char*, size_t length, int64_t encodedDataLength);
+
 #if ENABLE(SHAREABLE_RESOURCE)
     void didReceiveResource(const ShareableResource::Handle&);
 #endif

Modified: trunk/Source/WebKit/WebProcess/Network/WebResourceLoader.messages.in (257666 => 257667)


--- trunk/Source/WebKit/WebProcess/Network/WebResourceLoader.messages.in	2020-02-29 00:18:02 UTC (rev 257666)
+++ trunk/Source/WebKit/WebProcess/Network/WebResourceLoader.messages.in	2020-02-29 00:32:18 UTC (rev 257667)
@@ -24,7 +24,8 @@
     WillSendRequest(WebCore::ResourceRequest request, IPC::FormDataReference requestBody, WebCore::ResourceResponse redirectResponse)
     DidSendData(uint64_t bytesSent, uint64_t totalBytesToBeSent)
     DidReceiveResponse(WebCore::ResourceResponse response, bool needsContinueDidReceiveResponseMessage)
-    DidReceiveData(IPC::SharedBufferDataReference data, int64_t encodedDataLength)
+    DidReceiveData(IPC::DataReference data, int64_t encodedDataLength)
+    DidReceiveSharedBuffer(IPC::SharedBufferDataReference data, int64_t encodedDataLength)
     DidFinishResourceLoad(WebCore::NetworkLoadMetrics networkLoadMetrics)
     DidFailResourceLoad(WebCore::ResourceError error)
     DidFailServiceWorkerLoad(WebCore::ResourceError error)

Modified: trunk/Source/WebKit/WebProcess/Storage/WebServiceWorkerFetchTaskClient.cpp (257666 => 257667)


--- trunk/Source/WebKit/WebProcess/Storage/WebServiceWorkerFetchTaskClient.cpp	2020-02-29 00:18:02 UTC (rev 257666)
+++ trunk/Source/WebKit/WebProcess/Storage/WebServiceWorkerFetchTaskClient.cpp	2020-02-29 00:32:18 UTC (rev 257667)
@@ -84,7 +84,7 @@
         return;
     }
 
-    m_connection->send(Messages::ServiceWorkerFetchTask::DidReceiveData { buffer.get(), static_cast<int64_t>(buffer->size()) }, m_fetchIdentifier);
+    m_connection->send(Messages::ServiceWorkerFetchTask::DidReceiveSharedBuffer { buffer.get(), static_cast<int64_t>(buffer->size()) }, m_fetchIdentifier);
 }
 
 void WebServiceWorkerFetchTaskClient::didReceiveFormDataAndFinish(Ref<FormData>&& formData)

Modified: trunk/Source/WebKit/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp (257666 => 257667)


--- trunk/Source/WebKit/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp	2020-02-29 00:18:02 UTC (rev 257666)
+++ trunk/Source/WebKit/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp	2020-02-29 00:32:18 UTC (rev 257667)
@@ -40,6 +40,7 @@
 #include "NetworkConnectionToWebProcessMessages.h"
 #include "NetworkProcessConnection.h"
 #include "PluginView.h"
+#include "SharedBufferDataReference.h"
 #include "UserData.h"
 #include "WKBundleAPICast.h"
 #include "WebAutomationSessionProxy.h"
@@ -1925,9 +1926,9 @@
     auto callbackID = CallbackID::fromInteger(callbackIdentifier);
     if (WebPage* webPage { m_frame->page() }) {
         if (data)
-            webPage->send(Messages::WebPageProxy::FinishedLoadingIcon(callbackID, { reinterpret_cast<const uint8_t*>(data->data()), data->size() }));
+            webPage->send(Messages::WebPageProxy::FinishedLoadingIcon(callbackID, { *data }));
         else
-            webPage->send(Messages::WebPageProxy::FinishedLoadingIcon(callbackID, { nullptr, 0 }));
+            webPage->send(Messages::WebPageProxy::FinishedLoadingIcon(callbackID, { }));
     }
 }
 

Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp (257666 => 257667)


--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp	2020-02-29 00:18:02 UTC (rev 257666)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp	2020-02-29 00:32:18 UTC (rev 257667)
@@ -3515,7 +3515,7 @@
     IPC::SharedBufferDataReference dataReference;
 #if PLATFORM(COCOA)
     if (data)
-        dataReference = { CFDataGetBytePtr(data.get()), static_cast<size_t>(CFDataGetLength(data.get())) };
+        dataReference = SharedBuffer::create(data.get());
 #endif
     send(Messages::WebPageProxy::DataCallback(dataReference, callbackID));
 }
@@ -3596,7 +3596,7 @@
     IPC::SharedBufferDataReference dataReference;
 #if PLATFORM(COCOA)
     if (data)
-        dataReference = { CFDataGetBytePtr(data.get()), static_cast<size_t>(CFDataGetLength(data.get())) };
+        dataReference = SharedBuffer::create(data.get());
 #endif
     send(Messages::WebPageProxy::DataCallback(dataReference, callbackID));
 }
@@ -4936,7 +4936,7 @@
 {
     RetainPtr<CFMutableDataRef> pdfPageData;
     drawPagesToPDFImpl(frameID, printInfo, first, count, pdfPageData);
-    send(Messages::WebPageProxy::DataCallback({ CFDataGetBytePtr(pdfPageData.get()), static_cast<size_t>(CFDataGetLength(pdfPageData.get())) }, callbackID));
+    send(Messages::WebPageProxy::DataCallback({ SharedBuffer::create(pdfPageData.get()) }, callbackID));
 }
 
 void WebPage::drawPagesToPDFImpl(FrameIdentifier frameID, const PrintInfo& printInfo, uint32_t first, uint32_t count, RetainPtr<CFMutableDataRef>& pdfPageData)
@@ -6581,12 +6581,12 @@
     handler->taskDidReceiveResponse(taskIdentifier, response);
 }
 
-void WebPage::urlSchemeTaskDidReceiveData(uint64_t handlerIdentifier, uint64_t taskIdentifier, const IPC::DataReference& data)
+void WebPage::urlSchemeTaskDidReceiveData(uint64_t handlerIdentifier, uint64_t taskIdentifier, const IPC::SharedBufferDataReference& data)
 {
     auto* handler = m_identifierToURLSchemeHandlerProxyMap.get(handlerIdentifier);
     ASSERT(handler);
 
-    handler->taskDidReceiveData(taskIdentifier, data.size(), data.data());
+    handler->taskDidReceiveData(taskIdentifier, data.size(), reinterpret_cast<const uint8_t *>(data.data()));
 }
 
 void WebPage::urlSchemeTaskDidComplete(uint64_t handlerIdentifier, uint64_t taskIdentifier, const ResourceError& error)
@@ -6808,7 +6808,7 @@
     send(Messages::WebPageProxy::VoidCallback(callbackID));
 }
 
-void WebPage::updateAttachmentAttributes(const String& identifier, Optional<uint64_t>&& fileSize, const String& contentType, const String& fileName, const IPC::DataReference& enclosingImageData, CallbackID callbackID)
+void WebPage::updateAttachmentAttributes(const String& identifier, Optional<uint64_t>&& fileSize, const String& contentType, const String& fileName, const IPC::SharedBufferDataReference& enclosingImageData, CallbackID callbackID)
 {
     if (auto attachment = attachmentElementWithIdentifier(identifier)) {
         attachment->document().updateLayout();

Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.h (257666 => 257667)


--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.h	2020-02-29 00:18:02 UTC (rev 257666)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.h	2020-02-29 00:32:18 UTC (rev 257667)
@@ -155,6 +155,7 @@
 class Connection;
 class Decoder;
 class FormDataReference;
+class SharedBufferDataReference;
 }
 
 namespace WebCore {
@@ -1194,7 +1195,7 @@
     
 #if ENABLE(ATTACHMENT_ELEMENT)
     void insertAttachment(const String& identifier, Optional<uint64_t>&& fileSize, const String& fileName, const String& contentType, CallbackID);
-    void updateAttachmentAttributes(const String& identifier, Optional<uint64_t>&& fileSize, const String& contentType, const String& fileName, const IPC::DataReference& enclosingImageData, CallbackID);
+    void updateAttachmentAttributes(const String& identifier, Optional<uint64_t>&& fileSize, const String& contentType, const String& fileName, const IPC::SharedBufferDataReference& enclosingImageData, CallbackID);
 #endif
 
 #if ENABLE(APPLICATION_MANIFEST)
@@ -1678,7 +1679,7 @@
 
     void urlSchemeTaskDidPerformRedirection(uint64_t handlerIdentifier, uint64_t taskIdentifier, WebCore::ResourceResponse&&, WebCore::ResourceRequest&&);
     void urlSchemeTaskDidReceiveResponse(uint64_t handlerIdentifier, uint64_t taskIdentifier, const WebCore::ResourceResponse&);
-    void urlSchemeTaskDidReceiveData(uint64_t handlerIdentifier, uint64_t taskIdentifier, const IPC::DataReference&);
+    void urlSchemeTaskDidReceiveData(uint64_t handlerIdentifier, uint64_t taskIdentifier, const IPC::SharedBufferDataReference&);
     void urlSchemeTaskDidComplete(uint64_t handlerIdentifier, uint64_t taskIdentifier, const WebCore::ResourceError&);
 
     void setIsSuspended(bool);
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to