Chromium Code Reviews| Index: content/browser/service_worker/embedded_worker_instance.cc |
| diff --git a/content/browser/service_worker/embedded_worker_instance.cc b/content/browser/service_worker/embedded_worker_instance.cc |
| index 68e473dcebc15d57c5ee825054bcb4a78ba2ea23..b33ee1b1c8bc80841c74ba5123bff5c64d178d38 100644 |
| --- a/content/browser/service_worker/embedded_worker_instance.cc |
| +++ b/content/browser/service_worker/embedded_worker_instance.cc |
| @@ -155,6 +155,7 @@ void EmbeddedWorkerInstance::Start(int64 service_worker_version_id, |
| const StatusCallback& callback) { |
| if (!context_) { |
| callback.Run(SERVICE_WORKER_ERROR_ABORT); |
| + // |this| may be destroyed by the callback. |
| return; |
| } |
| DCHECK(status_ == STOPPED); |
| @@ -284,11 +285,7 @@ void EmbeddedWorkerInstance::ProcessAllocated( |
| params.get(), |
| "Status", status); |
| if (status != SERVICE_WORKER_OK) { |
| - Status old_status = status_; |
| - status_ = STOPPED; |
| - service_registry_.reset(); |
| - callback.Run(status); |
| - FOR_EACH_OBSERVER(Listener, listener_list_, OnStopped(old_status)); |
| + OnStartFailed(callback, status); |
| return; |
| } |
| const int64 service_worker_version_id = params->service_worker_version_id; |
| @@ -318,8 +315,7 @@ void EmbeddedWorkerInstance::SendStartWorker( |
| // process, making process_id_ and other state invalid. If that happened, |
| // abort instead of trying to send the IPC. |
| if (status_ != STARTING) { |
| - callback.Run(SERVICE_WORKER_ERROR_ABORT); |
| - ReleaseProcess(); |
| + OnStartFailed(callback, SERVICE_WORKER_ERROR_ABORT); |
| return; |
| } |
| @@ -354,7 +350,7 @@ void EmbeddedWorkerInstance::SendStartWorker( |
| ServiceWorkerStatusCode status = |
| registry_->SendStartWorker(params.Pass(), process_id_); |
| if (status != SERVICE_WORKER_OK) { |
| - callback.Run(status); |
| + OnStartFailed(callback, status); |
|
nhiroki
2015/09/17 06:14:13
I guess this could fix issue 531345. Before this p
|
| return; |
| } |
| DCHECK(start_callback_.is_null()); |
| @@ -410,9 +406,11 @@ void EmbeddedWorkerInstance::OnScriptEvaluated(bool success) { |
| UMA_HISTOGRAM_TIMES("EmbeddedWorkerInstance.ScriptEvaluate", |
| base::TimeTicks::Now() - start_timing_); |
| } |
| - start_callback_.Run(success ? SERVICE_WORKER_OK |
| - : SERVICE_WORKER_ERROR_SCRIPT_EVALUATE_FAILED); |
| + StatusCallback callback = start_callback_; |
| start_callback_.Reset(); |
| + callback.Run(success ? SERVICE_WORKER_OK |
| + : SERVICE_WORKER_ERROR_SCRIPT_EVALUATE_FAILED); |
| + // |this| may be destroyed by the callback. |
| } |
| void EmbeddedWorkerInstance::OnStarted() { |
| @@ -504,6 +502,17 @@ void EmbeddedWorkerInstance::ReleaseProcess() { |
| start_callback_.Reset(); |
| } |
| +void EmbeddedWorkerInstance::OnStartFailed(const StatusCallback& callback, |
| + ServiceWorkerStatusCode status) { |
| + Status old_status = status_; |
| + ReleaseProcess(); |
| + base::WeakPtr<EmbeddedWorkerInstance> weak_this = weak_factory_.GetWeakPtr(); |
| + callback.Run(status); |
| + if (weak_this && old_status != STOPPED) |
| + FOR_EACH_OBSERVER(Listener, weak_this->listener_list_, |
| + OnStopped(old_status)); |
|
kinuko
2015/09/13 08:41:11
nit: would be better to update the comment for Lis
|
| +} |
| + |
| // static |
| std::string EmbeddedWorkerInstance::StatusToString(Status status) { |
| switch (status) { |