summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--content/browser/service_worker/embedded_worker_test_helper.h5
-rw-r--r--content/browser/service_worker/service_worker_job_unittest.cc35
-rw-r--r--content/browser/service_worker/service_worker_register_job.cc2
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, &registration));
+
+ 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);
}