Title: [226066] trunk
Revision
226066
Author
[email protected]
Date
2017-12-18 11:53:23 -0800 (Mon, 18 Dec 2017)

Log Message

Add support for response blob given to fetch events
https://bugs.webkit.org/show_bug.cgi?id=180894

Patch by Youenn Fablet <[email protected]> on 2017-12-18
Reviewed by Darin Adler.

LayoutTests/imported/w3c:

* web-platform-tests/service-workers/service-worker/fetch-event-after-navigation-within-page.https-expected.txt:
* web-platform-tests/service-workers/service-worker/fetch-event-referrer-policy.https-expected.txt:
* web-platform-tests/service-workers/service-worker/fetch-event.https-expected.txt:
* web-platform-tests/service-workers/service-worker/fetch-header-visibility.https-expected.txt:
* web-platform-tests/service-workers/service-worker/fetch-mixed-content-to-outscope.https-expected.txt:

Source/WebCore:

Covered by updated test expectations.

Adding support for getting a blob URL from a FormData that only contains one blob.
Adding support to create a FetcLoader from a ServiceWorkerThreadProxy

* Modules/fetch/FetchLoader.cpp:
(WebCore::FetchLoader::start):
(WebCore::FetchLoader::startLoadingBlobURL):
* Modules/fetch/FetchLoader.h:
* WebCore.xcodeproj/project.pbxproj:
* platform/network/FormData.cpp:
(WebCore::FormData::asBlobURL const):
* platform/network/FormData.h:
* workers/service/context/ServiceWorkerThreadProxy.cpp:
(WebCore::ServiceWorkerThreadProxy::createBlobLoader):
* workers/service/context/ServiceWorkerThreadProxy.h:

Source/WebKit:

In case of blob data, read it from Service Worker process and send it to WebProcess.
At some point, web process should be able to read it directly from NetworkProcess.

* WebProcess/Storage/WebSWContextManagerConnection.cpp:
(WebKit::WebSWContextManagerConnection::startFetch):
* WebProcess/Storage/WebServiceWorkerFetchTaskClient.cpp:
(WebKit::WebServiceWorkerFetchTaskClient::WebServiceWorkerFetchTaskClient):
(WebKit::WebServiceWorkerFetchTaskClient::didReceiveFormData):
(WebKit::WebServiceWorkerFetchTaskClient::didReceiveBlobChunk):
(WebKit::WebServiceWorkerFetchTaskClient::didFinishBlobLoading):
(WebKit::WebServiceWorkerFetchTaskClient::didFinish):
* WebProcess/Storage/WebServiceWorkerFetchTaskClient.h:

Modified Paths

Diff

Modified: trunk/LayoutTests/imported/w3c/ChangeLog (226065 => 226066)


--- trunk/LayoutTests/imported/w3c/ChangeLog	2017-12-18 19:32:49 UTC (rev 226065)
+++ trunk/LayoutTests/imported/w3c/ChangeLog	2017-12-18 19:53:23 UTC (rev 226066)
@@ -1,3 +1,16 @@
+2017-12-18  Youenn Fablet  <[email protected]>
+
+        Add support for response blob given to fetch events
+        https://bugs.webkit.org/show_bug.cgi?id=180894
+
+        Reviewed by Darin Adler.
+
+        * web-platform-tests/service-workers/service-worker/fetch-event-after-navigation-within-page.https-expected.txt:
+        * web-platform-tests/service-workers/service-worker/fetch-event-referrer-policy.https-expected.txt:
+        * web-platform-tests/service-workers/service-worker/fetch-event.https-expected.txt:
+        * web-platform-tests/service-workers/service-worker/fetch-header-visibility.https-expected.txt:
+        * web-platform-tests/service-workers/service-worker/fetch-mixed-content-to-outscope.https-expected.txt:
+
 2017-12-17  Chris Dumez  <[email protected]>
 
         Strip fragment identifier from ServiceWorker's scriptURL

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event-after-navigation-within-page.https-expected.txt (226065 => 226066)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event-after-navigation-within-page.https-expected.txt	2017-12-18 19:32:49 UTC (rev 226065)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event-after-navigation-within-page.https-expected.txt	2017-12-18 19:53:23 UTC (rev 226066)
@@ -1,5 +1,4 @@
 
