Title: [224059] trunk
Revision
224059
Author
[email protected]
Date
2017-10-26 15:57:29 -0700 (Thu, 26 Oct 2017)

Log Message

Add service worker handle fetch support for all subresource requests
https://bugs.webkit.org/show_bug.cgi?id=178769

Patch by Youenn Fablet <[email protected]> on 2017-10-26
Reviewed by Chris Dumez.

Source/WebCore:

Test: http/tests/workers/service/image-fetch.html

Moving DocumentThreadableLoader logic to CachedResourceLoader to apply it for all resource loads.
Setting the selected service worker identifier for subresource only at the moment.

Testing is limited to images, future wpt tests should cover other subresource cases.

* loader/DocumentThreadableLoader.cpp:
(WebCore::DocumentThreadableLoader::DocumentThreadableLoader):
* loader/cache/CachedResourceLoader.cpp:
(WebCore::CachedResourceLoader::prepareFetch):
* loader/cache/CachedResourceRequest.cpp:
(WebCore::CachedResourceRequest::setSelectedServiceWorkerIdentifierIfNeeded):
* loader/cache/CachedResourceRequest.h:

LayoutTests:

* http/tests/workers/service/image-fetch-expected.txt: Added.
* http/tests/workers/service/image-fetch.html: Added.
* http/tests/workers/service/resources/image-fetch-worker.js: Added.
(event.event.request.url.indexOf):
(event.event.request.url.endsWith):
* http/tests/workers/service/resources/image-fetch.js: Added.
(done):
(async.loadedImage):
(async.erroredImage):
(async.logStatus):
(async.test):

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (224058 => 224059)


--- trunk/LayoutTests/ChangeLog	2017-10-26 22:55:21 UTC (rev 224058)
+++ trunk/LayoutTests/ChangeLog	2017-10-26 22:57:29 UTC (rev 224059)
@@ -1,3 +1,22 @@
+2017-10-26  Youenn Fablet  <[email protected]>
+
+        Add service worker handle fetch support for all subresource requests
+        https://bugs.webkit.org/show_bug.cgi?id=178769
+
+        Reviewed by Chris Dumez.
+
+        * http/tests/workers/service/image-fetch-expected.txt: Added.
+        * http/tests/workers/service/image-fetch.html: Added.
+        * http/tests/workers/service/resources/image-fetch-worker.js: Added.
+        (event.event.request.url.indexOf):
+        (event.event.request.url.endsWith):
+        * http/tests/workers/service/resources/image-fetch.js: Added.
+        (done):
+        (async.loadedImage):
+        (async.erroredImage):
+        (async.logStatus):
+        (async.test):
+
 2017-10-26  Ryosuke Niwa  <[email protected]>
 
         LayoutTest http/tests/security/clipboard/copy-paste-html-cross-origin-iframe-across-origin.html is a flaky failure

Added: trunk/LayoutTests/http/tests/workers/service/image-fetch-expected.txt (0 => 224059)


--- trunk/LayoutTests/http/tests/workers/service/image-fetch-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/http/tests/workers/service/image-fetch-expected.txt	2017-10-26 22:57:29 UTC (rev 224059)
@@ -0,0 +1,9 @@
+
+Registering service worker
+Service worker registered
+Status is no status
+Loading image
+PASS: Loaded image
+Status is Got response for http://127.0.0.1:8000/resources/square100.png, status code is 200
+Image size: 100x100
+

Added: trunk/LayoutTests/http/tests/workers/service/image-fetch.html (0 => 224059)


--- trunk/LayoutTests/http/tests/workers/service/image-fetch.html	                        (rev 0)
+++ trunk/LayoutTests/http/tests/workers/service/image-fetch.html	2017-10-26 22:57:29 UTC (rev 224059)
@@ -0,0 +1,9 @@
+<html>
+<head>
+<script src=""
+</head>
+<body>
+    <img id="image" _onload_="loadedImage()" _onerror_="erroredImage()"></img>
+    <script src=""
+</body>
+</html>

Added: trunk/LayoutTests/http/tests/workers/service/resources/image-fetch-worker.js (0 => 224059)


