Changeset 227760 in webkit
- Timestamp:
- Jan 29, 2018, 3:39:21 PM (9 years ago)
- Location:
- trunk
- Files:
-
- 4 added
- 10 edited
-
LayoutTests/imported/w3c/ChangeLog (modified) (1 diff)
-
LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event-respond-with-readable-stream-chunk.https-expected.txt (added)
-
LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event-respond-with-readable-stream-chunk.https.html (added)
-
LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/fetch-event-respond-with-readable-stream-chunk-worker.js (added)
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/Modules/cache/DOMCache.cpp (modified) (2 diffs)
-
Source/WebCore/Modules/fetch/FetchBodyConsumer.cpp (modified) (3 diffs)
-
Source/WebCore/Modules/fetch/FetchResponse.cpp (modified) (2 diffs)
-
Source/WebCore/Modules/fetch/FetchResponse.h (modified) (3 diffs)
-
Source/WebCore/Modules/streams/ReadableStreamChunk.h (added)
-
Source/WebCore/Modules/streams/ReadableStreamSink.cpp (modified) (1 diff)
-
Source/WebCore/Modules/streams/ReadableStreamSink.h (modified) (5 diffs)
-
Source/WebCore/WebCore.xcodeproj/project.pbxproj (modified) (4 diffs)
-
Source/WebCore/workers/service/context/ServiceWorkerFetch.cpp (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/imported/w3c/ChangeLog
r227714 r227760 1 2018-01-29 Oleksandr Skachkov <gskachkov@gmail.com> 2 3 FetchResponse should support ConsumeData callback on chunk data is received: handling ReadableStream bodies 4 https://bugs.webkit.org/show_bug.cgi?id=182008 5 6 Reviewed by Youenn Fablet. 7 8 * web-platform-tests/service-workers/service-worker/fetch-event-respond-with-readable-stream-chunk.https-expected.txt: Added. 9 * web-platform-tests/service-workers/service-worker/fetch-event-respond-with-readable-stream-chunk.https.html: Added. 10 * web-platform-tests/service-workers/service-worker/resources/fetch-event-respond-with-readable-stream-chunk-iframe.html: Added. 11 * web-platform-tests/service-workers/service-worker/resources/fetch-event-respond-with-readable-stream-chunk-worker.js: Added. 12 (const.process): 13 (this.step): 14 (this.run): 15 (const.asyncSteps): 16 1 17 2018-01-26 Antoine Quint <graouts@apple.com> 2 18 -
trunk/Source/WebCore/ChangeLog
r227759 r227760 1 2018-01-29 Oleksandr Skachkov <gskachkov@gmail.com> 2 3 FetchResponse should support ConsumeData callback on chunk data is received: handling ReadableStream bodies 4 https://bugs.webkit.org/show_bug.cgi?id=182008 5 6 Reviewed by Youenn Fablet. 7 8 Modify FetchResponse to support ConsumeData callback with 9 handling of ReadableStream by chunks 10 11 * Modules/cache/DOMCache.cpp: 12 (WebCore::DOMCache::put): 13 * Modules/fetch/FetchBodyConsumer.cpp: 14 (WebCore::FetchBodyConsumer::resolve): 15 * Modules/fetch/FetchResponse.cpp: 16 (WebCore::FetchResponse::consumeBodyFromReadableStream): 17 * Modules/fetch/FetchResponse.h: 18 * Modules/streams/ReadableStreamChunk.h: Added. 19 * Modules/streams/ReadableStreamSink.cpp: 20 (WebCore::ReadableStreamToSharedBufferSink::enqueue): 21 (WebCore::ReadableStreamToSharedBufferSink::close): 22 * Modules/streams/ReadableStreamSink.h: 23 * WebCore.xcodeproj/project.pbxproj: 24 * workers/service/context/ServiceWorkerFetch.cpp: 25 (WebCore::ServiceWorkerFetch::processResponse): 26 1 27 2018-01-29 Andy Estes <aestes@apple.com> 2 28 -
trunk/Source/WebCore/Modules/cache/DOMCache.cpp
r227339 r227760 32 32 #include "JSFetchRequest.h" 33 33 #include "JSFetchResponse.h" 34 #include "ReadableStreamChunk.h" 34 35 #include "ScriptExecutionContext.h" 35 36 #include "URL.h" … … 333 334 334 335 if (response->hasReadableStreamBody()) { 335 setPendingActivity(this); 336 response->consumeBodyFromReadableStream([promise = WTFMove(promise), request = WTFMove(request), response = WTFMove(response), this](ExceptionOr<RefPtr<SharedBuffer>>&& result) mutable { 337 putWithResponseData(WTFMove(promise), WTFMove(request), WTFMove(response), WTFMove(result)); 338 unsetPendingActivity(this); 336 response->consumeBodyFromReadableStream([promise = WTFMove(promise), request = WTFMove(request), response = WTFMove(response), data = SharedBuffer::create(), pendingActivity = makePendingActivity(*this), this](auto&& result) mutable { 337 338 if (result.hasException()) { 339 this->putWithResponseData(WTFMove(promise), WTFMove(request), WTFMove(response), result.releaseException().isolatedCopy()); 340 return; 341 } 342 343 if (auto chunk = result.returnValue()) 344 data->append(reinterpret_cast<const char*>(chunk->data), chunk->size); 345 else 346 this->putWithResponseData(WTFMove(promise), WTFMove(request), WTFMove(response), RefPtr<SharedBuffer> { WTFMove(data) }); 339 347 }); 340 348 return; -
trunk/Source/WebCore/Modules/fetch/FetchBodyConsumer.cpp
r221772 r227760 31 31 32 32 #include "JSBlob.h" 33 #include "ReadableStreamChunk.h" 33 34 #include "TextResourceDecoder.h" 34 35 … … 104 105 if (stream) { 105 106 ASSERT(!m_sink); 106 m_sink = ReadableStreamToSharedBufferSink::create([promise = WTFMove(promise), type = m_type, contentType = m_contentType](ExceptionOr<RefPtr<SharedBuffer>>&& result) mutable {107 m_sink = ReadableStreamToSharedBufferSink::create([promise = WTFMove(promise), data = SharedBuffer::create(), type = m_type, contentType = m_contentType](auto&& result) mutable { 107 108 if (result.hasException()) { 108 109 promise->reject(result.releaseException()); … … 110 111 } 111 112 112 auto* data = result.returnValue() && result.returnValue()->data() ? reinterpret_cast<const unsigned char*>(result.returnValue()->data()) : nullptr; 113 auto size = data ? result.returnValue()->size() : 0; 114 resolveWithTypeAndData(WTFMove(promise), type, contentType, data, size); 113 if (auto chunk = result.returnValue()) 114 data->append(reinterpret_cast<const char*>(chunk->data), chunk->size); 115 else 116 resolveWithTypeAndData(WTFMove(promise), type, contentType, reinterpret_cast<const unsigned char*>(data->data()), data->size()); 115 117 }); 116 118 m_sink->pipeFrom(*stream); -
trunk/Source/WebCore/Modules/fetch/FetchResponse.cpp
r227581 r227760 34 34 #include "JSBlob.h" 35 35 #include "MIMETypeRegistry.h" 36 #include "ReadableStreamSink.h" 36 37 #include "ResourceError.h" 37 38 #include "ScriptExecutionContext.h" … … 340 341 } 341 342 342 void FetchResponse::consumeBodyFromReadableStream(ConsumeData Callback&& callback)343 void FetchResponse::consumeBodyFromReadableStream(ConsumeDataByChunkCallback&& callback) 343 344 { 344 345 ASSERT(m_body); -
trunk/Source/WebCore/Modules/fetch/FetchResponse.h
r227339 r227760 31 31 #include "FetchBodyOwner.h" 32 32 #include "FetchHeaders.h" 33 #include "ReadableStreamSink.h" 33 34 #include "ResourceResponse.h" 34 35 #include <runtime/TypedArrays.h> … … 42 43 43 44 class FetchRequest; 45 struct ReadableStreamChunk; 44 46 class ReadableStreamSource; 45 47 … … 94 96 using ConsumeDataCallback = WTF::Function<void(ExceptionOr<RefPtr<SharedBuffer>>&&)>; 95 97 void consumeBodyWhenLoaded(ConsumeDataCallback&&); 96 void consumeBodyFromReadableStream(ConsumeDataCallback&&); 98 99 using ConsumeDataByChunkCallback = WTF::Function<void(ExceptionOr<ReadableStreamChunk*>&&)>; 100 void consumeBodyFromReadableStream(ConsumeDataByChunkCallback&&); 97 101 98 102 WEBCORE_EXPORT ResourceResponse resourceResponse() const; -
trunk/Source/WebCore/Modules/streams/ReadableStreamSink.cpp
r224903 r227760 52 52 return; 53 53 54 if ( !m_data) {55 m_data = SharedBuffer::create(buffer.data(), buffer.length());56 return;54 if (m_callback) { 55 ReadableStreamChunk chunk { buffer.data(), buffer.length() }; 56 m_callback(&chunk); 57 57 } 58 m_data->append(reinterpret_cast<const char*>(buffer.data()), buffer.length());59 58 } 60 59 61 60 void ReadableStreamToSharedBufferSink::close() 62 61 { 63 if ( auto callback = WTFMove(m_callback))64 callback(WTFMove(m_data));62 if (m_callback) 63 m_callback(nullptr); 65 64 } 66 65 -
trunk/Source/WebCore/Modules/streams/ReadableStreamSink.h
r221504 r227760 30 30 31 31 #include "ExceptionOr.h" 32 #include "ReadableStreamChunk.h" 32 33 #include <wtf/Function.h> 33 34 #include <wtf/RefCounted.h> … … 37 38 class BufferSource; 38 39 class ReadableStream; 40 struct ReadableStreamChunk; 39 41 class SharedBuffer; 40 42 … … 50 52 class ReadableStreamToSharedBufferSink final : public ReadableStreamSink { 51 53 public: 52 using Callback = WTF::Function<void(ExceptionOr<Re fPtr<SharedBuffer>>&&)>;54 using Callback = WTF::Function<void(ExceptionOr<ReadableStreamChunk*>&&)>; 53 55 static Ref<ReadableStreamToSharedBufferSink> create(Callback&& callback) { return adoptRef(*new ReadableStreamToSharedBufferSink(WTFMove(callback))); } 54 56 void pipeFrom(ReadableStream&); … … 56 58 57 59 private: 58 ReadableStreamToSharedBufferSink(Callback&&);60 explicit ReadableStreamToSharedBufferSink(Callback&&); 59 61 60 62 void enqueue(const BufferSource&) final; … … 63 65 64 66 Callback m_callback; 65 RefPtr<SharedBuffer> m_data;66 67 }; 67 68 -
trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj
r227714 r227760 2390 2390 8AF4E55611DC5A36000ED3DE /* PerformanceNavigation.h in Headers */ = {isa = PBXBuildFile; fileRef = 8AF4E55311DC5A36000ED3DE /* PerformanceNavigation.h */; }; 2391 2391 8AF4E55C11DC5A63000ED3DE /* PerformanceTiming.h in Headers */ = {isa = PBXBuildFile; fileRef = 8AF4E55911DC5A63000ED3DE /* PerformanceTiming.h */; }; 2392 8BD37A68201BB39C0011734A /* ReadableStreamChunk.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BD37A67201BB39C0011734A /* ReadableStreamChunk.h */; settings = {ATTRIBUTES = (Private, ); }; }; 2392 2393 8E4C96DD1AD4483500365A50 /* JSFetchResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E4C96D91AD4483500365A50 /* JSFetchResponse.h */; }; 2393 2394 8EC6C963201A251600FBFA53 /* GapLength.h in Headers */ = {isa = PBXBuildFile; fileRef = 8EC6C961201A250100FBFA53 /* GapLength.h */; settings = {ATTRIBUTES = (Private, ); }; }; … … 9938 9939 8AF4E55A11DC5A63000ED3DE /* PerformanceTiming.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = PerformanceTiming.idl; sourceTree = "<group>"; }; 9939 9940 8E33CD93201A29C100E39093 /* GapLength.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GapLength.cpp; sourceTree = "<group>"; }; 9941 8BD37A67201BB39C0011734A /* ReadableStreamChunk.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ReadableStreamChunk.h; sourceTree = "<group>"; }; 9940 9942 8E4C96D81AD4483500365A50 /* JSFetchResponse.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSFetchResponse.cpp; sourceTree = "<group>"; }; 9941 9943 8E4C96D91AD4483500365A50 /* JSFetchResponse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSFetchResponse.h; sourceTree = "<group>"; }; … … 16569 16571 41189EF71AD8232800B95672 /* ReadableStreamBYOBRequest.idl */, 16570 16572 9908B0F01BCACF9100ED5672 /* ReadableStreamBYOBRequest.js */, 16573 8BD37A67201BB39C0011734A /* ReadableStreamChunk.h */, 16571 16574 41189EF71AD8232800B90A0D /* ReadableStreamDefaultController.idl */, 16572 16575 9908B0F01BCACF9100ED0F65 /* ReadableStreamDefaultController.js */, … … 29093 29096 416E6FE81BBD12DF000A6043 /* ReadableByteStreamInternalsBuiltins.h in Headers */, 29094 29097 416E6FE91BBD12E5000A6043 /* ReadableStreamBuiltins.h in Headers */, 29098 8BD37A68201BB39C0011734A /* ReadableStreamChunk.h in Headers */, 29095 29099 4129C9A91F59C56B009D7403 /* ReadableStreamDefaultController.h in Headers */, 29096 29100 416E6FE81BBD12DF000A3F64 /* ReadableStreamInternalsBuiltins.h in Headers */, -
trunk/Source/WebCore/workers/service/context/ServiceWorkerFetch.cpp
r227070 r227760 34 34 #include "FetchRequest.h" 35 35 #include "FetchResponse.h" 36 #include "ReadableStreamChunk.h" 36 37 #include "ResourceRequest.h" 37 38 #include "ServiceWorker.h" … … 54 55 55 56 if (response->hasReadableStreamBody()) { 56 // FIXME: We should send the body as chunks. 57 response->consumeBodyFromReadableStream([client = WTFMove(client)] (ExceptionOr<RefPtr<SharedBuffer>>&& result) mutable { 57 response->consumeBodyFromReadableStream([client = WTFMove(client)] (auto&& result) mutable { 58 58 if (result.hasException()) { 59 59 client->didFail(); … … 61 61 } 62 62 63 if (auto buffer = result.releaseReturnValue()) 64 client->didReceiveData(buffer.releaseNonNull()); 65 client->didFinish(); 63 if (auto chunk = result.returnValue()) 64 client->didReceiveData(SharedBuffer::create(reinterpret_cast<const char*>(chunk->data), chunk->size)); 65 else 66 client->didFinish(); 66 67 }); 67 68 return;
Note:
See TracChangeset
for help on using the changeset viewer.