+PASS Service Worker should respond to fetch event after the hash changes 
+PASS Service Worker should respond to fetch event after the pushState 
 
-FAIL Service Worker should respond to fetch event after the hash changes assert_equals: expected "intercepted by service worker" but got ""
-FAIL Service Worker should respond to fetch event after the pushState assert_equals: expected "intercepted by service worker" but got ""
-

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event-referrer-policy.https-expected.txt (226065 => 226066)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event-referrer-policy.https-expected.txt	2017-12-18 19:32:49 UTC (rev 226065)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event-referrer-policy.https-expected.txt	2017-12-18 19:53:23 UTC (rev 226066)
@@ -1,4 +1,4 @@
 
 
-FAIL Service Worker responds to fetch event with the referrer policy assert_unreached: unexpected rejection: assert_equals: Service Worker should respond to fetch with the default referrer policy expected "ReferrerPolicy: no-referrer-when-downgrade" but got "" Reached unreachable code
+FAIL Service Worker responds to fetch event with the referrer policy assert_unreached: unexpected rejection: assert_equals: Service Worker should respond to fetch with the default referrer policy expected "ReferrerPolicy: no-referrer-when-downgrade" but got "ReferrerPolicy: " Reached unreachable code
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event.https-expected.txt (226065 => 226066)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event.https-expected.txt	2017-12-18 19:32:49 UTC (rev 226065)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event.https-expected.txt	2017-12-18 19:53:23 UTC (rev 226066)
@@ -2,8 +2,8 @@
 
 FAIL Service Worker headers in the request of a fetch event assert_unreached: unexpected rejection: assert_true: request specifies "Upgrade-Insecure Requests header as inserted by Fetch expected true got false Reached unreachable code
 FAIL Service Worker responds to fetch event with string assert_unreached: unexpected rejection: assert_equals: The character set of the response created with a string should be UTF-8 expected "UTF-8" but got "windows-1252" Reached unreachable code
-FAIL Service Worker responds to fetch event with blob body assert_unreached: unexpected rejection: assert_equals: Service Worker should respond to fetch with a test string expected "Test blob" but got "" Reached unreachable code
-FAIL Service Worker responds to fetch event with the referrer URL assert_unreached: unexpected rejection: assert_equals: Service Worker should respond to fetch with the referrer URL expected "Referrer: https://localhost:9443/service-workers/service-worker/fetch-event.https.html" but got "" Reached unreachable code
+PASS Service Worker responds to fetch event with blob body 
+PASS Service Worker responds to fetch event with the referrer URL 
 PASS Service Worker responds to fetch event with an existing client id 
 PASS Service Worker does not respond to fetch event 
 PASS Service Worker responds to fetch event with null response body 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-header-visibility.https-expected.txt (226065 => 226066)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-header-visibility.https-expected.txt	2017-12-18 19:32:49 UTC (rev 226065)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-header-visibility.https-expected.txt	2017-12-18 19:53:23 UTC (rev 226066)
@@ -1,4 +1,4 @@
 
 
-FAIL Visibility of defaulted headers during interception assert_unreached: unexpected rejection: withUA FAIL - expected "custom_ua", got "" Reached unreachable code
+FAIL Visibility of defaulted headers during interception assert_unreached: unexpected rejection: withUA FAIL - expected "custom_ua", got "NO_UA" Reached unreachable code
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-mixed-content-to-outscope.https-expected.txt (226065 => 226066)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-mixed-content-to-outscope.https-expected.txt	2017-12-18 19:32:49 UTC (rev 226065)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-mixed-content-to-outscope.https-expected.txt	2017-12-18 19:53:23 UTC (rev 226066)
@@ -4,5 +4,5 @@
 
 
 