--- trunk/LayoutTests/http/tests/workers/service/resources/image-fetch-worker.js	                        (rev 0)
+++ trunk/LayoutTests/http/tests/workers/service/resources/image-fetch-worker.js	2017-10-26 22:57:29 UTC (rev 224059)
@@ -0,0 +1,17 @@
+var status = "no status";
+self.addEventListener("fetch", (event) => {
+    if (event.request.url.indexOf("status") !== -1) {
+        event.respondWith(new Response(null, {status: 200, statusText: status}));
+        return;
+    }
+    if (!event.request.url.endsWith(".fromserviceworker")) {
+        status = "unknown url";
+        event.respondWith(new Response(null, {status: 404, statusText: "Not Found"}));
+        return;
+    }
+    status = "Fetching " + event.request.url.substring(0, event.request.url.length - 18);
+    event.respondWith(fetch(event.request.url.substring(0, event.request.url.length - 18)).then((response) => {
+        status = "Got response for " + event.request.url.substring(0, event.request.url.length - 18) + ", status code is " + response.status;
+        return response;
+    }));
+});

Added: trunk/LayoutTests/http/tests/workers/service/resources/image-fetch.js (0 => 224059)


--- trunk/LayoutTests/http/tests/workers/service/resources/image-fetch.js	                        (rev 0)
+++ trunk/LayoutTests/http/tests/workers/service/resources/image-fetch.js	2017-10-26 22:57:29 UTC (rev 224059)
@@ -0,0 +1,43 @@
+function done()
+{
+    finishSWTest();
+}
+
+async function loadedImage()
+{
+    log("PASS: Loaded image");
+    await logStatus();
+    log("Image size: " + image.width + "x" + image.height);
+    finishSWTest();
+}
+
+async function erroredImage()
+{
+    log("FAIL: image loading failed");
+    await logStatus();
+    finishSWTest();
+}
+
+async function logStatus()
+{
+    var response = await fetch("status");
+    log("Status is " + response.statusText);
+}
+
+async function test()
+{
+    try {
+        log("Registering service worker");
+        await navigator.serviceWorker.register("resources/image-fetch-worker.js", { });
+        log("Service worker registered");
+
+        await logStatus();
+        log("Loading image");
+        image.src = ""
+    } catch(e) {
+        log("Got exception: " + e);
+        await logStatus();
+    }
+}
+
+test();

Modified: trunk/Source/WebCore/ChangeLog (224058 => 224059)


--- trunk/Source/WebCore/ChangeLog	2017-10-26 22:55:21 UTC (rev 224058)
+++ trunk/Source/WebCore/ChangeLog	2017-10-26 22:57:29 UTC (rev 224059)
@@ -1,3 +1,25 @@
+2017-10-26  Youenn Fablet  <[email protected]>
+
+        Add service worker handle fetch support for all subresource requests
+        https://bugs.webkit.org/show_bug.cgi?id=178769
+
+        Reviewed by Chris Dumez.
+
+        Test: http/tests/workers/service/image-fetch.html
+
+        Moving DocumentThreadableLoader logic to CachedResourceLoader to apply it for all resource loads.
+        Setting the selected service worker identifier for subresource only at the moment.
+
+        Testing is limited to images, future wpt tests should cover other subresource cases.
+
+        * loader/DocumentThreadableLoader.cpp:
+        (WebCore::DocumentThreadableLoader::DocumentThreadableLoader):
+        * loader/cache/CachedResourceLoader.cpp:
+        (WebCore::CachedResourceLoader::prepareFetch):
+        * loader/cache/CachedResourceRequest.cpp:
+        (WebCore::CachedResourceRequest::setSelectedServiceWorkerIdentifierIfNeeded):
+        * loader/cache/CachedResourceRequest.h:
+
 2017-10-26  Eric Carlson  <[email protected]>
 
         NowPlayingInfo should contain a unique identifier

Modified: trunk/Source/WebCore/loader/DocumentThreadableLoader.cpp (224058 => 224059)


