Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(787)

Side by Side Diff: third_party/WebKit/Source/modules/serviceworkers/FetchRespondWithObserver.cpp

Issue 2703343002: ServiceWorker: Use mojo's data pipe for respondWith(stream) (Closed)
Patch Set: Update comments Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "modules/serviceworkers/FetchRespondWithObserver.h" 5 #include "modules/serviceworkers/FetchRespondWithObserver.h"
6 6
7 #include <v8.h> 7 #include <v8.h>
8 #include "bindings/core/v8/ScriptValue.h" 8 #include "bindings/core/v8/ScriptValue.h"
9 #include "bindings/core/v8/V8Binding.h" 9 #include "bindings/core/v8/V8Binding.h"
10 #include "bindings/modules/v8/V8Response.h" 10 #include "bindings/modules/v8/V8Response.h"
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
106 return frame_type != WebURLRequest::kFrameTypeNone; 106 return frame_type != WebURLRequest::kFrameTypeNone;
107 } 107 }
108 108
109 bool IsClientRequest(WebURLRequest::FrameType frame_type, 109 bool IsClientRequest(WebURLRequest::FrameType frame_type,
110 WebURLRequest::RequestContext request_context) { 110 WebURLRequest::RequestContext request_context) {
111 return IsNavigationRequest(frame_type) || 111 return IsNavigationRequest(frame_type) ||
112 request_context == WebURLRequest::kRequestContextSharedWorker || 112 request_context == WebURLRequest::kRequestContextSharedWorker ||
113 request_context == WebURLRequest::kRequestContextWorker; 113 request_context == WebURLRequest::kRequestContextWorker;
114 } 114 }
115 115
116 class NoopLoaderClient final 116 class FetchLoaderClient final
haraken 2017/04/19 11:29:10 Add a class-level comment. e.g., why this indirect
shimazu 2017/04/20 04:20:42 Done.
117 : public GarbageCollectedFinalized<NoopLoaderClient>, 117 : public GarbageCollectedFinalized<FetchLoaderClient>,
118 public FetchDataLoader::Client { 118 public FetchDataLoader::Client {
119 WTF_MAKE_NONCOPYABLE(NoopLoaderClient); 119 WTF_MAKE_NONCOPYABLE(FetchLoaderClient);
120 USING_GARBAGE_COLLECTED_MIXIN(NoopLoaderClient); 120 USING_GARBAGE_COLLECTED_MIXIN(FetchLoaderClient);
121 121
122 public: 122 public:
123 NoopLoaderClient() = default; 123 explicit FetchLoaderClient(
124 void DidFetchDataLoadedStream() override {} 124 std::unique_ptr<WebServiceWorkerStreamHandle> handle)
125 void DidFetchDataLoadFailed() override {} 125 : handle_(std::move(handle)) {}
126
127 void DidFetchDataLoadedDataPipe() override { handle_->Completed(); }
128 void DidFetchDataLoadFailed() override { handle_->Aborted(); }
129
126 DEFINE_INLINE_TRACE() { FetchDataLoader::Client::Trace(visitor); } 130 DEFINE_INLINE_TRACE() { FetchDataLoader::Client::Trace(visitor); }
131
132 private:
133 std::unique_ptr<WebServiceWorkerStreamHandle> handle_;
127 }; 134 };
128 135
129 } // namespace 136 } // namespace
130 137
131 FetchRespondWithObserver* FetchRespondWithObserver::Create( 138 FetchRespondWithObserver* FetchRespondWithObserver::Create(
132 ExecutionContext* context, 139 ExecutionContext* context,
133 int fetch_event_id, 140 int fetch_event_id,
134 const KURL& request_url, 141 const KURL& request_url,
135 WebURLRequest::FetchRequestMode request_mode, 142 WebURLRequest::FetchRequestMode request_mode,
136 WebURLRequest::FetchRedirectMode redirect_mode, 143 WebURLRequest::FetchRedirectMode redirect_mode,
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
215 return; 222 return;
216 } 223 }
217 224
218 WebServiceWorkerResponse web_response; 225 WebServiceWorkerResponse web_response;
219 response->PopulateWebServiceWorkerResponse(web_response); 226 response->PopulateWebServiceWorkerResponse(web_response);
220 BodyStreamBuffer* buffer = response->InternalBodyBuffer(); 227 BodyStreamBuffer* buffer = response->InternalBodyBuffer();
221 if (buffer) { 228 if (buffer) {
222 RefPtr<BlobDataHandle> blob_data_handle = buffer->DrainAsBlobDataHandle( 229 RefPtr<BlobDataHandle> blob_data_handle = buffer->DrainAsBlobDataHandle(
223 BytesConsumer::BlobSizePolicy::kAllowBlobWithInvalidSize); 230 BytesConsumer::BlobSizePolicy::kAllowBlobWithInvalidSize);
224 if (blob_data_handle) { 231 if (blob_data_handle) {
232 // Handle the blob response.
225 web_response.SetBlobDataHandle(blob_data_handle); 233 web_response.SetBlobDataHandle(blob_data_handle);
226 } else { 234 ServiceWorkerGlobalScopeClient::From(GetExecutionContext())
227 Stream* out_stream = Stream::Create(GetExecutionContext(), ""); 235 ->RespondToFetchEvent(event_id_, web_response, event_dispatch_time_);
228 web_response.SetStreamURL(out_stream->Url()); 236 return;
229 buffer->StartLoading(FetchDataLoader::CreateLoaderAsStream(out_stream),
230 new NoopLoaderClient);
231 } 237 }
238 // Handle the stream response.
239 mojo::DataPipe data_pipe;
240 DCHECK(data_pipe.producer_handle.is_valid());
241 DCHECK(data_pipe.consumer_handle.is_valid());
242
243 std::unique_ptr<WebServiceWorkerStreamHandle> body_stream_handle =
244 WTF::MakeUnique<WebServiceWorkerStreamHandle>(
245 std::move(data_pipe.consumer_handle));
246 ServiceWorkerGlobalScopeClient::From(GetExecutionContext())
247 ->RespondToFetchEventWithResponseStream(event_id_, web_response,
248 body_stream_handle.get(),
249 event_dispatch_time_);
250
251 buffer->StartLoading(FetchDataLoader::CreateLoaderAsDataPipe(
252 std::move(data_pipe.producer_handle)),
253 new FetchLoaderClient(std::move(body_stream_handle)));
254 return;
232 } 255 }
233 ServiceWorkerGlobalScopeClient::From(GetExecutionContext()) 256 ServiceWorkerGlobalScopeClient::From(GetExecutionContext())
234 ->RespondToFetchEvent(event_id_, web_response, event_dispatch_time_); 257 ->RespondToFetchEvent(event_id_, web_response, event_dispatch_time_);
235 } 258 }
236 259
237 void FetchRespondWithObserver::OnNoResponse() { 260 void FetchRespondWithObserver::OnNoResponse() {
238 ServiceWorkerGlobalScopeClient::From(GetExecutionContext()) 261 ServiceWorkerGlobalScopeClient::From(GetExecutionContext())
239 ->RespondToFetchEvent(event_id_, event_dispatch_time_); 262 ->RespondToFetchEventWithNoResponse(event_id_, event_dispatch_time_);
240 } 263 }
241 264
242 FetchRespondWithObserver::FetchRespondWithObserver( 265 FetchRespondWithObserver::FetchRespondWithObserver(
243 ExecutionContext* context, 266 ExecutionContext* context,
244 int fetch_event_id, 267 int fetch_event_id,
245 const KURL& request_url, 268 const KURL& request_url,
246 WebURLRequest::FetchRequestMode request_mode, 269 WebURLRequest::FetchRequestMode request_mode,
247 WebURLRequest::FetchRedirectMode redirect_mode, 270 WebURLRequest::FetchRedirectMode redirect_mode,
248 WebURLRequest::FrameType frame_type, 271 WebURLRequest::FrameType frame_type,
249 WebURLRequest::RequestContext request_context, 272 WebURLRequest::RequestContext request_context,
250 WaitUntilObserver* observer) 273 WaitUntilObserver* observer)
251 : RespondWithObserver(context, fetch_event_id, observer), 274 : RespondWithObserver(context, fetch_event_id, observer),
252 request_url_(request_url), 275 request_url_(request_url),
253 request_mode_(request_mode), 276 request_mode_(request_mode),
254 redirect_mode_(redirect_mode), 277 redirect_mode_(redirect_mode),
255 frame_type_(frame_type), 278 frame_type_(frame_type),
256 request_context_(request_context) {} 279 request_context_(request_context) {}
257 280
258 DEFINE_TRACE(FetchRespondWithObserver) { 281 DEFINE_TRACE(FetchRespondWithObserver) {
259 RespondWithObserver::Trace(visitor); 282 RespondWithObserver::Trace(visitor);
260 } 283 }
261 284
262 } // namespace blink 285 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698