Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |