Title: [221704] trunk
Revision
221704
Author
[email protected]
Date
2017-09-06 14:25:19 -0700 (Wed, 06 Sep 2017)

Log Message

Support caching of Response with a ReadableStream body
https://bugs.webkit.org/show_bug.cgi?id=176462

Patch by Youenn Fablet <[email protected]> on 2017-09-06
Reviewed by Alex Christensen.

LayoutTests/imported/w3c:

* web-platform-tests/service-workers/cache-storage/worker/cache-put.https-expected.txt:

Source/WebCore:

Tests: http/wpt/cache-storage/cache-put-stream.https.any.html
       http/wpt/cache-storage/cache-put-stream.https.any.worker.html

Making FetchResponse use more of ReadableStream:
- Cloning of its body is done through ReadableStream.
- Computation of disturbed and locked is done through ReadableStream.
- Storing of the ReadableStream body given at constructor time is done in FetchBody for FetchResponse.
This allows making FetchResponse closer to FetchRequest.
This also allows to correctly compute disturbed and locked in clone cases.

Adding the ability to consume a Response ReadableStream body as a SharedBuffer.
Using that ability in DOMCache.

* Modules/cache/DOMCache.cpp:
(WebCore::DOMCache::putWithResponseData):
(WebCore::DOMCache::put):
* Modules/cache/DOMCache.h:
* Modules/fetch/FetchBody.h:
(WebCore::FetchBody::readableStream const):
* Modules/fetch/FetchBodyConsumer.cpp:
(WebCore::FetchBodyConsumer::extract):
* Modules/fetch/FetchBodyConsumer.h:
* Modules/fetch/FetchBodyOwner.cpp:
(WebCore::FetchBodyOwner::isDisturbed const):
(WebCore::FetchBodyOwner::isDisturbedOrLocked const):
* Modules/fetch/FetchBodyOwner.h:
(WebCore::FetchBodyOwner::hasReadableStreamBody const):
* Modules/fetch/FetchBodySource.cpp:
* Modules/fetch/FetchBodySource.h:
* Modules/fetch/FetchResponse.cpp:
(WebCore::FetchResponse::consumeBodyFromReadableStream):
(WebCore::FetchResponse::consumeBodyWhenLoaded):
(WebCore::FetchResponse::consumeBodyAsStream):
* Modules/fetch/FetchResponse.h:
* Modules/fetch/FetchResponse.idl:
* Modules/fetch/FetchResponse.js:
(initializeFetchResponse):
(clone):
* bindings/js/ReadableStream.cpp:
(WebCore::callFunction):
(WebCore::ReadableStream::pipeTo):
(WebCore::ReadableStream::tee):
(WebCore::checkReadableStream):
(WebCore::ReadableStream::isLocked const):
(WebCore::ReadableStream::isDisturbed const):
(WebCore::ReadableStream::isDisturbed):
* bindings/js/ReadableStream.h:
* bindings/js/ReadableStreamDefaultController.cpp:
* bindings/js/ReadableStreamDefaultController.h:
* bindings/js/WebCoreBuiltinNames.h:
* testing/Internals.cpp:
(WebCore::Internals::isReadableStreamDisturbed):

LayoutTests:

* TestExpectations: Removing flakiness expectation for cache-put tests.
* http/wpt/cache-storage/cache-put-stream.https.any-expected.txt: Added.
* http/wpt/cache-storage/cache-put-stream.https.any.html: Added.
* http/wpt/cache-storage/cache-put-stream.https.any.js: Added.
(cache_test.):
(cache_test):
(string_appeared_here.cache_test.return.reader.read.then.):
(string_appeared_here.cache_test):
* http/wpt/cache-storage/cache-put-stream.https.any.worker-expected.txt: Added.
* http/wpt/cache-storage/cache-put-stream.https.any.worker.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (221703 => 221704)


--- trunk/LayoutTests/ChangeLog	2017-09-06 21:04:25 UTC (rev 221703)
+++ trunk/LayoutTests/ChangeLog	2017-09-06 21:25:19 UTC (rev 221704)
@@ -1,3 +1,21 @@
+2017-09-06  Youenn Fablet  <[email protected]>
+
+        Support caching of Response with a ReadableStream body
+        https://bugs.webkit.org/show_bug.cgi?id=176462
+
+        Reviewed by Alex Christensen.
+
+        * TestExpectations: Removing flakiness expectation for cache-put tests.
+        * http/wpt/cache-storage/cache-put-stream.https.any-expected.txt: Added.
+        * http/wpt/cache-storage/cache-put-stream.https.any.html: Added.
+        * http/wpt/cache-storage/cache-put-stream.https.any.js: Added.
+        (cache_test.):
+        (cache_test):
+        (string_appeared_here.cache_test.return.reader.read.then.):
+        (string_appeared_here.cache_test):
+        * http/wpt/cache-storage/cache-put-stream.https.any.worker-expected.txt: Added.
+        * http/wpt/cache-storage/cache-put-stream.https.any.worker.html: Added.
+
 2017-09-06  Ryan Haddad  <[email protected]>
 
         Unreviewed, rolling out r221461.

Modified: trunk/LayoutTests/TestExpectations (221703 => 221704)