-FAIL Verify Mixed content of fetch() in a Service Worker assert_equals: expected "finish" but got "FAIL(5)finish"
+PASS Verify Mixed content of fetch() in a Service Worker 
 

Modified: trunk/Source/WebCore/ChangeLog (226065 => 226066)


--- trunk/Source/WebCore/ChangeLog	2017-12-18 19:32:49 UTC (rev 226065)
+++ trunk/Source/WebCore/ChangeLog	2017-12-18 19:53:23 UTC (rev 226066)
@@ -1,3 +1,27 @@
+2017-12-18  Youenn Fablet  <[email protected]>
+
+        Add support for response blob given to fetch events
+        https://bugs.webkit.org/show_bug.cgi?id=180894
+
+        Reviewed by Darin Adler.
+
+        Covered by updated test expectations.
+
+        Adding support for getting a blob URL from a FormData that only contains one blob.
+        Adding support to create a FetcLoader from a ServiceWorkerThreadProxy
+
+        * Modules/fetch/FetchLoader.cpp:
+        (WebCore::FetchLoader::start):
+        (WebCore::FetchLoader::startLoadingBlobURL):
+        * Modules/fetch/FetchLoader.h:
+        * WebCore.xcodeproj/project.pbxproj:
+        * platform/network/FormData.cpp:
+        (WebCore::FormData::asBlobURL const):
+        * platform/network/FormData.h:
+        * workers/service/context/ServiceWorkerThreadProxy.cpp:
+        (WebCore::ServiceWorkerThreadProxy::createBlobLoader):
+        * workers/service/context/ServiceWorkerThreadProxy.h:
+
 2017-12-18  Zalan Bujtas  <[email protected]>
 
         [SVG] Detach list wrappers before resetting the base value.

Modified: trunk/Source/WebCore/Modules/fetch/FetchLoader.cpp (226065 => 226066)


