Chromium Code Reviews| Index: content/renderer/service_worker/service_worker_context_client.cc |
| diff --git a/content/renderer/service_worker/service_worker_context_client.cc b/content/renderer/service_worker/service_worker_context_client.cc |
| index 72e40dc891c8409841cd6d4420acaf968aa8198a..f76e81dbe660899a2d5904ad16242c7ea2a8af31 100644 |
| --- a/content/renderer/service_worker/service_worker_context_client.cc |
| +++ b/content/renderer/service_worker/service_worker_context_client.cc |
| @@ -242,11 +242,9 @@ class ServiceWorkerContextClient::NavigationPreloadRequest final |
| const GURL& url, |
| mojom::FetchEventPreloadHandlePtr preload_handle) |
| : fetch_event_id_(fetch_event_id), |
| + url_(url), |
| url_loader_(std::move(preload_handle->url_loader)), |
| - binding_(this, std::move(preload_handle->url_loader_client_request)), |
| - response_(base::MakeUnique<blink::WebServiceWorkerResponse>()) { |
| - response_->setURL(url); |
| - } |
| + binding_(this, std::move(preload_handle->url_loader_client_request)) {} |
| ~NavigationPreloadRequest() override { |
| if (result_reported_) |
| @@ -265,7 +263,9 @@ class ServiceWorkerContextClient::NavigationPreloadRequest final |
| } |
| void OnReceiveResponse(const ResourceResponseHead& response_head) override { |
| - DCHECK(response_); |
| + DCHECK(!response_); |
| + response_ = base::MakeUnique<blink::WebServiceWorkerResponse>(); |
| + response_->setURL(url_); |
| DCHECK(response_head.headers); |
| response_->setStatus(response_head.headers->response_code()); |
| response_->setStatusText( |
| @@ -280,19 +280,14 @@ class ServiceWorkerContextClient::NavigationPreloadRequest final |
| blink::WebString::fromUTF8(header_value)); |
| } |
| response_->setResponseTime(response_head.response_time.ToInternalValue()); |
| + MaybeReportToClient(); |
| } |
| void OnStartLoadingResponseBody( |
| mojo::ScopedDataPipeConsumerHandle body) override { |
| - DCHECK(!result_reported_); |
| - ServiceWorkerContextClient* client = |
| - ServiceWorkerContextClient::ThreadSpecificInstance(); |
| - if (!client) |
| - return; |
| - client->OnNavigationPreloadResponse( |
| - fetch_event_id_, std::move(response_), |
| - base::MakeUnique<WebDataConsumerHandleImpl>(std::move(body))); |
| - result_reported_ = true; |
| + DCHECK(!body_.is_valid()); |
| + body_ = std::move(body); |
| + MaybeReportToClient(); |
| } |
| void OnComplete(const ResourceRequestCompletionStatus& status) override { |
| @@ -315,10 +310,28 @@ class ServiceWorkerContextClient::NavigationPreloadRequest final |
| } |
| private: |
| + void MaybeReportToClient() { |
| + 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.
|
| + if (!response_ || !body_.is_valid()) |
| + return; |
| + ServiceWorkerContextClient* client = |
| + ServiceWorkerContextClient::ThreadSpecificInstance(); |
| + if (!client) |
| + return; |
| + |
| + client->OnNavigationPreloadResponse( |
| + fetch_event_id_, std::move(response_), |
| + base::MakeUnique<WebDataConsumerHandleImpl>(std::move(body_))); |
| + result_reported_ = true; |
| + } |
| + |
| const int fetch_event_id_; |
| + const GURL url_; |
| mojom::URLLoaderPtr url_loader_; |
| mojo::Binding<mojom::URLLoaderClient> binding_; |
| + |
| std::unique_ptr<blink::WebServiceWorkerResponse> response_; |
| + mojo::ScopedDataPipeConsumerHandle body_; |
| bool result_reported_ = false; |
| }; |