--- trunk/Source/WebCore/loader/DocumentThreadableLoader.cpp	2017-10-26 22:55:21 UTC (rev 224058)
+++ trunk/Source/WebCore/loader/DocumentThreadableLoader.cpp	2017-10-26 22:57:29 UTC (rev 224059)
@@ -103,11 +103,6 @@
 {
     relaxAdoptionRequirement();
 
-#if ENABLE(SERVICE_WORKER)
-    if (m_options.serviceWorkersMode == ServiceWorkersMode::All && !m_options.serviceWorkerIdentifier)
-        m_options.serviceWorkerIdentifier = document.selectedServiceWorkerIdentifier();
-#endif
-
     // Setting a referrer header is only supported in the async code path.
     ASSERT(m_async || m_referrer.isEmpty());
 

Modified: trunk/Source/WebCore/loader/cache/CachedResourceLoader.cpp (224058 => 224059)


--- trunk/Source/WebCore/loader/cache/CachedResourceLoader.cpp	2017-10-26 22:55:21 UTC (rev 224058)
+++ trunk/Source/WebCore/loader/cache/CachedResourceLoader.cpp	2017-10-26 22:57:29 UTC (rev 224059)
@@ -686,9 +686,15 @@
 void CachedResourceLoader::prepareFetch(CachedResource::Type type, CachedResourceRequest& request)
 {
     // Implementing step 1 to 7 of https://fetch.spec.whatwg.org/#fetching
+    auto* document = this->document();
 
-    if (!request.origin() && document())
-        request.setOrigin(document()->securityOrigin());
+    if (document) {
+        if (!request.origin())
+            request.setOrigin(document->securityOrigin());
+#if ENABLE(SERVICE_WORKER)
+        request.setSelectedServiceWorkerIdentifierIfNeeded(document->selectedServiceWorkerIdentifier());
+#endif
+    }
 
     request.setAcceptHeaderIfNone(type);
 

Modified: trunk/Source/WebCore/loader/cache/CachedResourceRequest.cpp (224058 => 224059)


--- trunk/Source/WebCore/loader/cache/CachedResourceRequest.cpp	2017-10-26 22:55:21 UTC (rev 224058)
+++ trunk/Source/WebCore/loader/cache/CachedResourceRequest.cpp	2017-10-26 22:57:29 UTC (rev 224059)
@@ -273,4 +273,21 @@
     m_options.destination = destination;
 }
 
+#if ENABLE(SERVICE_WORKER)
+void CachedResourceRequest::setSelectedServiceWorkerIdentifierIfNeeded(uint64_t serviceWorkerIdentifier)
+{
+    if (isNonSubresourceRequest(m_options.destination))
+        return;
+    if (isPotentialNavigationOrSubresourceRequest(m_options.destination))
+        return;
+
+    if (m_options.serviceWorkersMode != ServiceWorkersMode::All)
+        return;
+    if (m_options.serviceWorkerIdentifier)
+        return;
+
+    m_options.serviceWorkerIdentifier = serviceWorkerIdentifier;
+}
+#endif
+
 } // namespace WebCore

Modified: trunk/Source/WebCore/loader/cache/CachedResourceRequest.h (224058 => 224059)


--- trunk/Source/WebCore/loader/cache/CachedResourceRequest.h	2017-10-26 22:55:21 UTC (rev 224058)
+++ trunk/Source/WebCore/loader/cache/CachedResourceRequest.h	2017-10-26 22:57:29 UTC (rev 224059)
@@ -95,6 +95,10 @@
 
     static String splitFragmentIdentifierFromRequestURL(ResourceRequest&);
 
+#if ENABLE(SERVICE_WORKER)
+    void setSelectedServiceWorkerIdentifierIfNeeded(uint64_t serviceWorkerIdentifier);
+#endif
+
 private:
     ResourceRequest m_resourceRequest;
     String m_charset;

Modified: trunk/Source/WebKit/WebProcess/Storage/WebServiceWorkerProvider.cpp (224058 => 224059)


--- trunk/Source/WebKit/WebProcess/Storage/WebServiceWorkerProvider.cpp	2017-10-26 22:55:21 UTC (rev 224058)
+++ trunk/Source/WebKit/WebProcess/Storage/WebServiceWorkerProvider.cpp	2017-10-26 22:57:29 UTC (rev 224059)
@@ -64,12 +64,11 @@
     if (options.serviceWorkersMode != ServiceWorkersMode::All)
         return false;
 
-    // FIXME: We should probably assert that options.serviceWorkersIdentifier is not null.
     if (isPotentialNavigationOrSubresourceRequest(options.destination))
         return false;
 
     // FIXME: Implement non-subresource request loads.
-    if (isNonSubresourceRequest(options.destination))
+    if (isNonSubresourceRequest(options.destination) || !options.serviceWorkerIdentifier)
         return false;
 
     if (!resource)
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to