--- trunk/Source/WebCore/Modules/fetch/FetchLoader.cpp	2017-12-18 19:32:49 UTC (rev 226065)
+++ trunk/Source/WebCore/Modules/fetch/FetchLoader.cpp	2017-12-18 19:53:23 UTC (rev 226066)
@@ -53,6 +53,11 @@
 
 void FetchLoader::start(ScriptExecutionContext& context, const Blob& blob)
 {
+    return startLoadingBlobURL(context, blob.url());
+}
+
+void FetchLoader::startLoadingBlobURL(ScriptExecutionContext& context, const URL& blobURL)
+{
     m_urlForReading = BlobURL::createPublicURL(context.securityOrigin());
     if (m_urlForReading.isEmpty()) {
         m_client.didFail({ errorDomainWebKitInternal, 0, URL(), ASCIILiteral("Could not create URL for Blob") });
@@ -59,7 +64,7 @@
         return;
     }
 
-    ThreadableBlobRegistry::registerBlobURL(context.securityOrigin(), m_urlForReading, blob.url());
+    ThreadableBlobRegistry::registerBlobURL(context.securityOrigin(), m_urlForReading, blobURL);
 
     ResourceRequest request(m_urlForReading);
     request.setInitiatorIdentifier(context.resourceRequestIdentifier());

Modified: trunk/Source/WebCore/Modules/fetch/FetchLoader.h (226065 => 226066)


--- trunk/Source/WebCore/Modules/fetch/FetchLoader.h	2017-12-18 19:32:49 UTC (rev 226065)
+++ trunk/Source/WebCore/Modules/fetch/FetchLoader.h	2017-12-18 19:53:23 UTC (rev 226066)
@@ -31,6 +31,7 @@
 #include "FetchBodyConsumer.h"
 #include "ThreadableLoader.h"
 #include "ThreadableLoaderClient.h"
+#include "URL.h"
 
 namespace WebCore {
 
@@ -48,6 +49,7 @@
 
     void start(ScriptExecutionContext&, const FetchRequest&);
     void start(ScriptExecutionContext&, const Blob&);
+    void startLoadingBlobURL(ScriptExecutionContext&, const URL& blobURL);
     void stop();
 
     bool isStarted() const { return m_isStarted; }

Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (226065 => 226066)


--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2017-12-18 19:32:49 UTC (rev 226065)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2017-12-18 19:53:23 UTC (rev 226066)
@@ -1001,6 +1001,7 @@
 		4157EBFB1E3AB67F00AC9FE9 /* MockLibWebRTCPeerConnection.h in Headers */ = {isa = PBXBuildFile; fileRef = 4157EBF81E3AB06800AC9FE9 /* MockLibWebRTCPeerConnection.h */; };
 		415CDAF51E6B8F8B004F11EE /* CanvasCaptureMediaStreamTrack.h in Headers */ = {isa = PBXBuildFile; fileRef = 41C7E1061E6A54360027B4DE /* CanvasCaptureMediaStreamTrack.h */; };
 		41614A791DA64241004AD06F /* HTTPHeaderValues.h in Headers */ = {isa = PBXBuildFile; fileRef = 41614A771DA64236004AD06F /* HTTPHeaderValues.h */; };
+		4161E2D51FE48DC500EC2E96 /* FetchLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = 4147E2B51C89912600A7E715 /* FetchLoader.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		4162A451101145AE00DFF3ED /* DedicatedWorkerGlobalScope.h in Headers */ = {isa = PBXBuildFile; fileRef = 4162A44E101145AE00DFF3ED /* DedicatedWorkerGlobalScope.h */; };
 		4162A4581011464700DFF3ED /* JSDedicatedWorkerGlobalScope.h in Headers */ = {isa = PBXBuildFile; fileRef = 4162A4561011464700DFF3ED /* JSDedicatedWorkerGlobalScope.h */; };
 		416E29A6102FA962007FC14E /* WorkerReportingProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = 416E29A5102FA962007FC14E /* WorkerReportingProxy.h */; };
@@ -27387,6 +27388,7 @@
 				7A54858014E02D51006AE05A /* InspectorHistory.h in Headers */,
 				A5B81CAE1FAA44620037D1E6 /* InspectorIndexedDBAgent.h in Headers */,
 				20D629271253690B00081543 /* InspectorInstrumentation.h in Headers */,
+				4161E2D51FE48DC500EC2E96 /* FetchLoader.h in Headers */,
 				A5840E1D187B74D500843B10 /* InspectorInstrumentationCookie.h in Headers */,
 				A5B81CAF1FAA44620037D1E6 /* InspectorLayerTreeAgent.h in Headers */,
 				A5B81CB01FAA44620037D1E6 /* InspectorMemoryAgent.h in Headers */,

Modified: trunk/Source/WebCore/platform/network/FormData.cpp (226065 => 226066)


--- trunk/Source/WebCore/platform/network/FormData.cpp	2017-12-18 19:32:49 UTC (rev 226065)
+++ trunk/Source/WebCore/platform/network/FormData.cpp	2017-12-18 19:53:23 UTC (rev 226066)
@@ -440,4 +440,13 @@
     return SharedBuffer::create(flatten());
 }
 
+URL FormData::asBlobURL() const
+{
+    if (m_elements.size() != 1)
+        return { };
+
+    ASSERT(m_elements.first().m_type == FormDataElement::Type::EncodedBlob || m_elements.first().m_url.isNull());
+    return m_elements.first().m_url;
+}
+
 } // namespace WebCore

Modified: trunk/Source/WebCore/platform/network/FormData.h (226065 => 226066)


--- trunk/Source/WebCore/platform/network/FormData.h	2017-12-18 19:32:49 UTC (rev 226065)
+++ trunk/Source/WebCore/platform/network/FormData.h	2017-12-18 19:53:23 UTC (rev 226066)
@@ -257,6 +257,8 @@
 
     uint64_t lengthInBytes() const;
 
+    WEBCORE_EXPORT URL asBlobURL() const;
+
 private:
     FormData();
     FormData(const FormData&);

