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);