--- trunk/LayoutTests/TestExpectations	2017-09-06 21:04:25 UTC (rev 221703)
+++ trunk/LayoutTests/TestExpectations	2017-09-06 21:25:19 UTC (rev 221704)
@@ -123,8 +123,6 @@
 imported/w3c/web-platform-tests/service-workers/stub-4.6.2-cache.html [ Pass ]
 imported/w3c/web-platform-tests/service-workers/stub-4.6.3-cache-storage.html [ Pass ]
 imported/w3c/web-platform-tests/service-workers/cache-storage [ Pass ]
-imported/w3c/web-platform-tests/service-workers/cache-storage/window/cache-put.https.html [ Pass Failure ]
-imported/w3c/web-platform-tests/service-workers/cache-storage/worker/cache-put.https.html [ Pass Failure ]
 
 # textarea.animate is not supported
 imported/w3c/web-platform-tests/css/css-ui-3/caret-color-018.html [ Skip ]

Added: trunk/LayoutTests/http/wpt/cache-storage/cache-put-stream.https.any-expected.txt (0 => 221704)


--- trunk/LayoutTests/http/wpt/cache-storage/cache-put-stream.https.any-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/http/wpt/cache-storage/cache-put-stream.https.any-expected.txt	2017-09-06 21:25:19 UTC (rev 221704)
@@ -0,0 +1,4 @@
+
+PASS Cache.put should throw if response stream is locked 
+PASS Cache.put should throw if response stream is disturbed 
+

Added: trunk/LayoutTests/http/wpt/cache-storage/cache-put-stream.https.any.html (0 => 221704)


--- trunk/LayoutTests/http/wpt/cache-storage/cache-put-stream.https.any.html	                        (rev 0)
+++ trunk/LayoutTests/http/wpt/cache-storage/cache-put-stream.https.any.html	2017-09-06 21:25:19 UTC (rev 221704)
@@ -0,0 +1 @@
+<!-- This file is required for WebKit test infrastructure to run the templated test -->
\ No newline at end of file

Added: trunk/LayoutTests/http/wpt/cache-storage/cache-put-stream.https.any.js (0 => 221704)


--- trunk/LayoutTests/http/wpt/cache-storage/cache-put-stream.https.any.js	                        (rev 0)
+++ trunk/LayoutTests/http/wpt/cache-storage/cache-put-stream.https.any.js	2017-09-06 21:25:19 UTC (rev 221704)
@@ -0,0 +1,31 @@
+// META: script=/service-workers/cache-storage/resources/test-helpers.js
+
+var test_url = 'https://example.com/foo';
+var test_body = 'Hello world!';
+
+cache_test(function(cache) {
+    var stream = new ReadableStream();
+    stream.getReader();
+    var response = new Response(stream);
+    return cache.put(new Request(''), response).then(assert_unreached, (e) => {
+        assert_throws(new TypeError, function() { throw e });
+    });
+}, 'Cache.put should throw if response stream is locked')
+
+cache_test(function(cache) {
+    var stream = new ReadableStream({start: (c) => {
+        c.enqueue(new Uint8Array(1));
+        c.enqueue(new Uint8Array(1));
+        c.close();
+    }});
+    var reader = stream.getReader();
+    return reader.read().then(() => {
+        reader.releaseLock();
+        var response = new Response(stream);
+        return cache.put(new Request(''), response).then(assert_unreached, (e) => {
+            assert_throws(new TypeError, function() { throw e });
+        });
+    });
+}, 'Cache.put should throw if response stream is disturbed')
+
+done();

Added: trunk/LayoutTests/http/wpt/cache-storage/cache-put-stream.https.any.worker-expected.txt (0 => 221704)


--- trunk/LayoutTests/http/wpt/cache-storage/cache-put-stream.https.any.worker-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/http/wpt/cache-storage/cache-put-stream.https.any.worker-expected.txt	2017-09-06 21:25:19 UTC (rev 221704)
@@ -0,0 +1,4 @@
+
+PASS Cache.put should throw if response stream is locked 
+PASS Cache.put should throw if response stream is disturbed 
+

Added: trunk/LayoutTests/http/wpt/cache-storage/cache-put-stream.https.any.worker.html (0 => 221704)


--- trunk/LayoutTests/http/wpt/cache-storage/cache-put-stream.https.any.worker.html	                        (rev 0)
+++ trunk/LayoutTests/http/wpt/cache-storage/cache-put-stream.https.any.worker.html	2017-09-06 21:25:19 UTC (rev 221704)
@@ -0,0 +1 @@
+<!-- This file is required for WebKit test infrastructure to run the templated test -->
\ No newline at end of file

Modified: trunk/LayoutTests/imported/w3c/ChangeLog (221703 => 221704)


--- trunk/LayoutTests/imported/w3c/ChangeLog	2017-09-06 21:04:25 UTC (rev 221703)
+++ trunk/LayoutTests/imported/w3c/ChangeLog	2017-09-06 21:25:19 UTC (rev 221704)
@@ -1,3 +1,12 @@
+2017-09-06  Youenn Fablet  <[email protected]>
+
+        Support caching of Response with a ReadableStream body
+        https://bugs.webkit.org/show_bug.cgi?id=176462
+
+        Reviewed by Alex Christensen.
+
+        * web-platform-tests/service-workers/cache-storage/worker/cache-put.https-expected.txt:
+
 2017-09-06  Manuel Rego Casasnovas  <[email protected]>
 
         [css-grid] grid shorthand should not reset the gutter properties

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/cache-storage/worker/cache-put.https-expected.txt (221703 => 221704)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/cache-storage/worker/cache-put.https-expected.txt	2017-09-06 21:04:25 UTC (rev 221703)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/cache-storage/worker/cache-put.https-expected.txt	2017-09-06 21:25:19 UTC (rev 221704)
@@ -1,6 +1,6 @@
 
 PASS Cache.put called with simple Request and Response 