Modified: trunk/Source/WebCore/workers/service/context/ServiceWorkerFetch.cpp (226065 => 226066)


--- trunk/Source/WebCore/workers/service/context/ServiceWorkerFetch.cpp	2017-12-18 19:32:49 UTC (rev 226065)
+++ trunk/Source/WebCore/workers/service/context/ServiceWorkerFetch.cpp	2017-12-18 19:53:23 UTC (rev 226066)
@@ -82,13 +82,13 @@
 
     auto body = response->consumeBody();
     WTF::switchOn(body, [&] (Ref<FormData>& formData) {
-        client->didReceiveFormData(WTFMove(formData));
+        client->didReceiveFormDataAndFinish(WTFMove(formData));
     }, [&] (Ref<SharedBuffer>& buffer) {
         client->didReceiveData(WTFMove(buffer));
-    }, [] (std::nullptr_t&) {
+        client->didFinish();
+    }, [&] (std::nullptr_t&) {
+        client->didFinish();
     });
-
-    client->didFinish();
 }
 
 Ref<FetchEvent> dispatchFetchEvent(Ref<Client>&& client, WorkerGlobalScope& globalScope, std::optional<ServiceWorkerClientIdentifier> clientId, ResourceRequest&& request, FetchOptions&& options)

Modified: trunk/Source/WebCore/workers/service/context/ServiceWorkerFetch.h (226065 => 226066)


--- trunk/Source/WebCore/workers/service/context/ServiceWorkerFetch.h	2017-12-18 19:32:49 UTC (rev 226065)
+++ trunk/Source/WebCore/workers/service/context/ServiceWorkerFetch.h	2017-12-18 19:53:23 UTC (rev 226066)
@@ -48,7 +48,7 @@
 
     virtual void didReceiveResponse(const ResourceResponse&) = 0;
     virtual void didReceiveData(Ref<SharedBuffer>&&) = 0;
-    virtual void didReceiveFormData(Ref<FormData>&&) = 0;
+    virtual void didReceiveFormDataAndFinish(Ref<FormData>&&) = 0;
     virtual void didFail() = 0;
     virtual void didFinish() = 0;
     virtual void didNotHandle() = 0;

Modified: trunk/Source/WebCore/workers/service/context/ServiceWorkerThreadProxy.cpp (226065 => 226066)


--- trunk/Source/WebCore/workers/service/context/ServiceWorkerThreadProxy.cpp	2017-12-18 19:32:49 UTC (rev 226065)
+++ trunk/Source/WebCore/workers/service/context/ServiceWorkerThreadProxy.cpp	2017-12-18 19:53:23 UTC (rev 226066)
@@ -109,6 +109,15 @@
     return *m_cacheStorageConnection;
 }
 
+std::unique_ptr<FetchLoader> ServiceWorkerThreadProxy::createBlobLoader(FetchLoaderClient& client, const URL& blobURL)
+{
+    auto loader = std::make_unique<FetchLoader>(client, nullptr);
+    loader->startLoadingBlobURL(m_document, blobURL);
+    if (!loader->isStarted())
+        return nullptr;
+    return loader;
+}
+
 } // namespace WebCore
 
 #endif // ENABLE(SERVICE_WORKER)

Modified: trunk/Source/WebCore/workers/service/context/ServiceWorkerThreadProxy.h (226065 => 226066)


