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

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: IFRAME_URL -> SCOPE 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/13 05:03:44 Would it be possible to remove this wrapper class
haraken 2017/04/13 05:05:14 Correction: It would be nicer if we can remove bot
shimazu 2017/04/18 01:50:05 IIUC, WebServiceWorkerStreamHandle cannot inherit
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 FetchLoaderClient(std::unique_ptr<WebServiceWorkerStreamHandle> handle)
haraken 2017/04/13 05:03:44 Add explicit.
shimazu 2017/04/18 01:50:05 Done.
124 void DidFetchDataLoadedStream() override {} 124 : handle_(std::move(handle)) {}
125 void DidFetchDataLoadFailed() override {} 125
126 void DidFetchDataLoadedDataPipe() override { handle_->Completed(); }
127 void DidFetchDataLoadFailed() override { handle_->Aborted(); }
128
126 DEFINE_INLINE_TRACE() { FetchDataLoader::Client::Trace(visitor); } 129 DEFINE_INLINE_TRACE() { FetchDataLoader::Client::Trace(visitor); }
130
131 private:
132 std::unique_ptr<WebServiceWorkerStreamHandle> handle_;
127 }; 133 };
128 134
129 } // namespace 135 } // namespace
130 136
131 FetchRespondWithObserver* FetchRespondWithObserver::Create( 137 FetchRespondWithObserver* FetchRespondWithObserver::Create(
132 ExecutionContext* context, 138 ExecutionContext* context,
133 int fetch_event_id, 139 int fetch_event_id,
134 const KURL& request_url, 140 const KURL& request_url,
135 WebURLRequest::FetchRequestMode request_mode, 141 WebURLRequest::FetchRequestMode request_mode,
136 WebURLRequest::FetchRedirectMode redirect_mode, 142 WebURLRequest::FetchRedirectMode redirect_mode,
(...skipping 10 matching lines...) Expand all
147 DCHECK(GetExecutionContext()); 153 DCHECK(GetExecutionContext());
148 GetExecutionContext()->AddConsoleMessage( 154 GetExecutionContext()->AddConsoleMessage(
149 ConsoleMessage::Create(kJSMessageSource, kWarningMessageLevel, 155 ConsoleMessage::Create(kJSMessageSource, kWarningMessageLevel,
150 GetMessageForResponseError(error, request_url_))); 156 GetMessageForResponseError(error, request_url_)));
151 157
152 // The default value of WebServiceWorkerResponse's status is 0, which maps 158 // The default value of WebServiceWorkerResponse's status is 0, which maps
153 // to a network error. 159 // to a network error.
154 WebServiceWorkerResponse web_response; 160 WebServiceWorkerResponse web_response;
155 web_response.SetError(error); 161 web_response.SetError(error);
156 ServiceWorkerGlobalScopeClient::From(GetExecutionContext()) 162 ServiceWorkerGlobalScopeClient::From(GetExecutionContext())
157 ->RespondToFetchEvent(event_id_, web_response, event_dispatch_time_); 163 ->RespondToFetchEventWithResponse(event_id_, web_response,
164 event_dispatch_time_);
158 } 165 }
159 166
160 void FetchRespondWithObserver::OnResponseFulfilled(const ScriptValue& value) { 167 void FetchRespondWithObserver::OnResponseFulfilled(const ScriptValue& value) {
161 DCHECK(GetExecutionContext()); 168 DCHECK(GetExecutionContext());
162 if (!V8Response::hasInstance(value.V8Value(), 169 if (!V8Response::hasInstance(value.V8Value(),
163 ToIsolate(GetExecutionContext()))) { 170 ToIsolate(GetExecutionContext()))) {
164 OnResponseRejected(kWebServiceWorkerResponseErrorNoV8Instance); 171 OnResponseRejected(kWebServiceWorkerResponseErrorNoV8Instance);
165 return; 172 return;
166 } 173 }
167 Response* response = V8Response::toImplWithTypeCheck( 174 Response* response = V8Response::toImplWithTypeCheck(
(...skipping 47 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);
234 ServiceWorkerGlobalScopeClient::From(GetExecutionContext())
235 ->RespondToFetchEventWithResponse(event_id_, web_response,
236 event_dispatch_time_);
237 return;
226 } else { 238 } else {
falken 2017/04/12 08:00:16 else isn't needed after the if() { return }
shimazu 2017/04/18 01:50:05 Done.
227 Stream* out_stream = Stream::Create(GetExecutionContext(), ""); 239 // Handle the stream response.
228 web_response.SetStreamURL(out_stream->Url()); 240 mojo::DataPipe data_pipe;
229 buffer->StartLoading(FetchDataLoader::CreateLoaderAsStream(out_stream), 241 DCHECK(data_pipe.producer_handle.is_valid());
230 new NoopLoaderClient); 242 DCHECK(data_pipe.consumer_handle.is_valid());
243
244 std::unique_ptr<WebServiceWorkerStreamHandle> stream_handle =
245 WTF::MakeUnique<WebServiceWorkerStreamHandle>(
246 std::move(data_pipe.consumer_handle));
247 ServiceWorkerGlobalScopeClient::From(GetExecutionContext())
248 ->RespondToFetchEventWithResponseStream(event_id_, web_response,
249 stream_handle.get(),
250 event_dispatch_time_);
251
252 buffer->StartLoading(FetchDataLoader::CreateLoaderAsDataPipe(
253 std::move(data_pipe.producer_handle)),
254 new FetchLoaderClient(std::move(stream_handle)));
255 return;
231 } 256 }
232 } 257 }
233 ServiceWorkerGlobalScopeClient::From(GetExecutionContext()) 258 ServiceWorkerGlobalScopeClient::From(GetExecutionContext())
234 ->RespondToFetchEvent(event_id_, web_response, event_dispatch_time_); 259 ->RespondToFetchEventWithResponse(event_id_, web_response,
260 event_dispatch_time_);
235 } 261 }
236 262
237 void FetchRespondWithObserver::OnNoResponse() { 263 void FetchRespondWithObserver::OnNoResponse() {
238 ServiceWorkerGlobalScopeClient::From(GetExecutionContext()) 264 ServiceWorkerGlobalScopeClient::From(GetExecutionContext())
239 ->RespondToFetchEvent(event_id_, event_dispatch_time_); 265 ->RespondToFetchEvent(event_id_, event_dispatch_time_);
240 } 266 }
241 267
242 FetchRespondWithObserver::FetchRespondWithObserver( 268 FetchRespondWithObserver::FetchRespondWithObserver(
243 ExecutionContext* context, 269 ExecutionContext* context,
244 int fetch_event_id, 270 int fetch_event_id,
245 const KURL& request_url, 271 const KURL& request_url,
246 WebURLRequest::FetchRequestMode request_mode, 272 WebURLRequest::FetchRequestMode request_mode,
247 WebURLRequest::FetchRedirectMode redirect_mode, 273 WebURLRequest::FetchRedirectMode redirect_mode,
248 WebURLRequest::FrameType frame_type, 274 WebURLRequest::FrameType frame_type,
249 WebURLRequest::RequestContext request_context, 275 WebURLRequest::RequestContext request_context,
250 WaitUntilObserver* observer) 276 WaitUntilObserver* observer)
251 : RespondWithObserver(context, fetch_event_id, observer), 277 : RespondWithObserver(context, fetch_event_id, observer),
252 request_url_(request_url), 278 request_url_(request_url),
253 request_mode_(request_mode), 279 request_mode_(request_mode),
254 redirect_mode_(redirect_mode), 280 redirect_mode_(redirect_mode),
255 frame_type_(frame_type), 281 frame_type_(frame_type),
256 request_context_(request_context) {} 282 request_context_(request_context) {}
257 283
258 DEFINE_TRACE(FetchRespondWithObserver) { 284 DEFINE_TRACE(FetchRespondWithObserver) {
259 RespondWithObserver::Trace(visitor); 285 RespondWithObserver::Trace(visitor);
260 } 286 }
261 287
262 } // namespace blink 288 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698