summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordominicc@chromium.org <dominicc@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-04-04 02:14:46 +0000
committerdominicc@chromium.org <dominicc@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-04-04 02:14:46 +0000
commitf0f20e80a423bedb8fe73ac1195944be699808dd (patch)
treec645262464c009727325df04f859813240f017bd
parent02f27a501c11a7a7c17dacbad0caef1357d318c4 (diff)
downloadchromium_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
-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);
}