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

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

Issue 2019613003: ServiceWorker: Bypass SW when the script doesn't have fetch handler (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix the nits Created 4 years, 7 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/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 37330150cf04cd9b1f4d01a96483d190486b95c7..c31d4ba80ae561433f8cdb5090472816a7b01961 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
@@ -55,6 +55,45 @@ class FailureHelper : public EmbeddedWorkerTestHelper {
class ServiceWorkerControlleeRequestHandlerTest : public testing::Test {
public:
+ class ServiceWorkerRequestTestResources {
+ public:
+ ServiceWorkerRequestTestResources(
+ ServiceWorkerControlleeRequestHandlerTest* test,
+ const GURL& url,
+ ResourceType type)
+ : test_(test),
+ request_(test->url_request_context_.CreateRequest(
+ url,
+ net::DEFAULT_PRIORITY,
+ &test->url_request_delegate_)),
+ handler_(new ServiceWorkerControlleeRequestHandler(
+ test->context()->AsWeakPtr(),
+ test->provider_host_,
+ base::WeakPtr<storage::BlobStorageContext>(),
+ FETCH_REQUEST_MODE_NO_CORS,
+ FETCH_CREDENTIALS_MODE_OMIT,
+ FetchRedirectMode::FOLLOW_MODE,
+ type,
+ REQUEST_CONTEXT_TYPE_HYPERLINK,
+ REQUEST_CONTEXT_FRAME_TYPE_TOP_LEVEL,
+ scoped_refptr<ResourceRequestBody>())),
+ job_(nullptr) {}
+
+ ServiceWorkerURLRequestJob* MaybeCreateJob() {
+ job_.reset(handler_->MaybeCreateJob(request_.get(), nullptr,
+ &test_->mock_resource_context_));
+ return static_cast<ServiceWorkerURLRequestJob*>(job_.get());
+ }
+
+ void ResetHandler() { handler_.reset(nullptr); }
+
+ private:
+ ServiceWorkerControlleeRequestHandlerTest* test_;
+ std::unique_ptr<net::URLRequest> request_;
+ std::unique_ptr<ServiceWorkerControlleeRequestHandler> handler_;
+ std::unique_ptr<net::URLRequestJob> job_;
+ };
+
ServiceWorkerControlleeRequestHandlerTest()
: browser_thread_bundle_(TestBrowserThreadBundle::IO_MAINLOOP) {}
@@ -131,6 +170,7 @@ TEST_F(ServiceWorkerControlleeRequestHandlerTest, DisallowServiceWorker) {
// Store an activated worker.
version_->SetStatus(ServiceWorkerVersion::ACTIVATED);
+ version_->set_has_fetch_handler(true);
registration_->SetActiveVersion(version_);
context()->storage()->StoreRegistration(
registration_.get(),
@@ -139,21 +179,9 @@ TEST_F(ServiceWorkerControlleeRequestHandlerTest, DisallowServiceWorker) {
base::RunLoop().RunUntilIdle();
// Conduct a main resource load.
- const GURL kDocUrl("http://host/scope/doc");
- std::unique_ptr<net::URLRequest> request = url_request_context_.CreateRequest(
- kDocUrl, net::DEFAULT_PRIORITY, &url_request_delegate_);
- std::unique_ptr<ServiceWorkerControlleeRequestHandler> handler(
- new ServiceWorkerControlleeRequestHandler(
- context()->AsWeakPtr(), provider_host_,
- base::WeakPtr<storage::BlobStorageContext>(),
- FETCH_REQUEST_MODE_NO_CORS, FETCH_CREDENTIALS_MODE_OMIT,
- FetchRedirectMode::FOLLOW_MODE, RESOURCE_TYPE_MAIN_FRAME,
- REQUEST_CONTEXT_TYPE_HYPERLINK, REQUEST_CONTEXT_FRAME_TYPE_TOP_LEVEL,
- scoped_refptr<ResourceRequestBody>()));
- std::unique_ptr<net::URLRequestJob> job(
- handler->MaybeCreateJob(request.get(), nullptr, &mock_resource_context_));
- ServiceWorkerURLRequestJob* sw_job =
- static_cast<ServiceWorkerURLRequestJob*>(job.get());
+ ServiceWorkerRequestTestResources test_resources(
+ this, GURL("http://host/scope/doc"), RESOURCE_TYPE_MAIN_FRAME);
+ ServiceWorkerURLRequestJob* sw_job = test_resources.MaybeCreateJob();
EXPECT_FALSE(sw_job->ShouldFallbackToNetwork());
EXPECT_FALSE(sw_job->ShouldForwardToServiceWorker());
@@ -171,6 +199,7 @@ TEST_F(ServiceWorkerControlleeRequestHandlerTest, DisallowServiceWorker) {
TEST_F(ServiceWorkerControlleeRequestHandlerTest, ActivateWaitingVersion) {
// Store a registration that is installed but not activated yet.
version_->SetStatus(ServiceWorkerVersion::INSTALLED);
+ version_->set_has_fetch_handler(true);
registration_->SetWaitingVersion(version_);
context()->storage()->StoreRegistration(
registration_.get(),
@@ -179,21 +208,9 @@ TEST_F(ServiceWorkerControlleeRequestHandlerTest, ActivateWaitingVersion) {
base::RunLoop().RunUntilIdle();
// Conduct a main resource load.
- const GURL kDocUrl("http://host/scope/doc");
- std::unique_ptr<net::URLRequest> request = url_request_context_.CreateRequest(
- kDocUrl, net::DEFAULT_PRIORITY, &url_request_delegate_);
- std::unique_ptr<ServiceWorkerControlleeRequestHandler> handler(
- new ServiceWorkerControlleeRequestHandler(
- context()->AsWeakPtr(), provider_host_,
- base::WeakPtr<storage::BlobStorageContext>(),
- FETCH_REQUEST_MODE_NO_CORS, FETCH_CREDENTIALS_MODE_OMIT,
- FetchRedirectMode::FOLLOW_MODE, RESOURCE_TYPE_MAIN_FRAME,
- REQUEST_CONTEXT_TYPE_HYPERLINK, REQUEST_CONTEXT_FRAME_TYPE_TOP_LEVEL,
- scoped_refptr<ResourceRequestBody>()));
- std::unique_ptr<net::URLRequestJob> job(
- handler->MaybeCreateJob(request.get(), nullptr, &mock_resource_context_));
- ServiceWorkerURLRequestJob* sw_job =
- static_cast<ServiceWorkerURLRequestJob*>(job.get());
+ ServiceWorkerRequestTestResources test_resources(
+ this, GURL("http://host/scope/doc"), RESOURCE_TYPE_MAIN_FRAME);
+ ServiceWorkerURLRequestJob* sw_job = test_resources.MaybeCreateJob();
EXPECT_FALSE(sw_job->ShouldFallbackToNetwork());
EXPECT_FALSE(sw_job->ShouldForwardToServiceWorker());
@@ -208,7 +225,7 @@ TEST_F(ServiceWorkerControlleeRequestHandlerTest, ActivateWaitingVersion) {
EXPECT_TRUE(version_->HasControllee());
// Navigations should trigger an update too.
- handler.reset(NULL);
+ test_resources.ResetHandler();
EXPECT_TRUE(version_->update_timer_.IsRunning());
}
@@ -216,23 +233,15 @@ TEST_F(ServiceWorkerControlleeRequestHandlerTest, ActivateWaitingVersion) {
TEST_F(ServiceWorkerControlleeRequestHandlerTest, InstallingRegistration) {
// Create an installing registration.
version_->SetStatus(ServiceWorkerVersion::INSTALLING);
+ version_->set_has_fetch_handler(true);
registration_->SetInstallingVersion(version_);
context()->storage()->NotifyInstallingRegistration(registration_.get());
// Conduct a main resource load.
- const GURL kDocUrl("http://host/scope/doc");
- std::unique_ptr<net::URLRequest> request = url_request_context_.CreateRequest(
- kDocUrl, net::DEFAULT_PRIORITY, &url_request_delegate_);
- std::unique_ptr<ServiceWorkerControlleeRequestHandler> handler(
- new ServiceWorkerControlleeRequestHandler(
- context()->AsWeakPtr(), provider_host_,
- base::WeakPtr<storage::BlobStorageContext>(),
- FETCH_REQUEST_MODE_NO_CORS, FETCH_CREDENTIALS_MODE_OMIT,
- FetchRedirectMode::FOLLOW_MODE, RESOURCE_TYPE_MAIN_FRAME,
- REQUEST_CONTEXT_TYPE_HYPERLINK, REQUEST_CONTEXT_FRAME_TYPE_TOP_LEVEL,
- scoped_refptr<ResourceRequestBody>()));
- std::unique_ptr<net::URLRequestJob> job(
- handler->MaybeCreateJob(request.get(), nullptr, &mock_resource_context_));
+ ServiceWorkerRequestTestResources test_resources(
+ this, GURL("http://host/scope/doc"), RESOURCE_TYPE_MAIN_FRAME);
+ ServiceWorkerURLRequestJob* job = test_resources.MaybeCreateJob();
+
base::RunLoop().RunUntilIdle();
// The handler should have fallen back to network and destroyed the job. The
@@ -250,6 +259,7 @@ TEST_F(ServiceWorkerControlleeRequestHandlerTest, DeletedProviderHost) {
// Store a registration so the call to FindRegistrationForDocument will read
// from the database.
version_->SetStatus(ServiceWorkerVersion::ACTIVATED);
+ version_->set_has_fetch_handler(true);
registration_->SetActiveVersion(version_);
context()->storage()->StoreRegistration(
registration_.get(),
@@ -260,21 +270,9 @@ TEST_F(ServiceWorkerControlleeRequestHandlerTest, DeletedProviderHost) {
registration_ = NULL;
// Conduct a main resource load.
- const GURL kDocUrl("http://host/scope/doc");
- std::unique_ptr<net::URLRequest> request = url_request_context_.CreateRequest(
- kDocUrl, net::DEFAULT_PRIORITY, &url_request_delegate_);
- std::unique_ptr<ServiceWorkerControlleeRequestHandler> handler(
- new ServiceWorkerControlleeRequestHandler(
- context()->AsWeakPtr(), provider_host_,
- base::WeakPtr<storage::BlobStorageContext>(),
- FETCH_REQUEST_MODE_NO_CORS, FETCH_CREDENTIALS_MODE_OMIT,
- FetchRedirectMode::FOLLOW_MODE, RESOURCE_TYPE_MAIN_FRAME,
- REQUEST_CONTEXT_TYPE_HYPERLINK, REQUEST_CONTEXT_FRAME_TYPE_TOP_LEVEL,
- scoped_refptr<ResourceRequestBody>()));
- std::unique_ptr<net::URLRequestJob> job(
- handler->MaybeCreateJob(request.get(), nullptr, &mock_resource_context_));
- ServiceWorkerURLRequestJob* sw_job =
- static_cast<ServiceWorkerURLRequestJob*>(job.get());
+ ServiceWorkerRequestTestResources test_resources(
+ this, GURL("http://host/scope/doc"), RESOURCE_TYPE_MAIN_FRAME);
+ ServiceWorkerURLRequestJob* sw_job = test_resources.MaybeCreateJob();
EXPECT_FALSE(sw_job->ShouldFallbackToNetwork());
EXPECT_FALSE(sw_job->ShouldForwardToServiceWorker());
@@ -289,4 +287,37 @@ TEST_F(ServiceWorkerControlleeRequestHandlerTest, DeletedProviderHost) {
EXPECT_FALSE(sw_job->ShouldForwardToServiceWorker());
}
+TEST_F(ServiceWorkerControlleeRequestHandlerTest, FallbackWithNoFetchHandler) {
+ version_->SetStatus(ServiceWorkerVersion::ACTIVATED);
+ version_->set_has_fetch_handler(false);
+ registration_->SetActiveVersion(version_);
+ context()->storage()->StoreRegistration(
+ registration_.get(), version_.get(),
+ base::Bind(&ServiceWorkerUtils::NoOpStatusCallback));
+ base::RunLoop().RunUntilIdle();
+
+ ServiceWorkerRequestTestResources main_test_resources(
+ this, GURL("http://host/scope/doc"), RESOURCE_TYPE_MAIN_FRAME);
+ ServiceWorkerURLRequestJob* main_job = main_test_resources.MaybeCreateJob();
+
+ EXPECT_FALSE(main_job->ShouldFallbackToNetwork());
+ EXPECT_FALSE(main_job->ShouldForwardToServiceWorker());
+ EXPECT_FALSE(version_->HasControllee());
+
+ base::RunLoop().RunUntilIdle();
+
+ EXPECT_TRUE(main_job->ShouldFallbackToNetwork());
+ EXPECT_FALSE(main_job->ShouldForwardToServiceWorker());
+ EXPECT_TRUE(version_->HasControllee());
+ EXPECT_EQ(version_, provider_host_->controlling_version());
+
+ ServiceWorkerRequestTestResources sub_test_resources(
+ this, GURL("http://host/scope/doc/subresource"), RESOURCE_TYPE_IMAGE);
+ ServiceWorkerURLRequestJob* sub_job = sub_test_resources.MaybeCreateJob();
+
+ // This job shouldn't be created because this worker doesn't have fetch
+ // handler.
+ EXPECT_EQ(nullptr, sub_job);
+}
+
} // namespace content

Powered by Google App Engine
This is Rietveld 408576698