Index: content/browser/service_worker/service_worker_fetch_dispatcher.cc |
diff --git a/content/browser/service_worker/service_worker_fetch_dispatcher.cc b/content/browser/service_worker/service_worker_fetch_dispatcher.cc |
index 7017787fc0db354558c02f84c6423dbdc2aefdf5..888ed10928d3c60e542fee2cc1da01b103a62da4 100644 |
--- a/content/browser/service_worker/service_worker_fetch_dispatcher.cc |
+++ b/content/browser/service_worker/service_worker_fetch_dispatcher.cc |
@@ -132,6 +132,8 @@ class DelegatingURLLoaderClient final : public mojom::URLLoaderClient { |
ResourceRequestCompletionStatus status; |
status.error_code = net::ERR_ABORTED; |
client_->OnComplete(status); |
+ AddDevToolsCallback( |
+ base::Bind(&NotifyNavigationPreloadCompletedOnUI, status)); |
} |
} |
@@ -166,7 +168,16 @@ class DelegatingURLLoaderClient final : public mojom::URLLoaderClient { |
} |
void OnReceiveRedirect(const net::RedirectInfo& redirect_info, |
const ResourceResponseHead& head) override { |
+ completed_ = true; |
+ // When the server returns a redirect response, we only send |
+ // OnReceiveRedirect IPC and don't send OnComplete IPC. The service worker |
+ // will clean up the preload request when OnReceiveRedirect() is called. |
client_->OnReceiveRedirect(redirect_info, head); |
+ AddDevToolsCallback( |
+ base::Bind(&NotifyNavigationPreloadResponseReceivedOnUI, url_, head)); |
+ ResourceRequestCompletionStatus status; |
+ AddDevToolsCallback( |
+ base::Bind(&NotifyNavigationPreloadCompletedOnUI, status)); |
} |
void OnStartLoadingResponseBody( |
mojo::ScopedDataPipeConsumerHandle body) override { |
@@ -174,8 +185,10 @@ class DelegatingURLLoaderClient final : public mojom::URLLoaderClient { |
} |
void OnComplete( |
const ResourceRequestCompletionStatus& completion_status) override { |
- client_->OnComplete(completion_status); |
+ if (completed_) |
+ return; |
completed_ = true; |
+ client_->OnComplete(completion_status); |
AddDevToolsCallback( |
base::Bind(&NotifyNavigationPreloadCompletedOnUI, completion_status)); |
} |