Title: [227581] trunk
Revision
227581
Author
commit-qu...@webkit.org
Date
2018-01-24 15:23:18 -0800 (Wed, 24 Jan 2018)

Log Message

Opaque being-loaded responses should clone their body
https://bugs.webkit.org/show_bug.cgi?id=182056

Patch by Youenn Fablet <you...@apple.com> on 2018-01-24
Reviewed by Brady Eidson.

Source/WebCore:

Test: http/wpt/service-workers/clone-opaque-being-loaded-response.https.html

When cloning a being-loaded response, make sure we create a ReadableStream.
Before the patch, the readableStream was not created in that case for opaque responses.

* Modules/fetch/FetchBodyOwner.cpp:
(WebCore::FetchBodyOwner::readableStream):
(WebCore::FetchBodyOwner::createReadableStream):
* Modules/fetch/FetchBodyOwner.h:
* Modules/fetch/FetchResponse.cpp:
(WebCore::FetchResponse::clone):

LayoutTests:

* http/wpt/service-workers/clone-opaque-being-loaded-response-worker.js: Added.
* http/wpt/service-workers/clone-opaque-being-loaded-response.html: Added.
* http/wpt/service-workers/clone-opaque-being-loaded-response.https-expected.txt: Added.
* http/wpt/service-workers/resources/clone-opaque-being-loaded-response-iframe.html: Added.
* http/wpt/service-workers/resources/lengthy-pass.py: Added.
(main):

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (227580 => 227581)


--- trunk/LayoutTests/ChangeLog	2018-01-24 23:19:03 UTC (rev 227580)
+++ trunk/LayoutTests/ChangeLog	2018-01-24 23:23:18 UTC (rev 227581)
@@ -1,3 +1,17 @@
+2018-01-24  Youenn Fablet  <you...@apple.com>
+
+        Opaque being-loaded responses should clone their body
+        https://bugs.webkit.org/show_bug.cgi?id=182056
+
+        Reviewed by Brady Eidson.
+
+        * http/wpt/service-workers/clone-opaque-being-loaded-response-worker.js: Added.
+        * http/wpt/service-workers/clone-opaque-being-loaded-response.html: Added.
+        * http/wpt/service-workers/clone-opaque-being-loaded-response.https-expected.txt: Added.
+        * http/wpt/service-workers/resources/clone-opaque-being-loaded-response-iframe.html: Added.
+        * http/wpt/service-workers/resources/lengthy-pass.py: Added.
+        (main):
+
 2018-01-24  David Hyatt  <hy...@apple.com>
 
         Implement line clamp for mail.

Added: trunk/LayoutTests/http/wpt/service-workers/clone-opaque-being-loaded-response-worker.js (0 => 227581)


--- trunk/LayoutTests/http/wpt/service-workers/clone-opaque-being-loaded-response-worker.js	                        (rev 0)
+++ trunk/LayoutTests/http/wpt/service-workers/clone-opaque-being-loaded-response-worker.js	2018-01-24 23:23:18 UTC (rev 227581)
@@ -0,0 +1,8 @@
+importScripts('/common/get-host-info.sub.js');
+
+var remoteUrl = get_host_info()['HTTPS_REMOTE_ORIGIN'] + '/WebKit/service-workers/resources/lengthy-pass.py';
+
+self.addEventListener('fetch', (event) => {
+    if (event.request.url.indexOf("html") === -1)
+        event.respondWith(fetch(remoteUrl, {mode: 'no-cors'}).then(response => response.clone()));
+});

Added: trunk/LayoutTests/http/wpt/service-workers/clone-opaque-being-loaded-response.https-expected.txt (0 => 227581)


--- trunk/LayoutTests/http/wpt/service-workers/clone-opaque-being-loaded-response.https-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/http/wpt/service-workers/clone-opaque-being-loaded-response.https-expected.txt	2018-01-24 23:23:18 UTC (rev 227581)
@@ -0,0 +1,4 @@
+
+PASS Setup worker 
+PASS Ensure opaque response fetch is working 
+

