| Index: content/browser/service_worker/service_worker_version.cc
|
| diff --git a/content/browser/service_worker/service_worker_version.cc b/content/browser/service_worker/service_worker_version.cc
|
| index 1e00b8227637cf7c82500244f7145911610324ca..693b10d3171c13b5fdf1edbc8fc3ad20a828c4d5 100644
|
| --- a/content/browser/service_worker/service_worker_version.cc
|
| +++ b/content/browser/service_worker/service_worker_version.cc
|
| @@ -177,13 +177,15 @@ void ServiceWorkerVersion::StartWorker(const StatusCallback& callback) {
|
| void ServiceWorkerVersion::StartWorker(
|
| bool pause_after_download,
|
| const StatusCallback& callback) {
|
| + if (is_doomed()) {
|
| + RunSoon(base::Bind(callback, SERVICE_WORKER_ERROR_START_WORKER_FAILED));
|
| + return;
|
| + }
|
| switch (running_status()) {
|
| case RUNNING:
|
| RunSoon(base::Bind(callback, SERVICE_WORKER_OK));
|
| return;
|
| case STOPPING:
|
| - RunSoon(base::Bind(callback, SERVICE_WORKER_ERROR_START_WORKER_FAILED));
|
| - return;
|
| case STOPPED:
|
| case STARTING:
|
| start_callbacks_.push_back(callback);
|
| @@ -543,16 +545,22 @@ void ServiceWorkerVersion::OnStarted() {
|
| FOR_EACH_OBSERVER(Listener, listeners_, OnWorkerStarted(this));
|
| }
|
|
|
| -void ServiceWorkerVersion::OnStopped() {
|
| +void ServiceWorkerVersion::OnStopped(
|
| + EmbeddedWorkerInstance::Status old_status) {
|
| DCHECK_EQ(STOPPED, running_status());
|
| scoped_refptr<ServiceWorkerVersion> protect(this);
|
|
|
| + bool should_restart = !is_doomed() && !start_callbacks_.empty() &&
|
| + (old_status != EmbeddedWorkerInstance::STARTING);
|
| +
|
| // Fire all stop callbacks.
|
| RunCallbacks(this, &stop_callbacks_, SERVICE_WORKER_OK);
|
|
|
| - // Let all start callbacks fail.
|
| - RunCallbacks(
|
| - this, &start_callbacks_, SERVICE_WORKER_ERROR_START_WORKER_FAILED);
|
| + if (!should_restart) {
|
| + // Let all start callbacks fail.
|
| + RunCallbacks(this, &start_callbacks_,
|
| + SERVICE_WORKER_ERROR_START_WORKER_FAILED);
|
| + }
|
|
|
| // Let all message callbacks fail (this will also fire and clear all
|
| // callbacks for events).
|
| @@ -584,6 +592,15 @@ void ServiceWorkerVersion::OnStopped() {
|
| // the listener prevents any pending completion callbacks from causing
|
| // messages to be sent to the stopped worker.
|
| cache_listener_.reset();
|
| +
|
| + // Restart worker if we have any start callbacks and the worker isn't doomed.
|
| + if (should_restart) {
|
| + cache_listener_.reset(new ServiceWorkerCacheListener(this, context_));
|
| + embedded_worker_->Start(
|
| + version_id_, scope_, script_url_, false /* pause_after_download */,
|
| + base::Bind(&ServiceWorkerVersion::OnStartMessageSent,
|
| + weak_factory_.GetWeakPtr()));
|
| + }
|
| }
|
|
|
| void ServiceWorkerVersion::OnReportException(
|
|
|