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

Unified Diff: content/browser/service_worker/service_worker_url_request_job.cc

Issue 2604763002: Fix crash when forwarding a request to a null service worker. (Closed)
Patch Set: fix Created 4 years 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/browser/service_worker/service_worker_url_request_job.cc
diff --git a/content/browser/service_worker/service_worker_url_request_job.cc b/content/browser/service_worker/service_worker_url_request_job.cc
index 05b69eda5f326efec5d23894408efe2a3bb29999..da9a6f9d130edf672746f4df6e8dd2d7ec554931 100644
--- a/content/browser/service_worker/service_worker_url_request_job.cc
+++ b/content/browser/service_worker/service_worker_url_request_job.cc
@@ -297,6 +297,12 @@ void ServiceWorkerURLRequestJob::ForwardToServiceWorker() {
MaybeStartRequest();
}
+void ServiceWorkerURLRequestJob::FailDueToLostController() {
+ DCHECK_EQ(NOT_DETERMINED, response_type_);
+ response_type_ = FAIL_DUE_TO_LOST_CONTROLLER;
+ MaybeStartRequest();
+}
+
void ServiceWorkerURLRequestJob::Start() {
is_started_ = true;
MaybeStartRequest();
@@ -427,6 +433,12 @@ void ServiceWorkerURLRequestJob::StartRequest() {
NOTREACHED();
return;
+ case FAIL_DUE_TO_LOST_CONTROLLER:
+ request()->net_log().AddEvent(
+ net::NetLogEventType::SERVICE_WORKER_ERROR_NO_ACTIVE_VERSION);
+ NotifyStartError(net::URLRequestStatus::FromError(net::ERR_FAILED));
+ return;
+
case FALLBACK_TO_NETWORK:
FinalizeFallbackToNetwork();
return;
@@ -792,30 +804,41 @@ void ServiceWorkerURLRequestJob::NotifyRestartRequired() {
}
void ServiceWorkerURLRequestJob::OnStartCompleted() const {
- if (response_type_ != FORWARD_TO_SERVICE_WORKER &&
- response_type_ != FALLBACK_TO_RENDERER) {
- ServiceWorkerResponseInfo::ForRequest(request_, true)
- ->OnStartCompleted(
- false /* was_fetched_via_service_worker */,
- false /* was_fetched_via_foreign_fetch */,
- false /* was_fallback_required */,
- std::vector<GURL>() /* url_list_via_service_worker */,
- blink::WebServiceWorkerResponseTypeDefault,
- base::TimeTicks() /* service_worker_start_time */,
- base::TimeTicks() /* service_worker_ready_time */,
- false /* respons_is_in_cache_storage */,
- std::string() /* response_cache_storage_cache_name */,
- ServiceWorkerHeaderList() /* cors_exposed_header_names */);
- return;
+ switch (response_type_) {
+ case NOT_DETERMINED:
+ NOTREACHED();
+ return;
+ case FAIL_DUE_TO_LOST_CONTROLLER:
+ case FALLBACK_TO_NETWORK:
+ // Indicate that the service worker did not respond to the request.
+ ServiceWorkerResponseInfo::ForRequest(request_, true)
+ ->OnStartCompleted(
+ false /* was_fetched_via_service_worker */,
+ false /* was_fetched_via_foreign_fetch */,
+ false /* was_fallback_required */,
+ std::vector<GURL>() /* url_list_via_service_worker */,
+ blink::WebServiceWorkerResponseTypeDefault,
+ base::TimeTicks() /* service_worker_start_time */,
+ base::TimeTicks() /* service_worker_ready_time */,
+ false /* response_is_in_cache_storage */,
+ std::string() /* response_cache_storage_cache_name */,
+ ServiceWorkerHeaderList() /* cors_exposed_header_names */);
+ break;
+ case FALLBACK_TO_RENDERER:
+ case FORWARD_TO_SERVICE_WORKER:
+ // Indicate that the service worker responded to the request, which is
+ // considered true if "fallback to renderer" was required since the
+ // renderer expects that.
+ ServiceWorkerResponseInfo::ForRequest(request_, true)
+ ->OnStartCompleted(
+ true /* was_fetched_via_service_worker */,
+ fetch_type_ == ServiceWorkerFetchType::FOREIGN_FETCH,
+ fall_back_required_, response_url_list_,
+ service_worker_response_type_, worker_start_time_,
+ worker_ready_time_, response_is_in_cache_storage_,
+ response_cache_storage_cache_name_, cors_exposed_header_names_);
+ break;
}
- ServiceWorkerResponseInfo::ForRequest(request_, true)
- ->OnStartCompleted(true /* was_fetched_via_service_worker */,
- fetch_type_ == ServiceWorkerFetchType::FOREIGN_FETCH,
- fall_back_required_, response_url_list_,
- service_worker_response_type_, worker_start_time_,
- worker_ready_time_, response_is_in_cache_storage_,
- response_cache_storage_cache_name_,
- cors_exposed_header_names_);
}
bool ServiceWorkerURLRequestJob::IsMainResourceLoad() const {

Powered by Google App Engine
This is Rietveld 408576698