Index: content/browser/service_worker/service_worker_controllee_request_handler_unittest.cc |
diff --git a/content/browser/service_worker/service_worker_controllee_request_handler_unittest.cc b/content/browser/service_worker/service_worker_controllee_request_handler_unittest.cc |
index 17d580e1e33199fd41944d52a2127bc18c3a32ec..8132f4d9c67c9cbf4e3ef6cb026460efbcba29ee 100644 |
--- a/content/browser/service_worker/service_worker_controllee_request_handler_unittest.cc |
+++ b/content/browser/service_worker/service_worker_controllee_request_handler_unittest.cc |
@@ -301,6 +301,48 @@ TEST_P(ServiceWorkerControlleeRequestHandlerTestP, DeletedProviderHost) { |
EXPECT_FALSE(sw_job->ShouldForwardToServiceWorker()); |
} |
+// Tests the scenario where a controllee request handler was created |
+// for a subresource request, but before MaybeCreateJob() is run, the |
+// controller/active version becomes null. |
+TEST_P(ServiceWorkerControlleeRequestHandlerTestP, LostActiveVersion) { |
+ // Store an activated worker. |
+ version_->set_fetch_handler_existence( |
+ ServiceWorkerVersion::FetchHandlerExistence::EXISTS); |
+ version_->SetStatus(ServiceWorkerVersion::ACTIVATED); |
+ registration_->SetActiveVersion(version_); |
+ context()->storage()->StoreRegistration( |
+ registration_.get(), version_.get(), |
+ base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); |
+ base::RunLoop().RunUntilIdle(); |
+ |
+ // Conduct a main resource load to set the controller. |
+ ServiceWorkerRequestTestResources main_test_resources( |
+ this, GURL("https://host/scope/doc"), RESOURCE_TYPE_MAIN_FRAME); |
+ main_test_resources.MaybeCreateJob(); |
+ base::RunLoop().RunUntilIdle(); |
+ EXPECT_TRUE(version_->HasControllee()); |
+ EXPECT_EQ(version_, provider_host_->controlling_version()); |
+ EXPECT_EQ(version_, provider_host_->active_version()); |
+ |
+ // Unset the active version. |
+ provider_host_->NotifyControllerLost(); |
+ registration_->SetActiveVersion(nullptr); |
+ EXPECT_FALSE(version_->HasControllee()); |
+ EXPECT_FALSE(provider_host_->controlling_version()); |
+ EXPECT_FALSE(provider_host_->active_version()); |
+ |
+ // Conduct a subresource load. |
+ ServiceWorkerRequestTestResources sub_test_resources( |
+ this, GURL("https://host/scope/doc"), RESOURCE_TYPE_IMAGE); |
+ ServiceWorkerURLRequestJob* sub_job = sub_test_resources.MaybeCreateJob(); |
+ base::RunLoop().RunUntilIdle(); |
+ |
+ // Verify that the job errored. |
+ EXPECT_EQ( |
+ ServiceWorkerURLRequestJob::ResponseType::FAIL_DUE_TO_LOST_CONTROLLER, |
+ sub_job->response_type_); |
+} |
+ |
TEST_P(ServiceWorkerControlleeRequestHandlerTestP, FallbackWithNoFetchHandler) { |
version_->set_fetch_handler_existence( |
ServiceWorkerVersion::FetchHandlerExistence::DOES_NOT_EXIST); |