--- trunk/Source/WebCore/workers/service/context/ServiceWorkerThreadProxy.h	2017-12-18 19:32:49 UTC (rev 226065)
+++ trunk/Source/WebCore/workers/service/context/ServiceWorkerThreadProxy.h	2017-12-18 19:53:23 UTC (rev 226066)
@@ -41,6 +41,8 @@
 namespace WebCore {
 
 class CacheStorageProvider;
+class FetchLoader;
+class FetchLoaderClient;
 class PageConfiguration;
 class ServiceWorkerInspectorProxy;
 struct ServiceWorkerContextData;
@@ -59,6 +61,8 @@
     bool isTerminatingOrTerminated() const { return m_isTerminatingOrTerminated; }
     void setTerminatingOrTerminated(bool terminating) { m_isTerminatingOrTerminated = terminating; }
 
+    WEBCORE_EXPORT std::unique_ptr<FetchLoader> createBlobLoader(FetchLoaderClient&, const URL&);
+
 private:
     WEBCORE_EXPORT ServiceWorkerThreadProxy(PageConfiguration&&, const ServiceWorkerContextData&, PAL::SessionID, String&& userAgent, CacheStorageProvider&);
 

Modified: trunk/Source/WebKit/ChangeLog (226065 => 226066)


--- trunk/Source/WebKit/ChangeLog	2017-12-18 19:32:49 UTC (rev 226065)
+++ trunk/Source/WebKit/ChangeLog	2017-12-18 19:53:23 UTC (rev 226066)
@@ -1,3 +1,23 @@
+2017-12-18  Youenn Fablet  <[email protected]>
+
+        Add support for response blob given to fetch events
+        https://bugs.webkit.org/show_bug.cgi?id=180894
+
+        Reviewed by Darin Adler.
+
+        In case of blob data, read it from Service Worker process and send it to WebProcess.
+        At some point, web process should be able to read it directly from NetworkProcess.
+
+        * WebProcess/Storage/WebSWContextManagerConnection.cpp:
+        (WebKit::WebSWContextManagerConnection::startFetch):
+        * WebProcess/Storage/WebServiceWorkerFetchTaskClient.cpp:
+        (WebKit::WebServiceWorkerFetchTaskClient::WebServiceWorkerFetchTaskClient):
+        (WebKit::WebServiceWorkerFetchTaskClient::didReceiveFormData):
+        (WebKit::WebServiceWorkerFetchTaskClient::didReceiveBlobChunk):
+        (WebKit::WebServiceWorkerFetchTaskClient::didFinishBlobLoading):
+        (WebKit::WebServiceWorkerFetchTaskClient::didFinish):
+        * WebProcess/Storage/WebServiceWorkerFetchTaskClient.h:
+
 2017-12-18  Daniel Bates  <[email protected]>
 
         Add SPI to query for the current and last auto fill button type and pass user data object to _webView:focusShouldStartInputSession:

Modified: trunk/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.cpp (226065 => 226066)


--- trunk/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.cpp	2017-12-18 19:32:49 UTC (rev 226065)
+++ trunk/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.cpp	2017-12-18 19:53:23 UTC (rev 226066)
@@ -163,7 +163,7 @@
         return;
     }
 
-    auto client = WebServiceWorkerFetchTaskClient::create(m_connectionToStorageProcess.copyRef(), serverConnectionIdentifier, fetchIdentifier);
+    auto client = WebServiceWorkerFetchTaskClient::create(m_connectionToStorageProcess.copyRef(), serviceWorkerIdentifier, serverConnectionIdentifier, fetchIdentifier);
     std::optional<ServiceWorkerClientIdentifier> clientId;
     if (options.clientIdentifier)
         clientId = ServiceWorkerClientIdentifier { serverConnectionIdentifier, options.clientIdentifier.value() };

Modified: trunk/Source/WebKit/WebProcess/Storage/WebServiceWorkerFetchTaskClient.cpp (226065 => 226066)


--- trunk/Source/WebKit/WebProcess/Storage/WebServiceWorkerFetchTaskClient.cpp	2017-12-18 19:32:49 UTC (rev 226065)
+++ trunk/Source/WebKit/WebProcess/Storage/WebServiceWorkerFetchTaskClient.cpp	2017-12-18 19:53:23 UTC (rev 226066)
@@ -33,6 +33,7 @@
 #include "StorageProcessMessages.h"
 #include "WebCoreArgumentCoders.h"
 #include <WebCore/ResourceResponse.h>
+#include <WebCore/SWContextManager.h>
 #include <wtf/RunLoop.h>
 
 using namespace WebCore;
