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)