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

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: Fixed formatting, updated comments and removed unnecessary files 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
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)
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(); }
126 DEFINE_INLINE_TRACE() { FetchDataLoader::Client::Trace(visitor); } 128 DEFINE_INLINE_TRACE() { FetchDataLoader::Client::Trace(visitor); }
129
130 private:
131 std::unique_ptr<WebServiceWorkerStreamHandle> handle_;
127 }; 132 };
128 133
129 } // namespace 134 } // namespace
130 135
131 FetchRespondWithObserver* FetchRespondWithObserver::Create( 136 FetchRespondWithObserver* FetchRespondWithObserver::Create(
132 ExecutionContext* context, 137 ExecutionContext* context,
133 int fetch_event_id, 138 int fetch_event_id,
134 const KURL& request_url, 139 const KURL& request_url,
135 WebURLRequest::FetchRequestMode request_mode, 140 WebURLRequest::FetchRequestMode request_mode,
136 WebURLRequest::FetchRedirectMode redirect_mode, 141 WebURLRequest::FetchRedirectMode redirect_mode,
(...skipping 10 matching lines...) Expand all
147 DCHECK(GetExecutionContext()); 152 DCHECK(GetExecutionContext());
148 GetExecutionContext()->AddConsoleMessage( 153 GetExecutionContext()->AddConsoleMessage(
149 ConsoleMessage::Create(kJSMessageSource, kWarningMessageLevel, 154 ConsoleMessage::Create(kJSMessageSource, kWarningMessageLevel,
150 GetMessageForResponseError(error, request_url_))); 155 GetMessageForResponseError(error, request_url_)));
151 156
152 // The default value of WebServiceWorkerResponse's status is 0, which maps 157 // The default value of WebServiceWorkerResponse's status is 0, which maps
153 // to a network error. 158 // to a network error.
154 WebServiceWorkerResponse web_response; 159 WebServiceWorkerResponse web_response;
155 web_response.SetError(error); 160 web_response.SetError(error);
156 ServiceWorkerGlobalScopeClient::From(GetExecutionContext()) 161 ServiceWorkerGlobalScopeClient::From(GetExecutionContext())
157 ->RespondToFetchEvent(event_id_, web_response, event_dispatch_time_); 162 ->RespondToFetchEventWithResponse(event_id_, web_response,
163 event_dispatch_time_);
158 } 164 }
159 165
160 void FetchRespondWithObserver::OnResponseFulfilled(const ScriptValue& value) { 166 void FetchRespondWithObserver::OnResponseFulfilled(const ScriptValue& value) {
161 DCHECK(GetExecutionContext()); 167 DCHECK(GetExecutionContext());
162 if (!V8Response::hasInstance(value.V8Value(), 168 if (!V8Response::hasInstance(value.V8Value(),
163 ToIsolate(GetExecutionContext()))) { 169 ToIsolate(GetExecutionContext()))) {
164 OnResponseRejected(kWebServiceWorkerResponseErrorNoV8Instance); 170 OnResponseRejected(kWebServiceWorkerResponseErrorNoV8Instance);
165 return; 171 return;
166 } 172 }
167 Response* response = V8Response::toImplWithTypeCheck( 173 Response* response = V8Response::toImplWithTypeCheck(
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
215 return; 221 return;
216 } 222 }
217 223
218 WebServiceWorkerResponse web_response; 224 WebServiceWorkerResponse web_response;
219 response->PopulateWebServiceWorkerResponse(web_response); 225 response->PopulateWebServiceWorkerResponse(web_response);
220 BodyStreamBuffer* buffer = response->InternalBodyBuffer(); 226 BodyStreamBuffer* buffer = response->InternalBodyBuffer();
221 if (buffer) { 227 if (buffer) {
222 RefPtr<BlobDataHandle> blob_data_handle = buffer->DrainAsBlobDataHandle( 228 RefPtr<BlobDataHandle> blob_data_handle = buffer->DrainAsBlobDataHandle(
223 BytesConsumer::BlobSizePolicy::kAllowBlobWithInvalidSize); 229 BytesConsumer::BlobSizePolicy::kAllowBlobWithInvalidSize);
224 if (blob_data_handle) { 230 if (blob_data_handle) {
231 // Handle the blob response.
225 web_response.SetBlobDataHandle(blob_data_handle); 232 web_response.SetBlobDataHandle(blob_data_handle);
233 ServiceWorkerGlobalScopeClient::From(GetExecutionContext())
234 ->RespondToFetchEventWithResponse(event_id_, web_response,
235 event_dispatch_time_);
236 return;
226 } else { 237 } else {
227 Stream* out_stream = Stream::Create(GetExecutionContext(), ""); 238 // Handle the stream response.
228 web_response.SetStreamURL(out_stream->Url()); 239 mojo::DataPipe data_pipe;
229 buffer->StartLoading(FetchDataLoader::CreateLoaderAsStream(out_stream), 240 DCHECK(data_pipe.producer_handle.is_valid());
230 new NoopLoaderClient); 241 DCHECK(data_pipe.consumer_handle.is_valid());
242
243 std::unique_ptr<WebServiceWorkerStreamHandle> stream_handle =
244 WTF::MakeUnique<WebServiceWorkerStreamHandle>(
245 std::move(data_pipe.consumer_handle));
246 WebServiceWorkerStreamHandle* stream_handle_rawptr = stream_handle.get();
horo 2017/04/11 05:41:53 You don't need this.
shimazu 2017/04/12 05:53:35 Thanks, you're right. Done.
247 ServiceWorkerGlobalScopeClient::From(GetExecutionContext())
248 ->RespondToFetchEventWithResponseStream(event_id_, web_response,
249 stream_handle_rawptr,
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