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 4569c4b15c118023841d135470d3d5cf9a0d5b78..c3066882e7388fdccf7d291bc54bf13595795abc 100644 |
--- a/content/renderer/service_worker/service_worker_context_client.cc |
+++ b/content/renderer/service_worker/service_worker_context_client.cc |
@@ -267,19 +267,6 @@ class ServiceWorkerContextClient::NavigationPreloadRequest final |
binding_(this, std::move(preload_handle->url_loader_client_request)) {} |
~NavigationPreloadRequest() override { |
- if (result_reported_) |
- return; |
- ServiceWorkerContextClient* client = |
- ServiceWorkerContextClient::ThreadSpecificInstance(); |
- if (!client) |
- return; |
- client->OnNavigationPreloadError( |
- fetch_event_id_, |
- base::MakeUnique<blink::WebServiceWorkerError>( |
- blink::WebServiceWorkerError::ErrorTypeAbort, |
- blink::WebString::fromASCII( |
- "Service Worker navigation preload aborted. Need to guard with " |
- "respondWith or waitUntil."))); |
} |
void OnReceiveResponse( |
@@ -297,8 +284,7 @@ class ServiceWorkerContextClient::NavigationPreloadRequest final |
void OnReceiveRedirect(const net::RedirectInfo& redirect_info, |
const ResourceResponseHead& response_head) override { |
- // Cancel the request. |
- url_loader_ = nullptr; |
+ // This will delete |this|. |
ReportErrorToClient( |
"Service Worker navigation preload doesn't suport redirect."); |
} |
@@ -320,17 +306,22 @@ class ServiceWorkerContextClient::NavigationPreloadRequest final |
} |
void OnComplete(const ResourceRequestCompletionStatus& status) override { |
- // We don't report to |client| if OnStartLoadingResponseBody() has already |
- // called OnNavigationPreloadResponse(). |
- if (result_reported_) |
+ if (status.error_code != net::OK) { |
+ // This will delete |this|. |
+ ReportErrorToClient("Service Worker navigation preload network error."); |
+ return; |
+ } |
+ |
+ ServiceWorkerContextClient* client = |
+ ServiceWorkerContextClient::ThreadSpecificInstance(); |
+ if (!client) |
return; |
- DCHECK_NE(0, status.error_code); |
- ReportErrorToClient("Service Worker navigation preload network error."); |
+ // This will delete |this|. |
+ client->OnNavigationPreloadComplete(fetch_event_id_); |
} |
private: |
void MaybeReportResponseToClient() { |
- DCHECK(!result_reported_); |
if (!response_ || !body_.is_valid()) |
return; |
ServiceWorkerContextClient* client = |
@@ -341,7 +332,6 @@ class ServiceWorkerContextClient::NavigationPreloadRequest final |
client->OnNavigationPreloadResponse( |
fetch_event_id_, std::move(response_), |
base::MakeUnique<WebDataConsumerHandleImpl>(std::move(body_))); |
- result_reported_ = true; |
} |
void ReportErrorToClient(const char* error_message) { |
@@ -349,11 +339,11 @@ class ServiceWorkerContextClient::NavigationPreloadRequest final |
ServiceWorkerContextClient::ThreadSpecificInstance(); |
if (!client) |
return; |
+ // This will delete itself. |
falken
2017/01/18 16:32:58
nit: |this|
horo
2017/01/18 16:52:06
Done.
|
client->OnNavigationPreloadError( |
fetch_event_id_, base::MakeUnique<blink::WebServiceWorkerError>( |
blink::WebServiceWorkerError::ErrorTypeNetwork, |
blink::WebString::fromUTF8(error_message))); |
- result_reported_ = true; |
} |
const int fetch_event_id_; |
@@ -363,7 +353,6 @@ class ServiceWorkerContextClient::NavigationPreloadRequest final |
std::unique_ptr<blink::WebURLResponse> response_; |
mojo::ScopedDataPipeConsumerHandle body_; |
- bool result_reported_ = false; |
}; |
ServiceWorkerContextClient* |
@@ -720,12 +709,6 @@ void ServiceWorkerContextClient::didHandleFetchEvent( |
int fetch_event_id, |
blink::WebServiceWorkerEventResult result, |
double event_dispatch_time) { |
- if (context_->preload_requests.Lookup(fetch_event_id)) { |
- // Deletes NavigationPreloadRequest. If the network request is ongoing, it |
- // will be canceled by deleting the mojom::URLLoaderPtr in the |
- // NavigationPreloadRequest. |
- context_->preload_requests.Remove(fetch_event_id); |
- } |
const FetchCallback* callback = |
context_->fetch_event_callbacks.Lookup(fetch_event_id); |
DCHECK(callback); |
@@ -1269,6 +1252,12 @@ void ServiceWorkerContextClient::OnNavigationPreloadError( |
int fetch_event_id, |
std::unique_ptr<blink::WebServiceWorkerError> error) { |
proxy_->onNavigationPreloadError(fetch_event_id, std::move(error)); |
+ context_->preload_requests.Remove(fetch_event_id); |
+} |
+ |
+void ServiceWorkerContextClient::OnNavigationPreloadComplete( |
+ int fetch_event_id) { |
+ context_->preload_requests.Remove(fetch_event_id); |
} |
void ServiceWorkerContextClient::BindEventDispatcher( |