diff options
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); } |