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

Unified Diff: content/browser/service_worker/service_worker_controllee_request_handler_unittest.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_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);

Powered by Google App Engine
This is Rietveld 408576698