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)