Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(948)

Unified Diff: content/renderer/service_worker/service_worker_context_client.cc

Issue 2645493002: Increase the lifetime of Navigation Preload related objects. (Closed)
Patch Set: fix broken-chunked-encoding-worker.js Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 533230c91afce28e94d161762f81add3867d2aa6..3a0baf07e43286805bf9413ec531e2a913d9274e 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.");
}
@@ -322,17 +308,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 =
@@ -343,7 +334,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) {
@@ -351,11 +341,11 @@ class ServiceWorkerContextClient::NavigationPreloadRequest final
ServiceWorkerContextClient::ThreadSpecificInstance();
if (!client)
return;
+ // This will delete |this|.
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_;
@@ -365,7 +355,6 @@ class ServiceWorkerContextClient::NavigationPreloadRequest final
std::unique_ptr<blink::WebURLResponse> response_;
mojo::ScopedDataPipeConsumerHandle body_;
- bool result_reported_ = false;
};
ServiceWorkerContextClient*
@@ -709,12 +698,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);
@@ -1258,6 +1241,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);
}
base::WeakPtr<ServiceWorkerContextClient>

Powered by Google App Engine
This is Rietveld 408576698