Added: trunk/LayoutTests/http/wpt/service-workers/clone-opaque-being-loaded-response.https.html (0 => 227581)


--- trunk/LayoutTests/http/wpt/service-workers/clone-opaque-being-loaded-response.https.html	                        (rev 0)
+++ trunk/LayoutTests/http/wpt/service-workers/clone-opaque-being-loaded-response.https.html	2018-01-24 23:23:18 UTC (rev 227581)
@@ -0,0 +1,36 @@
+<html>
+<head>
+<title>Service Worker returning an opaque cloned response</title>
+<script src=""
+<script src=""
+<script src=""
+</head>
+<body>
+<script>
+var registration;
+var iframe;
+promise_test(async (test) => {
+    registration = await navigator.serviceWorker.getRegistration("resources/");
+    if (registration)
+        await registration.unregister();
+    registration = await navigator.serviceWorker.register("clone-opaque-being-loaded-response-worker.js", { scope : "resources/" });
+    activeWorker = registration.active;
+    if (activeWorker)
+        return;
+    activeWorker = registration.installing;
+    await new Promise(resolve => {
+        activeWorker.addEventListener('statechange', () => {
+            if (activeWorker.state === "activated")
+                resolve();
+        });
+    });
+}, "Setup worker");
+
+promise_test(async (test) => {
+    iframe = await with_iframe("resources/clone-opaque-being-loaded-response-iframe.html");
+    assert_equals(iframe.contentWindow.document.body.innerHTML.trim(), "PASS");
+    iframe.remove();
+}, "Ensure opaque response fetch is working");
+</script>
+</body>
+</html>

Added: trunk/LayoutTests/http/wpt/service-workers/resources/clone-opaque-being-loaded-response-iframe.html (0 => 227581)


--- trunk/LayoutTests/http/wpt/service-workers/resources/clone-opaque-being-loaded-response-iframe.html	                        (rev 0)
+++ trunk/LayoutTests/http/wpt/service-workers/resources/clone-opaque-being-loaded-response-iframe.html	2018-01-24 23:23:18 UTC (rev 227581)
@@ -0,0 +1,6 @@
+<html>
+<body>
+FAIL: body should be replaced when executing the script.
+<script src=""
+</body>
+</html>

Added: trunk/LayoutTests/http/wpt/service-workers/resources/lengthy-pass.py (0 => 227581)


--- trunk/LayoutTests/http/wpt/service-workers/resources/lengthy-pass.py	                        (rev 0)
+++ trunk/LayoutTests/http/wpt/service-workers/resources/lengthy-pass.py	2018-01-24 23:23:18 UTC (rev 227581)
@@ -0,0 +1,15 @@
+import time
+
+def main(request, response):
+    delay = 0.05
+    response.headers.set("Content-type", "text/_javascript_")
+    response.write_status_headers()
+    time.sleep(delay);
+    response.writer.write_content("document")
+    time.sleep(delay)
+    response.writer.write_content(".body")
+    time.sleep(delay)
+    response.writer.write_content(".innerHTML = ")
+    time.sleep(delay)
+    response.writer.write_content("'PASS'")
+    time.sleep(delay)

Modified: trunk/Source/WebCore/ChangeLog (227580 => 227581)


--- trunk/Source/WebCore/ChangeLog	2018-01-24 23:19:03 UTC (rev 227580)
+++ trunk/Source/WebCore/ChangeLog	2018-01-24 23:23:18 UTC (rev 227581)
@@ -1,3 +1,22 @@
+2018-01-24  Youenn Fablet  <you...@apple.com>
+
+        Opaque being-loaded responses should clone their body
+        https://bugs.webkit.org/show_bug.cgi?id=182056
+
+        Reviewed by Brady Eidson.
+
+        Test: http/wpt/service-workers/clone-opaque-being-loaded-response.https.html
+
+        When cloning a being-loaded response, make sure we create a ReadableStream.
+        Before the patch, the readableStream was not created in that case for opaque responses.
+
+        * Modules/fetch/FetchBodyOwner.cpp:
+        (WebCore::FetchBodyOwner::readableStream):
+        (WebCore::FetchBodyOwner::createReadableStream):
+        * Modules/fetch/FetchBodyOwner.h:
+        * Modules/fetch/FetchResponse.cpp:
+        (WebCore::FetchResponse::clone):
+
 2018-01-24  Chris Dumez  <cdu...@apple.com>
 
         close() operation should not be exposed inside a ServiceWorkerGlobalScope