-FAIL Cache.put called with Request and Response from fetch() promise_test: Unhandled rejection with value: object "NotSupportedError: Caching a Response with data stored in a ReadableStream is not yet supported"
+PASS Cache.put called with Request and Response from fetch() 
 PASS Cache.put with Request without a body 
 PASS Cache.put with Response without a body 
 PASS Cache.put with a Response containing an empty URL 

Modified: trunk/Source/WebCore/ChangeLog (221703 => 221704)


--- trunk/Source/WebCore/ChangeLog	2017-09-06 21:04:25 UTC (rev 221703)
+++ trunk/Source/WebCore/ChangeLog	2017-09-06 21:25:19 UTC (rev 221704)
@@ -1,3 +1,63 @@
+2017-09-06  Youenn Fablet  <[email protected]>
+
+        Support caching of Response with a ReadableStream body
+        https://bugs.webkit.org/show_bug.cgi?id=176462
+
+        Reviewed by Alex Christensen.
+
+        Tests: http/wpt/cache-storage/cache-put-stream.https.any.html
+               http/wpt/cache-storage/cache-put-stream.https.any.worker.html
+
+        Making FetchResponse use more of ReadableStream:
+        - Cloning of its body is done through ReadableStream.
+        - Computation of disturbed and locked is done through ReadableStream.
+        - Storing of the ReadableStream body given at constructor time is done in FetchBody for FetchResponse.
+        This allows making FetchResponse closer to FetchRequest.
+        This also allows to correctly compute disturbed and locked in clone cases.
+
+        Adding the ability to consume a Response ReadableStream body as a SharedBuffer.
+        Using that ability in DOMCache.
+
+        * Modules/cache/DOMCache.cpp:
+        (WebCore::DOMCache::putWithResponseData):
+        (WebCore::DOMCache::put):
+        * Modules/cache/DOMCache.h:
+        * Modules/fetch/FetchBody.h:
+        (WebCore::FetchBody::readableStream const):
+        * Modules/fetch/FetchBodyConsumer.cpp:
+        (WebCore::FetchBodyConsumer::extract):
+        * Modules/fetch/FetchBodyConsumer.h:
+        * Modules/fetch/FetchBodyOwner.cpp:
+        (WebCore::FetchBodyOwner::isDisturbed const):
+        (WebCore::FetchBodyOwner::isDisturbedOrLocked const):
+        * Modules/fetch/FetchBodyOwner.h:
+        (WebCore::FetchBodyOwner::hasReadableStreamBody const):
+        * Modules/fetch/FetchBodySource.cpp:
+        * Modules/fetch/FetchBodySource.h:
+        * Modules/fetch/FetchResponse.cpp:
+        (WebCore::FetchResponse::consumeBodyFromReadableStream):
+        (WebCore::FetchResponse::consumeBodyWhenLoaded):
+        (WebCore::FetchResponse::consumeBodyAsStream):
+        * Modules/fetch/FetchResponse.h:
+        * Modules/fetch/FetchResponse.idl:
+        * Modules/fetch/FetchResponse.js:
+        (initializeFetchResponse):
+        (clone):
+        * bindings/js/ReadableStream.cpp:
+        (WebCore::callFunction):
+        (WebCore::ReadableStream::pipeTo):
+        (WebCore::ReadableStream::tee):
+        (WebCore::checkReadableStream):
+        (WebCore::ReadableStream::isLocked const):
+        (WebCore::ReadableStream::isDisturbed const):
+        (WebCore::ReadableStream::isDisturbed):
+        * bindings/js/ReadableStream.h:
+        * bindings/js/ReadableStreamDefaultController.cpp:
+        * bindings/js/ReadableStreamDefaultController.h:
+        * bindings/js/WebCoreBuiltinNames.h:
+        * testing/Internals.cpp:
+        (WebCore::Internals::isReadableStreamDisturbed):
+
 2017-09-06  Ryan Haddad  <[email protected]>
 
         Unreviewed, rolling out r221461.

Modified: trunk/Source/WebCore/Modules/cache/DOMCache.cpp (221703 => 221704)


--- trunk/Source/WebCore/Modules/cache/DOMCache.cpp	2017-09-06 21:04:25 UTC (rev 221703)
+++ trunk/Source/WebCore/Modules/cache/DOMCache.cpp	2017-09-06 21:25:19 UTC (rev 221704)
@@ -289,6 +289,21 @@
     }
 }
 
+void DOMCache::putWithResponseData(DOMPromiseDeferred<void>&& promise, Ref<FetchRequest>&& request, Ref<FetchResponse>&& response, ExceptionOr<RefPtr<SharedBuffer>>&& responseBody)
+{
+    if (responseBody.hasException()) {
+        promise.reject(responseBody.releaseException());
+        return;
+    }
+
+    DOMCacheEngine::ResponseBody body;
+    if (auto buffer = responseBody.releaseReturnValue())
+        body = buffer.releaseNonNull();
+    batchPutOperation(request.get(), response.get(), WTFMove(body), [promise = WTFMove(promise)](ExceptionOr<void>&& result) mutable {
+        promise.settle(WTFMove(result));
+    });
+}
+
 void DOMCache::put(RequestInfo&& info, Ref<FetchResponse>&& response, DOMPromiseDeferred<void>&& promise)
 {
     if (UNLIKELY(!scriptExecutionContext()))
@@ -312,14 +327,17 @@
         return;
     }
 