@@ -45,9 +46,10 @@
         RunLoop::main().dispatch([connection = WTFMove(m_connection)] { });
 }
 
-WebServiceWorkerFetchTaskClient::WebServiceWorkerFetchTaskClient(Ref<IPC::Connection>&& connection, WebCore::SWServerConnectionIdentifier serverConnectionIdentifier, uint64_t fetchTaskIdentifier)
+WebServiceWorkerFetchTaskClient::WebServiceWorkerFetchTaskClient(Ref<IPC::Connection>&& connection, WebCore::ServiceWorkerIdentifier serviceWorkerIdentifier, WebCore::SWServerConnectionIdentifier serverConnectionIdentifier, uint64_t fetchTaskIdentifier)
     : m_connection(WTFMove(connection))
     , m_serverConnectionIdentifier(serverConnectionIdentifier)
+    , m_serviceWorkerIdentifier(serviceWorkerIdentifier)
     , m_fetchTaskIdentifier(fetchTaskIdentifier)
 {
 }
@@ -67,14 +69,54 @@
     m_connection->send(Messages::StorageProcess::DidReceiveFetchData { m_serverConnectionIdentifier, m_fetchTaskIdentifier, dataReference, static_cast<int64_t>(buffer->size()) }, 0);
 }
 
-void WebServiceWorkerFetchTaskClient::didReceiveFormData(Ref<FormData>&& formData)
+void WebServiceWorkerFetchTaskClient::didReceiveFormDataAndFinish(Ref<FormData>&& formData)
 {
     if (!m_connection)
         return;
 
-    m_connection->send(Messages::StorageProcess::DidReceiveFetchFormData { m_serverConnectionIdentifier, m_fetchTaskIdentifier, IPC::FormDataReference { WTFMove(formData) } }, 0);
+    // FIXME: We should send this form data to the other process and consume it there.
+    // For now and for the case of blobs, we read it there and send the data through IPC.
+    URL blobURL = formData->asBlobURL();
+    if (blobURL.isNull()) {
+        m_connection->send(Messages::StorageProcess::DidReceiveFetchFormData { m_serverConnectionIdentifier, m_fetchTaskIdentifier, IPC::FormDataReference { WTFMove(formData) } }, 0);
+        return;
+    }
+
+    callOnMainThread([this, protectedThis = makeRef(*this), blobURL = blobURL.isolatedCopy()] () {
+        auto* serviceWorkerThreadProxy = SWContextManager::singleton().serviceWorkerThreadProxy(m_serviceWorkerIdentifier);
+        if (!serviceWorkerThreadProxy) {
+            didFail();
+            return;
+        }
+
+        m_blobLoader.emplace(*this);
+        auto loader = serviceWorkerThreadProxy->createBlobLoader(*m_blobLoader, blobURL);
+        if (!loader) {
+            m_blobLoader = std::nullopt;
+            didFail();
+            return;
+        }
+
+        m_blobLoader->loader = WTFMove(loader);
+    });
 }
 