Modified: trunk/Source/WebCore/Modules/fetch/FetchBodyOwner.cpp (227580 => 227581)


--- trunk/Source/WebCore/Modules/fetch/FetchBodyOwner.cpp	2018-01-24 23:19:03 UTC (rev 227580)
+++ trunk/Source/WebCore/Modules/fetch/FetchBodyOwner.cpp	2018-01-24 23:23:18 UTC (rev 227581)
@@ -290,19 +290,24 @@
     if (isBodyNullOrOpaque())
         return nullptr;
 
-    if (!m_body->hasReadableStream()) {
-        ASSERT(!m_readableStreamSource);
-        if (isDisturbed()) {
-            m_body->setReadableStream(ReadableStream::create(state, nullptr));
-            m_body->readableStream()->lock();
-        } else {
-            m_readableStreamSource = adoptRef(*new FetchBodySource(*this));
-            m_body->setReadableStream(ReadableStream::create(state, m_readableStreamSource));
-        }
-    }
+    if (!m_body->hasReadableStream())
+        createReadableStream(state);
+
     return m_body->readableStream();
 }
 
+void FetchBodyOwner::createReadableStream(JSC::ExecState& state)
+{
+    ASSERT(!m_readableStreamSource);
+    if (isDisturbed()) {
+        m_body->setReadableStream(ReadableStream::create(state, nullptr));
+        m_body->readableStream()->lock();
+    } else {
+        m_readableStreamSource = adoptRef(*new FetchBodySource(*this));
+        m_body->setReadableStream(ReadableStream::create(state, m_readableStreamSource));
+    }
+}
+
 void FetchBodyOwner::consumeBodyAsStream()
 {
     ASSERT(m_readableStreamSource);

Modified: trunk/Source/WebCore/Modules/fetch/FetchBodyOwner.h (227580 => 227581)


--- trunk/Source/WebCore/Modules/fetch/FetchBodyOwner.h	2018-01-24 23:19:03 UTC (rev 227580)
+++ trunk/Source/WebCore/Modules/fetch/FetchBodyOwner.h	2018-01-24 23:23:18 UTC (rev 227581)
@@ -76,6 +76,7 @@
     void consumeOnceLoadingFinished(FetchBodyConsumer::Type, Ref<DeferredPromise>&&);
 
     void setBody(FetchBody&& body) { m_body = WTFMove(body); }
+    void createReadableStream(JSC::ExecState&);
 
     // ActiveDOMObject API
     void stop() override;

Modified: trunk/Source/WebCore/Modules/fetch/FetchResponse.cpp (227580 => 227581)


--- trunk/Source/WebCore/Modules/fetch/FetchResponse.cpp	2018-01-24 23:19:03 UTC (rev 227580)
+++ trunk/Source/WebCore/Modules/fetch/FetchResponse.cpp	2018-01-24 23:23:18 UTC (rev 227581)
@@ -167,8 +167,8 @@
     ASSERT(scriptExecutionContext());
 
     // If loading, let's create a stream so that data is teed on both clones.
-    if (isLoading())
-        readableStream(*context.execState());
+    if (isLoading() && !m_readableStreamSource)
+        createReadableStream(*context.execState());
 
     // Synthetic responses do not store headers in m_internalResponse.
     if (m_internalResponse.type() == ResourceResponse::Type::Default)
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to