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 |
| 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, |
| 137 WebURLRequest::FrameType frame_type, | 142 WebURLRequest::FrameType frame_type, |
| 138 WebURLRequest::RequestContext request_context, | 143 WebURLRequest::RequestContext request_context, |
| 139 WaitUntilObserver* observer) { | 144 WaitUntilObserver* observer) { |
| 140 return new FetchRespondWithObserver(context, fetch_event_id, request_url, | 145 return new FetchRespondWithObserver(context, fetch_event_id, request_url, |
| 141 request_mode, redirect_mode, frame_type, | 146 request_mode, redirect_mode, frame_type, |
| 142 request_context, observer); | 147 request_context, observer); |
| 143 } | 148 } |
| 144 | 149 |
| 145 void FetchRespondWithObserver::OnResponseRejected( | 150 void FetchRespondWithObserver::OnResponseRejected( |
| 146 WebServiceWorkerResponseError error) { | 151 WebServiceWorkerResponseError error) { |
| 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 webResponse; |
| 155 web_response.SetError(error); | 160 webResponse.SetError(error); |
| 156 ServiceWorkerGlobalScopeClient::From(GetExecutionContext()) | 161 ServiceWorkerGlobalScopeClient::From(GetExecutionContext()) |
| 157 ->RespondToFetchEvent(event_id_, web_response, event_dispatch_time_); | 162 ->RespondToFetchEventWithResponse(event_id_, webResponse, |
| 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 Loading... | |
| 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(); | |
| 247 | |
| 248 buffer->StartLoading(FetchDataLoader::CreateLoaderAsDataPipe( | |
| 249 std::move(data_pipe.producer_handle)), | |
| 250 new FetchLoaderClient(std::move(stream_handle))); | |
| 251 ServiceWorkerGlobalScopeClient::From(GetExecutionContext()) | |
| 252 ->RespondToFetchEventWithResponseStream(event_id_, web_response, | |
|
horo
2017/04/10 09:24:38
It is safe to call StartLoading() before RespondTo
shimazu
2017/04/11 01:32:58
It makes sense. Changed.
| |
| 253 stream_handle_rawptr, | |
| 254 event_dispatch_time_); | |
| 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 |
| OLD | NEW |