-    // FIXME: Add support for ReadableStream.
-    if (response->hasReadableStreamBody()) {
-        promise.reject(Exception { NotSupportedError, ASCIILiteral("Caching a Response with data stored in a ReadableStream is not yet supported") });
+    if (response->isDisturbedOrLocked()) {
+        promise.reject(Exception { TypeError, ASCIILiteral("Response is disturbed or locked") });
         return;
     }
 
-    if (response->isDisturbed()) {
-        promise.reject(Exception { TypeError, ASCIILiteral("Response is disturbed or locked") });
+    if (response->hasReadableStreamBody()) {
+        setPendingActivity(this);
+        response->consumeBodyFromReadableStream([promise = WTFMove(promise), request = WTFMove(request), response = WTFMove(response), this](ExceptionOr<RefPtr<SharedBuffer>>&& result) mutable {
+            putWithResponseData(WTFMove(promise), WTFMove(request), WTFMove(response), WTFMove(result));
+            unsetPendingActivity(this);
+        });
         return;
     }
 
@@ -326,16 +344,7 @@
     if (response->isLoading()) {
         setPendingActivity(this);
         response->consumeBodyWhenLoaded([promise = WTFMove(promise), request = WTFMove(request), response = WTFMove(response), this](ExceptionOr<RefPtr<SharedBuffer>>&& result) mutable {
-            if (result.hasException())
-                promise.reject(result.releaseException());
-            else {
-                DOMCacheEngine::ResponseBody body;
-                if (auto buffer = result.releaseReturnValue())
-                    body = buffer.releaseNonNull();
-                batchPutOperation(request.get(), response.get(), WTFMove(body), [promise = WTFMove(promise)](ExceptionOr<void>&& result) mutable {
-                    promise.settle(WTFMove(result));
-                });
-            }
+            putWithResponseData(WTFMove(promise), WTFMove(request), WTFMove(response), WTFMove(result));
             unsetPendingActivity(this);
         });
         return;

Modified: trunk/Source/WebCore/Modules/cache/DOMCache.h (221703 => 221704)


--- trunk/Source/WebCore/Modules/cache/DOMCache.h	2017-09-06 21:04:25 UTC (rev 221703)
+++ trunk/Source/WebCore/Modules/cache/DOMCache.h	2017-09-06 21:25:19 UTC (rev 221704)
@@ -69,6 +69,8 @@
     const char* activeDOMObjectName() const final;
     bool canSuspendForDocumentSuspension() const final;
 
+    void putWithResponseData(DOMPromiseDeferred<void>&&, Ref<FetchRequest>&&, Ref<FetchResponse>&&, ExceptionOr<RefPtr<SharedBuffer>>&&);
+
     void retrieveRecords(const URL&, WTF::Function<void(std::optional<Exception>&&)>&&);
     Vector<CacheStorageRecord> queryCacheWithTargetStorage(const FetchRequest&, const CacheQueryOptions&, const Vector<CacheStorageRecord>&);
     void queryCache(Ref<FetchRequest>&&, CacheQueryOptions&&, WTF::Function<void(ExceptionOr<Vector<CacheStorageRecord>>&&)>&&);

Modified: trunk/Source/WebCore/Modules/fetch/FetchBody.h (221703 => 221704)


--- trunk/Source/WebCore/Modules/fetch/FetchBody.h	2017-09-06 21:04:25 UTC (rev 221703)
+++ trunk/Source/WebCore/Modules/fetch/FetchBody.h	2017-09-06 21:25:19 UTC (rev 221704)
@@ -81,6 +81,7 @@
     void cleanConsumer() { m_consumer.clean(); }
 
     FetchBody clone();
+    const ReadableStream* readableStream() const { return m_readableStream.get(); }
     ReadableStream* readableStream() { return m_readableStream.get(); }
     void setReadableStream(Ref<ReadableStream>&& stream)
     {

Modified: trunk/Source/WebCore/Modules/fetch/FetchBodyConsumer.cpp (221703 => 221704)


--- trunk/Source/WebCore/Modules/fetch/FetchBodyConsumer.cpp	2017-09-06 21:04:25 UTC (rev 221703)
+++ trunk/Source/WebCore/Modules/fetch/FetchBodyConsumer.cpp	2017-09-06 21:25:19 UTC (rev 221704)
@@ -92,6 +92,13 @@
     resolveWithTypeAndData(WTFMove(promise), m_type, m_contentType, data, length);
 }
 
+void FetchBodyConsumer::extract(ReadableStream& stream, ReadableStreamToSharedBufferSink::Callback&& callback)
+{
+    ASSERT(!m_sink);
+    m_sink = ReadableStreamToSharedBufferSink::create(WTFMove(callback));
+    m_sink->pipeFrom(stream);
+}
+
 void FetchBodyConsumer::resolve(Ref<DeferredPromise>&& promise, ReadableStream* stream)
 {
     if (stream) {

Modified: trunk/Source/WebCore/Modules/fetch/FetchBodyConsumer.h (221703 => 221704)


--- trunk/Source/WebCore/Modules/fetch/FetchBodyConsumer.h	2017-09-06 21:04:25 UTC (rev 221703)
+++ trunk/Source/WebCore/Modules/fetch/FetchBodyConsumer.h	2017-09-06 21:25:19 UTC (rev 221704)
@@ -61,6 +61,7 @@
 
     void clean();
 
+    void extract(ReadableStream&, ReadableStreamToSharedBufferSink::Callback&&);
     void resolve(Ref<DeferredPromise>&&, ReadableStream*);
     void resolveWithData(Ref<DeferredPromise>&&, const unsigned char*, unsigned);
 

Modified: trunk/Source/WebCore/Modules/fetch/FetchBodyOwner.cpp (221703 => 221704)


--- trunk/Source/WebCore/Modules/fetch/FetchBodyOwner.cpp	2017-09-06 21:04:25 UTC (rev 221703)
+++ trunk/Source/WebCore/Modules/fetch/FetchBodyOwner.cpp	2017-09-06 21:25:19 UTC (rev 221704)
@@ -59,14 +59,33 @@
     }
 }
 
+bool FetchBodyOwner::isDisturbed() const
+{
+    if (isBodyNull())
+        return false;
+
+    if (m_isDisturbed)
+        return true;
+
+#if ENABLE(STREAMS_API)
+    if (body().readableStream())
+        return body().readableStream()->isDisturbed();
+#endif
+
+    return false;
+}
+
 bool FetchBodyOwner::isDisturbedOrLocked() const
 {
+    if (isBodyNull())
+        return false;
+
     if (m_isDisturbed)
         return true;
 
 #if ENABLE(STREAMS_API)
-    if (m_readableStreamSource && m_readableStreamSource->isReadableStreamLocked())
-        return true;
+    if (body().readableStream())
+        return body().readableStream()->isDisturbed() || body().readableStream()->isLocked();
 #endif
 
     return false;

Modified: trunk/Source/WebCore/Modules/fetch/FetchBodyOwner.h (221703 => 221704)


--- trunk/Source/WebCore/Modules/fetch/FetchBodyOwner.h	2017-09-06 21:04:25 UTC (rev 221703)
+++ trunk/Source/WebCore/Modules/fetch/FetchBodyOwner.h	2017-09-06 21:25:19 UTC (rev 221704)
@@ -48,7 +48,7 @@
     void json(Ref<DeferredPromise>&&);
     void text(Ref<DeferredPromise>&&);
 
-    bool isDisturbed() const { return m_isDisturbed; };
+    bool isDisturbed() const;
     bool isDisturbedOrLocked() const;
 
     void loadBlob(const Blob&, FetchBodyConsumer*);
@@ -56,7 +56,7 @@
     bool isActive() const { return !!m_blobLoader; }
 
     RefPtr<ReadableStream> readableStream(JSC::ExecState&);
-    virtual bool hasReadableStreamBody() const { return m_body && m_body->hasReadableStream(); }
+    bool hasReadableStreamBody() const { return m_body && m_body->hasReadableStream(); }
 
 #if ENABLE(STREAMS_API)
     virtual void consumeBodyAsStream();

Modified: trunk/Source/WebCore/Modules/fetch/FetchBodySource.cpp (221703 => 221704)


--- trunk/Source/WebCore/Modules/fetch/FetchBodySource.cpp	2017-09-06 21:04:25 UTC (rev 221703)
+++ trunk/Source/WebCore/Modules/fetch/FetchBodySource.cpp	2017-09-06 21:25:19 UTC (rev 221704)
@@ -38,11 +38,6 @@
 {
 }
 
-bool FetchBodySource::isReadableStreamLocked() const
-{
-    return controller().isControlledReadableStreamLocked();
-}
-
 void FetchBodySource::setActive()
 {
     m_bodyOwner.setPendingActivity(&m_bodyOwner);

Modified: trunk/Source/WebCore/Modules/fetch/FetchBodySource.h (221703 => 221704)


--- trunk/Source/WebCore/Modules/fetch/FetchBodySource.h	2017-09-06 21:04:25 UTC (rev 221703)
+++ trunk/Source/WebCore/Modules/fetch/FetchBodySource.h	2017-09-06 21:25:19 UTC (rev 221704)
@@ -47,7 +47,6 @@
     void error(const String&);
 
     bool isCancelling() const { return m_isCancelling; }
-    bool isReadableStreamLocked() const;
 
     void resolvePullPromise() { pullFinished(); }
 

Modified: trunk/Source/WebCore/Modules/fetch/FetchResponse.cpp (221703 => 221704)


--- trunk/Source/WebCore/Modules/fetch/FetchResponse.cpp	2017-09-06 21:04:25 UTC (rev 221703)
+++ trunk/Source/WebCore/Modules/fetch/FetchResponse.cpp	2017-09-06 21:25:19 UTC (rev 221704)
@@ -79,14 +79,6 @@
     updateContentType();
 }
 
-void FetchResponse::setBodyAsReadableStream()
-{
-    if (isBodyNull())
-        setBody(FetchBody::loadingBody());
-    m_isReadableStream = true;
-    updateContentType();
-}
-
 FetchResponse::FetchResponse(ScriptExecutionContext& context, std::optional<FetchBody>&& body, Ref<FetchHeaders>&& headers, ResourceResponse&& response)
     : FetchBodyOwner(context, WTFMove(body), WTFMove(headers))
     , m_response(WTFMove(response))
@@ -277,11 +269,22 @@
     return body().take();
 }
 
+void FetchResponse::consumeBodyFromReadableStream(ConsumeDataCallback&& callback)
+{
+    ASSERT(m_body);
+    ASSERT(m_body->readableStream());
+
+    ASSERT(!isDisturbed());
+    m_isDisturbed = true;
+
+    m_body->consumer().extract(*m_body->readableStream(), WTFMove(callback));
+}
+
 void FetchResponse::consumeBodyWhenLoaded(ConsumeDataCallback&& callback)
 {
     ASSERT(isLoading());
 
-    ASSERT(!m_isDisturbed);
+    ASSERT(!isDisturbed());
     m_isDisturbed = true;
 
     m_bodyLoader->setConsumeDataCallback(WTFMove(callback));
@@ -329,10 +332,11 @@
         return;
     }
 
-    m_isDisturbed = true;
     ASSERT(m_bodyLoader);
 
-    setBodyAsReadableStream();
+    if (isBodyNull())
+        setBody(FetchBody::loadingBody());
+    updateContentType();
 
     auto data = ""
     if (data) {

Modified: trunk/Source/WebCore/Modules/fetch/FetchResponse.h (221703 => 221704)


--- trunk/Source/WebCore/Modules/fetch/FetchResponse.h	2017-09-06 21:04:25 UTC (rev 221703)
+++ trunk/Source/WebCore/Modules/fetch/FetchResponse.h	2017-09-06 21:25:19 UTC (rev 221704)
@@ -71,7 +71,6 @@
 
     ExceptionOr<void> setStatus(int status, const String& statusText);
     void initializeWith(FetchBody::Init&&);
-    void setBodyAsReadableStream();
 
     Type type() const { return m_response.type(); }
     const String& url() const;
@@ -99,12 +98,10 @@
 
     using ConsumeDataCallback = WTF::Function<void(ExceptionOr<RefPtr<SharedBuffer>>&&)>;
     void consumeBodyWhenLoaded(ConsumeDataCallback&&);
+    void consumeBodyFromReadableStream(ConsumeDataCallback&&);
 
     const ResourceResponse& resourceResponse() const { return m_response; }
 
-    // FIXME: Remove this method and use FetchBodyOwner one once we have full support in DOM ReadableStream.
-    bool hasReadableStreamBody() const final { return m_isReadableStream; }
-
 private:
     FetchResponse(ScriptExecutionContext&, std::optional<FetchBody>&&, Ref<FetchHeaders>&&, ResourceResponse&&);
 
@@ -147,8 +144,6 @@
     std::optional<BodyLoader> m_bodyLoader;
     mutable String m_responseURL;
     bool m_shouldExposeBody { true };
-    // FIXME: Remove that flag once we have full support in DOM ReadableStream.
-    bool m_isReadableStream { false };
 
     FetchBodyConsumer m_consumer { FetchBodyConsumer::Type::ArrayBuffer  };
 };

Modified: trunk/Source/WebCore/Modules/fetch/FetchResponse.idl (221703 => 221704)


--- trunk/Source/WebCore/Modules/fetch/FetchResponse.idl	2017-09-06 21:04:25 UTC (rev 221703)
+++ trunk/Source/WebCore/Modules/fetch/FetchResponse.idl	2017-09-06 21:25:19 UTC (rev 221704)
@@ -85,5 +85,4 @@
     [PrivateIdentifier] void initializeWith(BodyInit body);
     [CallWith=ScriptState, NewObject, PrivateIdentifier] ReadableStream? createReadableStream();
     [PrivateIdentifier] boolean isDisturbed();
-    [PrivateIdentifier] void setBodyAsReadableStream();
 };

Modified: trunk/Source/WebCore/Modules/fetch/FetchResponse.js (221703 => 221704)


--- trunk/Source/WebCore/Modules/fetch/FetchResponse.js	2017-09-06 21:04:25 UTC (rev 221703)
+++ trunk/Source/WebCore/Modules/fetch/FetchResponse.js	2017-09-06 21:25:19 UTC (rev 221704)
@@ -49,11 +49,9 @@
 
         // FIXME: Use @isReadableStream once it is no longer guarded by STREAMS_API compilation guard.
         let isBodyReadableStream = (@isObject(body) && !!body.@readableStreamController);
-        if (isBodyReadableStream) {
+        if (isBodyReadableStream)
             this.@body = body;
-            this.@setBodyAsReadableStream();
-        } else
-            this.@initializeWith(body);
+        this.@initializeWith(body);
     }
 
     return this;
@@ -96,17 +94,15 @@
     if (@Response.prototype.@isDisturbed.@call(this) || (this.@body && @isReadableStreamLocked(this.@body)))
         @throwTypeError("Cannot clone a disturbed Response");
 
-    var cloned = @Response.prototype.@cloneForJS.@call(this);
-
     // Let's create @body if response body is loading to provide data to both clones.
     if (@Response.prototype.@isLoading.@call(this) && this.@body === @undefined)
         this.@body = @Response.prototype.@createReadableStream.@call(this);
 
-    if (this.@body) {
-        var teedReadableStreams = @readableStreamTee(this.@body, true);
-        this.@body = teedReadableStreams[0];
-        cloned.@body = teedReadableStreams[1];
-    }
+    var cloned = @Response.prototype.@cloneForJS.@call(this);
+
+    // Let's refresh @body with the cloned stream.
+    this.@body = @Response.prototype.@createReadableStream.@call(this);
+
     return cloned;
 }
 

Modified: trunk/Source/WebCore/bindings/js/ReadableStream.cpp (221703 => 221704)


--- trunk/Source/WebCore/bindings/js/ReadableStream.cpp	2017-09-06 21:04:25 UTC (rev 221703)
+++ trunk/Source/WebCore/bindings/js/ReadableStream.cpp	2017-09-06 21:25:19 UTC (rev 221704)
@@ -55,6 +55,17 @@
     return create(globalObject, *newReadableStream);
 }
 
+static inline JSC::JSValue callFunction(JSC::ExecState& state, JSC::JSValue jsFunction, JSC::JSValue thisValue, const JSC::ArgList& arguments)
+{
+    auto scope = DECLARE_CATCH_SCOPE(state.vm());
+    JSC::CallData callData;
+    auto callType = JSC::getCallData(jsFunction, callData);
+    ASSERT(callType != JSC::CallType::None);
+    auto result = call(&state, jsFunction, callType, callData, thisValue, arguments);
+    scope.assertNoException();
+    return result;
+}
+
 void ReadableStream::pipeTo(ReadableStreamSink& sink)
 {
     auto& state = *m_globalObject->globalExec();
@@ -64,13 +75,10 @@
     auto readableStreamPipeTo = m_globalObject->get(&state, privateName);
     ASSERT(readableStreamPipeTo.isFunction());
 
-    CallData callData;
-    CallType callType = getCallData(readableStreamPipeTo, callData);
-    ASSERT(callType != JSC::CallType::None);
     MarkedArgumentBuffer arguments;
     arguments.append(readableStream());
     arguments.append(toJS(&state, m_globalObject.get(), sink));
-    JSC::call(&state, readableStreamPipeTo, callType, callData, JSC::jsUndefined(), arguments);
+    callFunction(state, readableStreamPipeTo, JSC::jsUndefined(), arguments);
 }
 
 std::pair<Ref<ReadableStream>, Ref<ReadableStream>> ReadableStream::tee()
