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..1a358ce0e371450bf58e702b643d61f7f1c2e31a 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 itself. |
falken
2017/01/18 14:24:58
nit: Slightly prefer |this| instead of "itself"
horo
2017/01/18 16:14:57
Done.
|
ReportErrorToClient( |
"Service Worker navigation preload doesn't suport redirect."); |
} |
@@ -320,17 +306,21 @@ 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) { |
+ ReportErrorToClient("Service Worker navigation preload network error."); |
falken
2017/01/18 14:24:58
Does this also delete |this|?
horo
2017/01/18 16:14:57
Done.
|
+ return; |
+ } |
+ |
+ ServiceWorkerContextClient* client = |
+ ServiceWorkerContextClient::ThreadSpecificInstance(); |
+ if (!client) |
return; |
- DCHECK_NE(0, status.error_code); |
- ReportErrorToClient("Service Worker navigation preload network error."); |
+ // This will delete itself. |
+ client->OnNavigationPreloadComplete(fetch_event_id_); |
} |
private: |
void MaybeReportResponseToClient() { |
- DCHECK(!result_reported_); |
if (!response_ || !body_.is_valid()) |
return; |
ServiceWorkerContextClient* client = |
@@ -341,7 +331,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 +338,11 @@ class ServiceWorkerContextClient::NavigationPreloadRequest final |
ServiceWorkerContextClient::ThreadSpecificInstance(); |
if (!client) |
return; |
+ // This will delete itself. |
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 +352,6 @@ class ServiceWorkerContextClient::NavigationPreloadRequest final |
std::unique_ptr<blink::WebURLResponse> response_; |
mojo::ScopedDataPipeConsumerHandle body_; |
- bool result_reported_ = false; |
}; |
ServiceWorkerContextClient* |
@@ -720,12 +708,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 +1251,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); |
falken
2017/01/18 14:24:58
So either OnError or OnComplete must be called, bu
horo
2017/01/18 16:14:57
Done.
|
} |
void ServiceWorkerContextClient::BindEventDispatcher( |