Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "content/renderer/service_worker/service_worker_context_client.h" | 5 #include "content/renderer/service_worker/service_worker_context_client.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/lazy_instance.h" | 10 #include "base/lazy_instance.h" |
| (...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 235 base::WeakPtrFactory<blink::WebServiceWorkerContextProxy> proxy_weak_factory; | 235 base::WeakPtrFactory<blink::WebServiceWorkerContextProxy> proxy_weak_factory; |
| 236 }; | 236 }; |
| 237 | 237 |
| 238 class ServiceWorkerContextClient::NavigationPreloadRequest final | 238 class ServiceWorkerContextClient::NavigationPreloadRequest final |
| 239 : public mojom::URLLoaderClient { | 239 : public mojom::URLLoaderClient { |
| 240 public: | 240 public: |
| 241 NavigationPreloadRequest(int fetch_event_id, | 241 NavigationPreloadRequest(int fetch_event_id, |
| 242 const GURL& url, | 242 const GURL& url, |
| 243 mojom::FetchEventPreloadHandlePtr preload_handle) | 243 mojom::FetchEventPreloadHandlePtr preload_handle) |
| 244 : fetch_event_id_(fetch_event_id), | 244 : fetch_event_id_(fetch_event_id), |
| 245 url_(url), | |
| 245 url_loader_(std::move(preload_handle->url_loader)), | 246 url_loader_(std::move(preload_handle->url_loader)), |
| 246 binding_(this, std::move(preload_handle->url_loader_client_request)), | 247 binding_(this, std::move(preload_handle->url_loader_client_request)) {} |
| 247 response_(base::MakeUnique<blink::WebServiceWorkerResponse>()) { | |
| 248 response_->setURL(url); | |
| 249 } | |
| 250 | 248 |
| 251 ~NavigationPreloadRequest() override { | 249 ~NavigationPreloadRequest() override { |
| 252 if (result_reported_) | 250 if (result_reported_) |
| 253 return; | 251 return; |
| 254 ServiceWorkerContextClient* client = | 252 ServiceWorkerContextClient* client = |
| 255 ServiceWorkerContextClient::ThreadSpecificInstance(); | 253 ServiceWorkerContextClient::ThreadSpecificInstance(); |
| 256 if (!client) | 254 if (!client) |
| 257 return; | 255 return; |
| 258 client->OnNavigationPreloadError( | 256 client->OnNavigationPreloadError( |
| 259 fetch_event_id_, | 257 fetch_event_id_, |
| 260 base::MakeUnique<blink::WebServiceWorkerError>( | 258 base::MakeUnique<blink::WebServiceWorkerError>( |
| 261 blink::WebServiceWorkerError::ErrorTypeAbort, | 259 blink::WebServiceWorkerError::ErrorTypeAbort, |
| 262 blink::WebString::fromUTF8( | 260 blink::WebString::fromUTF8( |
| 263 "Service Worker navigation preload aborted. Need to guard with " | 261 "Service Worker navigation preload aborted. Need to guard with " |
| 264 "respondWith or waitUntil."))); | 262 "respondWith or waitUntil."))); |
| 265 } | 263 } |
| 266 | 264 |
| 267 void OnReceiveResponse(const ResourceResponseHead& response_head) override { | 265 void OnReceiveResponse(const ResourceResponseHead& response_head) override { |
| 268 DCHECK(response_); | 266 DCHECK(!response_); |
| 267 response_ = base::MakeUnique<blink::WebServiceWorkerResponse>(); | |
| 268 response_->setURL(url_); | |
| 269 DCHECK(response_head.headers); | 269 DCHECK(response_head.headers); |
| 270 response_->setStatus(response_head.headers->response_code()); | 270 response_->setStatus(response_head.headers->response_code()); |
| 271 response_->setStatusText( | 271 response_->setStatusText( |
| 272 blink::WebString::fromUTF8(response_head.headers->GetStatusText())); | 272 blink::WebString::fromUTF8(response_head.headers->GetStatusText())); |
| 273 response_->setResponseType(blink::WebServiceWorkerResponseTypeBasic); | 273 response_->setResponseType(blink::WebServiceWorkerResponseTypeBasic); |
| 274 size_t iter = 0; | 274 size_t iter = 0; |
| 275 std::string header_name; | 275 std::string header_name; |
| 276 std::string header_value; | 276 std::string header_value; |
| 277 while (response_head.headers->EnumerateHeaderLines(&iter, &header_name, | 277 while (response_head.headers->EnumerateHeaderLines(&iter, &header_name, |
| 278 &header_value)) { | 278 &header_value)) { |
| 279 response_->appendHeader(blink::WebString::fromUTF8(header_name), | 279 response_->appendHeader(blink::WebString::fromUTF8(header_name), |
| 280 blink::WebString::fromUTF8(header_value)); | 280 blink::WebString::fromUTF8(header_value)); |
| 281 } | 281 } |
| 282 response_->setResponseTime(response_head.response_time.ToInternalValue()); | 282 response_->setResponseTime(response_head.response_time.ToInternalValue()); |
| 283 MaybeReportToClient(); | |
| 283 } | 284 } |
| 284 | 285 |
| 285 void OnStartLoadingResponseBody( | 286 void OnStartLoadingResponseBody( |
| 286 mojo::ScopedDataPipeConsumerHandle body) override { | 287 mojo::ScopedDataPipeConsumerHandle body) override { |
| 287 DCHECK(!result_reported_); | 288 DCHECK(!body_.is_valid()); |
| 288 ServiceWorkerContextClient* client = | 289 body_ = std::move(body); |
| 289 ServiceWorkerContextClient::ThreadSpecificInstance(); | 290 MaybeReportToClient(); |
| 290 if (!client) | |
| 291 return; | |
| 292 client->OnNavigationPreloadResponse( | |
| 293 fetch_event_id_, std::move(response_), | |
| 294 base::MakeUnique<WebDataConsumerHandleImpl>(std::move(body))); | |
| 295 result_reported_ = true; | |
| 296 } | 291 } |
| 297 | 292 |
| 298 void OnComplete(const ResourceRequestCompletionStatus& status) override { | 293 void OnComplete(const ResourceRequestCompletionStatus& status) override { |
| 299 // We don't report to |client| if OnStartLoadingResponseBody() has already | 294 // We don't report to |client| if OnStartLoadingResponseBody() has already |
| 300 // called OnNavigationPreloadResponse(). | 295 // called OnNavigationPreloadResponse(). |
| 301 if (result_reported_) | 296 if (result_reported_) |
| 302 return; | 297 return; |
| 303 DCHECK_NE(0, status.error_code); | 298 DCHECK_NE(0, status.error_code); |
| 304 ServiceWorkerContextClient* client = | 299 ServiceWorkerContextClient* client = |
| 305 ServiceWorkerContextClient::ThreadSpecificInstance(); | 300 ServiceWorkerContextClient::ThreadSpecificInstance(); |
| 306 if (!client) | 301 if (!client) |
| 307 return; | 302 return; |
| 308 client->OnNavigationPreloadError( | 303 client->OnNavigationPreloadError( |
| 309 fetch_event_id_, | 304 fetch_event_id_, |
| 310 base::MakeUnique<blink::WebServiceWorkerError>( | 305 base::MakeUnique<blink::WebServiceWorkerError>( |
| 311 blink::WebServiceWorkerError::ErrorTypeNetwork, | 306 blink::WebServiceWorkerError::ErrorTypeNetwork, |
| 312 blink::WebString::fromUTF8( | 307 blink::WebString::fromUTF8( |
| 313 "Service Worker navigation preload network error."))); | 308 "Service Worker navigation preload network error."))); |
| 314 result_reported_ = true; | 309 result_reported_ = true; |
| 315 } | 310 } |
| 316 | 311 |
| 317 private: | 312 private: |
| 313 void MaybeReportToClient() { | |
| 314 DCHECK(!result_reported_); | |
|
falken
2016/11/04 09:36:50
I'm missing something... how does this DCHECK pass
horo
2016/11/04 09:41:48
Both OnReceiveRersponse() and OnStartLoadingRespos
falken
2016/11/04 09:46:55
Ah yes... I was totally missing something.
| |
| 315 if (!response_ || !body_.is_valid()) | |
| 316 return; | |
| 317 ServiceWorkerContextClient* client = | |
| 318 ServiceWorkerContextClient::ThreadSpecificInstance(); | |
| 319 if (!client) | |
| 320 return; | |
| 321 | |
| 322 client->OnNavigationPreloadResponse( | |
| 323 fetch_event_id_, std::move(response_), | |
| 324 base::MakeUnique<WebDataConsumerHandleImpl>(std::move(body_))); | |
| 325 result_reported_ = true; | |
| 326 } | |
| 327 | |
| 318 const int fetch_event_id_; | 328 const int fetch_event_id_; |
| 329 const GURL url_; | |
| 319 mojom::URLLoaderPtr url_loader_; | 330 mojom::URLLoaderPtr url_loader_; |
| 320 mojo::Binding<mojom::URLLoaderClient> binding_; | 331 mojo::Binding<mojom::URLLoaderClient> binding_; |
| 332 | |
| 321 std::unique_ptr<blink::WebServiceWorkerResponse> response_; | 333 std::unique_ptr<blink::WebServiceWorkerResponse> response_; |
| 334 mojo::ScopedDataPipeConsumerHandle body_; | |
| 322 bool result_reported_ = false; | 335 bool result_reported_ = false; |
| 323 }; | 336 }; |
| 324 | 337 |
| 325 class ServiceWorkerContextClient::FetchEventDispatcherImpl | 338 class ServiceWorkerContextClient::FetchEventDispatcherImpl |
| 326 : public NON_EXPORTED_BASE(mojom::FetchEventDispatcher) { | 339 : public NON_EXPORTED_BASE(mojom::FetchEventDispatcher) { |
| 327 public: | 340 public: |
| 328 static void Create(mojom::FetchEventDispatcherRequest request) { | 341 static void Create(mojom::FetchEventDispatcherRequest request) { |
| 329 mojo::MakeStrongBinding(base::MakeUnique<FetchEventDispatcherImpl>(), | 342 mojo::MakeStrongBinding(base::MakeUnique<FetchEventDispatcherImpl>(), |
| 330 std::move(request)); | 343 std::move(request)); |
| 331 } | 344 } |
| (...skipping 946 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1278 } | 1291 } |
| 1279 | 1292 |
| 1280 base::WeakPtr<ServiceWorkerContextClient> | 1293 base::WeakPtr<ServiceWorkerContextClient> |
| 1281 ServiceWorkerContextClient::GetWeakPtr() { | 1294 ServiceWorkerContextClient::GetWeakPtr() { |
| 1282 DCHECK(worker_task_runner_->RunsTasksOnCurrentThread()); | 1295 DCHECK(worker_task_runner_->RunsTasksOnCurrentThread()); |
| 1283 DCHECK(context_); | 1296 DCHECK(context_); |
| 1284 return context_->weak_factory.GetWeakPtr(); | 1297 return context_->weak_factory.GetWeakPtr(); |
| 1285 } | 1298 } |
| 1286 | 1299 |
| 1287 } // namespace content | 1300 } // namespace content |
| OLD | NEW |