@@ -82,13 +90,10 @@
     auto readableStreamTee = m_globalObject->get(&state, privateName);
     ASSERT(readableStreamTee.isFunction());
 
-    CallData callData;
-    CallType callType = getCallData(readableStreamTee, callData);
-    ASSERT(callType != JSC::CallType::None);
     MarkedArgumentBuffer arguments;
     arguments.append(readableStream());
     arguments.append(JSC::jsBoolean(true));
-    JSValue returnedValue = JSC::call(&state, readableStreamTee, callType, callData, JSC::jsUndefined(), arguments);
+    auto returnedValue = callFunction(state, readableStreamTee, JSC::jsUndefined(), arguments);
 
     auto results = Detail::SequenceConverter<IDLInterface<ReadableStream>>::convert(state, returnedValue);
 
@@ -96,4 +101,33 @@
     return std::make_pair(results[0].releaseNonNull(), results[1].releaseNonNull());
 }
 
+static inline bool checkReadableStream(JSDOMGlobalObject& globalObject, JSReadableStream* readableStream, JSC::JSValue function)
+{
+    auto& state = *globalObject.globalExec();
+
+    ASSERT(function);
+    JSC::MarkedArgumentBuffer arguments;
+    arguments.append(readableStream);
+    return callFunction(state, function, JSC::jsUndefined(), arguments).isTrue();
 }
+
+bool ReadableStream::isLocked() const
+{
+    return checkReadableStream(*globalObject(), readableStream(), globalObject()->builtinInternalFunctions().readableStreamInternals().m_isReadableStreamLockedFunction.get());
+}
+
+bool ReadableStream::isDisturbed() const
+{
+    return checkReadableStream(*globalObject(), readableStream(), globalObject()->builtinInternalFunctions().readableStreamInternals().m_isReadableStreamDisturbedFunction.get());
+}
+
+bool ReadableStream::isDisturbed(ExecState& state, JSValue value)
+{
+    auto& vm = state.vm();
+    auto& globalObject = *jsDynamicDowncast<JSDOMGlobalObject*>(vm, state.lexicalGlobalObject());
+    auto* readableStream = jsDynamicDowncast<JSReadableStream*>(vm, value);
+
+    return checkReadableStream(globalObject, readableStream, globalObject.builtinInternalFunctions().readableStreamInternals().m_isReadableStreamDisturbedFunction.get());
+}
+
+}

Modified: trunk/Source/WebCore/bindings/js/ReadableStream.h (221703 => 221704)


--- trunk/Source/WebCore/bindings/js/ReadableStream.h	2017-09-06 21:04:25 UTC (rev 221703)
+++ trunk/Source/WebCore/bindings/js/ReadableStream.h	2017-09-06 21:25:19 UTC (rev 221704)
@@ -41,11 +41,15 @@
 
     static Ref<ReadableStream> create(JSC::ExecState&, RefPtr<ReadableStreamSource>&&);
 
+    WEBCORE_EXPORT static bool isDisturbed(JSC::ExecState&, JSC::JSValue);
+
     std::pair<Ref<ReadableStream>, Ref<ReadableStream>> tee();
 
     void pipeTo(ReadableStreamSink&);
+    bool isLocked() const;
+    bool isDisturbed() const;
 
-    JSReadableStream* readableStream() { return guarded(); }
+    JSReadableStream* readableStream() const { return guarded(); }
 
 protected:
     ReadableStream(JSDOMGlobalObject& globalObject, JSReadableStream& readableStream) : DOMGuarded<JSReadableStream>(globalObject, readableStream) { }