+void WebServiceWorkerFetchTaskClient::didReceiveBlobChunk(const char* data, size_t size)
+{
+    if (!m_connection)
+        return;
+
+    IPC::DataReference dataReference { reinterpret_cast<const uint8_t*>(data), size };
+    m_connection->send(Messages::StorageProcess::DidReceiveFetchData { m_serverConnectionIdentifier, m_fetchTaskIdentifier, dataReference, static_cast<int64_t>(size) }, 0);
+}
+
+void WebServiceWorkerFetchTaskClient::didFinishBlobLoading()
+{
+    didFinish();
+
+    m_blobLoader = std::nullopt;
+}
+
 void WebServiceWorkerFetchTaskClient::didFail()
 {
     if (!m_connection)
@@ -87,6 +129,7 @@
 {
     if (!m_connection)
         return;
+
     m_connection->send(Messages::StorageProcess::DidFinishFetch { m_serverConnectionIdentifier, m_fetchTaskIdentifier }, 0);
     m_connection = nullptr;
 }

Modified: trunk/Source/WebKit/WebProcess/Storage/WebServiceWorkerFetchTaskClient.h (226065 => 226066)


--- trunk/Source/WebKit/WebProcess/Storage/WebServiceWorkerFetchTaskClient.h	2017-12-18 19:32:49 UTC (rev 226065)
+++ trunk/Source/WebKit/WebProcess/Storage/WebServiceWorkerFetchTaskClient.h	2017-12-18 19:53:23 UTC (rev 226066)
@@ -28,6 +28,8 @@
 #if ENABLE(SERVICE_WORKER)
 
 #include "Connection.h"
+#include <WebCore/FetchLoader.h>
+#include <WebCore/FetchLoaderClient.h>
 #include <WebCore/ServiceWorkerFetch.h>
 #include <WebCore/ServiceWorkerTypes.h>
 
@@ -35,26 +37,44 @@
 
 class WebServiceWorkerFetchTaskClient final : public WebCore::ServiceWorkerFetch::Client {
 public:
-    static Ref<WebServiceWorkerFetchTaskClient> create(Ref<IPC::Connection>&& connection, WebCore::SWServerConnectionIdentifier serverConnectionIdentifier, uint64_t fetchTaskIdentifier)
+    static Ref<WebServiceWorkerFetchTaskClient> create(Ref<IPC::Connection>&& connection, WebCore::ServiceWorkerIdentifier serviceWorkerIdentifier,  WebCore::SWServerConnectionIdentifier serverConnectionIdentifier, uint64_t fetchTaskIdentifier)
     {
-        return adoptRef(*new WebServiceWorkerFetchTaskClient(WTFMove(connection), serverConnectionIdentifier, fetchTaskIdentifier));
+        return adoptRef(*new WebServiceWorkerFetchTaskClient(WTFMove(connection), serviceWorkerIdentifier, serverConnectionIdentifier, fetchTaskIdentifier));
     }
 
     ~WebServiceWorkerFetchTaskClient();
 
 private:
-    WebServiceWorkerFetchTaskClient(Ref<IPC::Connection>&&, WebCore::SWServerConnectionIdentifier, uint64_t fetchTaskIdentifier);
+    WebServiceWorkerFetchTaskClient(Ref<IPC::Connection>&&, WebCore::ServiceWorkerIdentifier, WebCore::SWServerConnectionIdentifier, uint64_t fetchTaskIdentifier);
 
     void didReceiveResponse(const WebCore::ResourceResponse&) final;
     void didReceiveData(Ref<WebCore::SharedBuffer>&&) final;
-    void didReceiveFormData(Ref<WebCore::FormData>&&) final;
+    void didReceiveFormDataAndFinish(Ref<WebCore::FormData>&&) final;
     void didFail() final;
     void didFinish() final;
     void didNotHandle() final;
 
+    void didReceiveBlobChunk(const char* data, size_t size);
+    void didFinishBlobLoading();
+
+    struct BlobLoader final : WebCore::FetchLoaderClient {
+        explicit BlobLoader(WebServiceWorkerFetchTaskClient& client) : client(client) { }
+
+        // FetchLoaderClient API
+        void didReceiveResponse(const WebCore::ResourceResponse&) final { }
+        void didReceiveData(const char* data, size_t size) final { client->didReceiveBlobChunk(data, size); }
+        void didFail(const WebCore::ResourceError&) final { client->didFail(); }
+        void didSucceed() final { client->didFinishBlobLoading(); }
+
+        Ref<WebServiceWorkerFetchTaskClient> client;
+        std::unique_ptr<WebCore::FetchLoader> loader;
+    };
+
     RefPtr<IPC::Connection> m_connection;
     WebCore::SWServerConnectionIdentifier m_serverConnectionIdentifier;
+    WebCore::ServiceWorkerIdentifier m_serviceWorkerIdentifier;
     uint64_t m_fetchTaskIdentifier { 0 };
+    std::optional<BlobLoader> m_blobLoader;
 };
 
 } // namespace WebKit
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to