diff options
author | dominicc@chromium.org <dominicc@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-04-04 02:14:46 +0000 |
---|---|---|
committer | dominicc@chromium.org <dominicc@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-04-04 02:14:46 +0000 |
commit | f0f20e80a423bedb8fe73ac1195944be699808dd (patch) | |
tree | c645262464c009727325df04f859813240f017bd | |
parent | 02f27a501c11a7a7c17dacbad0caef1357d318c4 (diff) | |
download | chromium_src-f0f20e80a423bedb8fe73ac1195944be699808dd.zip chromium_src-f0f20e80a423bedb8fe73ac1195944be699808dd.tar.gz chromium_src-f0f20e80a423bedb8fe73ac1195944be699808dd.tar.bz2 |
Don't promulgate the registration a ServiceWorker when registration fails.
ServiceWorkerContextCore, for example, DCHECKed when presented with
ServiceWorker registration flow failure status code, but a non-null
registration object.
BUG=359433
TEST=ServiceWorkerJobTest.Register_FailToStartWorker
Review URL: https://codereview.chromium.org/217163008
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@261634 0039d316-1c4b-4281-b951-d872f2087c98
3 files changed, 39 insertions, 3 deletions
diff --git a/content/browser/service_worker/embedded_worker_test_helper.h b/content/browser/service_worker/embedded_worker_test_helper.h index 78533aa..0fe5f5e 100644 --- a/content/browser/service_worker/embedded_worker_test_helper.h +++ b/content/browser/service_worker/embedded_worker_test_helper.h @@ -97,6 +97,9 @@ class EmbeddedWorkerTestHelper : public IPC::Sender, int request_id, const IPC::Message& message); + protected: + EmbeddedWorkerRegistry* registry(); + private: void OnStartWorkerStub(int embedded_worker_id, int64 service_worker_version_id, @@ -110,8 +113,6 @@ class EmbeddedWorkerTestHelper : public IPC::Sender, void OnInstallEventStub(int active_version_id); void OnFetchEventStub(const ServiceWorkerFetchRequest& request); - EmbeddedWorkerRegistry* registry(); - base::WeakPtr<ServiceWorkerContextCore> context_; IPC::TestSink sink_; diff --git a/content/browser/service_worker/service_worker_job_unittest.cc b/content/browser/service_worker/service_worker_job_unittest.cc index 38efca1..7a4bf9f 100644 --- a/content/browser/service_worker/service_worker_job_unittest.cc +++ b/content/browser/service_worker/service_worker_job_unittest.cc @@ -392,6 +392,41 @@ TEST_F(ServiceWorkerJobTest, RegisterDuplicateScript) { ASSERT_EQ(new_registration, old_registration); } +class FailToStartWorkerTestHelper : public EmbeddedWorkerTestHelper { + public: + FailToStartWorkerTestHelper(ServiceWorkerContextCore* context, + int mock_render_process_id) + : EmbeddedWorkerTestHelper(context, mock_render_process_id) {} + + virtual void OnStartWorker(int embedded_worker_id, + int64 service_worker_version_id, + const GURL& script_url) OVERRIDE { + // Simulate failure by sending worker stopped instead of started. + EmbeddedWorkerInstance* worker = registry()->GetWorker(embedded_worker_id); + registry()->OnWorkerStopped(worker->process_id(), embedded_worker_id); + } +}; + +TEST_F(ServiceWorkerJobTest, Register_FailToStartWorker) { + helper_.reset( + new FailToStartWorkerTestHelper(context_.get(), render_process_id_)); + + bool called = false; + scoped_refptr<ServiceWorkerRegistration> registration; + job_coordinator()->Register( + GURL("http://www.example.com/*"), + GURL("http://www.example.com/service_worker.js"), + render_process_id_, + SaveRegistration( + SERVICE_WORKER_ERROR_START_WORKER_FAILED, &called, ®istration)); + + ASSERT_FALSE(called); + base::RunLoop().RunUntilIdle(); + + ASSERT_TRUE(called); + ASSERT_EQ(scoped_refptr<ServiceWorkerRegistration>(NULL), registration); +} + // Register and then unregister the pattern, in parallel. Job coordinator should // process jobs until the last job. TEST_F(ServiceWorkerJobTest, ParallelRegUnreg) { diff --git a/content/browser/service_worker/service_worker_register_job.cc b/content/browser/service_worker/service_worker_register_job.cc index cc5fa80..3dcc80b 100644 --- a/content/browser/service_worker/service_worker_register_job.cc +++ b/content/browser/service_worker/service_worker_register_job.cc @@ -144,7 +144,7 @@ void ServiceWorkerRegisterJob::Complete(ServiceWorkerStatusCode status) { for (std::vector<RegistrationCallback>::iterator it = callbacks_.begin(); it != callbacks_.end(); ++it) { - it->Run(status, registration_); + it->Run(status, status == SERVICE_WORKER_OK ? registration_ : NULL); } context_->job_coordinator()->FinishJob(pattern_, this); } |