Modified: trunk/Source/WebCore/bindings/js/ReadableStreamDefaultController.cpp (221703 => 221704)


--- trunk/Source/WebCore/bindings/js/ReadableStreamDefaultController.cpp	2017-09-06 21:04:25 UTC (rev 221703)
+++ trunk/Source/WebCore/bindings/js/ReadableStreamDefaultController.cpp	2017-09-06 21:25:19 UTC (rev 221704)
@@ -69,29 +69,6 @@
     return callFunction(state, function, &object, arguments);
 }
 
-bool ReadableStreamDefaultController::isControlledReadableStreamLocked() const
-{
-    auto& globalObject = this->globalObject();
-    JSC::VM& vm = globalObject.vm();
-    JSC::JSLockHolder lock(vm);
-    auto scope = DECLARE_CATCH_SCOPE(vm);
-    auto& state = globalExec();
-
-    auto& clientData = *static_cast<JSVMClientData*>(vm.clientData);
-    auto readableStream = m_jsController->get(&state, clientData.builtinNames().controlledReadableStreamPrivateName());
-    scope.assertNoException();
-
-    auto* isLocked = globalObject.builtinInternalFunctions().readableStreamInternals().m_isReadableStreamLockedFunction.get();
-    ASSERT(isLocked);
-
-    JSC::MarkedArgumentBuffer arguments;
-    arguments.append(readableStream);
-    auto result = callFunction(state, isLocked, JSC::jsUndefined(), arguments);
-    scope.assertNoException();
-
-    return result.isTrue();
-}
-
 } // namespace WebCore
 
 #endif // ENABLE(STREAMS_API)

Modified: trunk/Source/WebCore/bindings/js/ReadableStreamDefaultController.h (221703 => 221704)


--- trunk/Source/WebCore/bindings/js/ReadableStreamDefaultController.h	2017-09-06 21:04:25 UTC (rev 221703)
+++ trunk/Source/WebCore/bindings/js/ReadableStreamDefaultController.h	2017-09-06 21:25:19 UTC (rev 221704)
@@ -54,8 +54,6 @@
 
     void close() { invoke(*globalObject().globalExec(), jsController(), "close", JSC::jsUndefined()); }
 
-    bool isControlledReadableStreamLocked() const;
-
 private:
     void error(JSC::ExecState& state, JSC::JSValue value) { invoke(state, jsController(), "error", value); }
     void enqueue(JSC::ExecState& state, JSC::JSValue value) { invoke(state, jsController(), "enqueue", value); }

Modified: trunk/Source/WebCore/bindings/js/WebCoreBuiltinNames.h (221703 => 221704)


--- trunk/Source/WebCore/bindings/js/WebCoreBuiltinNames.h	2017-09-06 21:04:25 UTC (rev 221703)
+++ trunk/Source/WebCore/bindings/js/WebCoreBuiltinNames.h	2017-09-06 21:25:19 UTC (rev 221704)
@@ -232,7 +232,6 @@
     macro(retrieveResponse) \
     macro(self) \
     macro(setBody) \
-    macro(setBodyAsReadableStream) \
     macro(setBodyFromInputRequest) \
     macro(setStatus) \
     macro(showModalDialog) \

Modified: trunk/Source/WebCore/testing/Internals.cpp (221703 => 221704)


--- trunk/Source/WebCore/testing/Internals.cpp	2017-09-06 21:04:25 UTC (rev 221703)
+++ trunk/Source/WebCore/testing/Internals.cpp	2017-09-06 21:25:19 UTC (rev 221704)
@@ -109,6 +109,7 @@
 #include "PrintContext.h"
 #include "PseudoElement.h"
 #include "Range.h"
+#include "ReadableStream.h"
 #include "RenderEmbeddedObject.h"
 #include "RenderLayerBacking.h"
 #include "RenderLayerCompositor.h"
@@ -3796,25 +3797,7 @@
 
 bool Internals::isReadableStreamDisturbed(JSC::ExecState& state, JSValue stream)
 {
-    JSGlobalObject* globalObject = state.vmEntryGlobalObject();
-    JSVMClientData* clientData = static_cast<JSVMClientData*>(state.vm().clientData);
-    const Identifier& privateName = clientData->builtinFunctions().readableStreamInternalsBuiltins().isReadableStreamDisturbedPrivateName();
-    JSValue value;
-    PropertySlot propertySlot(value, PropertySlot::InternalMethodType::Get);
-    globalObject->methodTable()->getOwnPropertySlot(globalObject, &state, privateName, propertySlot);
-    value = propertySlot.getValue(&state, privateName);
-    ASSERT(value.isFunction());
-
-    JSObject* function = value.getObject();
-    CallData callData;
-    CallType callType = JSC::getCallData(function, callData);
-    ASSERT(callType != JSC::CallType::None);
-    MarkedArgumentBuffer arguments;
-    arguments.append(stream);
-    JSValue returnedValue = JSC::call(&state, function, callType, callData, JSC::jsUndefined(), arguments);
-    ASSERT(returnedValue.isBoolean());
-
-    return returnedValue.asBoolean();
+    return ReadableStream::isDisturbed(state, stream);
 }
 
 JSValue Internals::cloneArrayBuffer(JSC::ExecState& state, JSValue buffer, JSValue srcByteOffset, JSValue srcLength)
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to