Chromium Code Reviews| 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 8cb4d125cc2dc52de7b09bf31ae3c14fe8173ce1..82f6a4b49720139bc016a17f9840ade59b63807f 100644 |
| --- a/content/browser/service_worker/service_worker_version.cc |
| +++ b/content/browser/service_worker/service_worker_version.cc |
| @@ -138,25 +138,31 @@ ServiceWorkerVersionInfo ServiceWorkerVersion::GetInfo() { |
| embedded_worker()->thread_id()); |
| } |
| -void ServiceWorkerVersion::StartWorker(const StatusCallback& callback) { |
| +void ServiceWorkerVersion::StartWorker( |
| + const StatusCallback& callback, |
| + const std::vector<int>& possible_process_ids) { |
| DCHECK(embedded_worker_); |
| - if (running_status() == RUNNING) { |
| - RunSoon(base::Bind(callback, SERVICE_WORKER_OK)); |
| - return; |
| - } |
| - if (running_status() == STOPPING) { |
| - RunSoon(base::Bind(callback, SERVICE_WORKER_ERROR_START_WORKER_FAILED)); |
| - return; |
| - } |
| - if (start_callbacks_.empty()) { |
| - ServiceWorkerStatusCode status = embedded_worker_->Start( |
| - version_id_, scope_, script_url_); |
| - if (status != SERVICE_WORKER_OK) { |
| - RunSoon(base::Bind(callback, status)); |
| + switch (running_status()) { |
|
kinuko
2014/04/25 13:46:35
This looks nicer, thanks.
|
| + 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); |
| + if (running_status() == STOPPED) { |
| + embedded_worker_->Start( |
| + version_id_, |
| + scope_, |
| + script_url_, |
| + possible_process_ids, |
| + base::Bind(&ServiceWorkerVersion::RunStartWorkerCallbacksOnError, |
| + weak_factory_.GetWeakPtr())); |
| + } |
| return; |
| - } |
| } |
| - start_callbacks_.push_back(callback); |
| } |
| void ServiceWorkerVersion::StopWorker(const StatusCallback& callback) { |
| @@ -181,10 +187,13 @@ void ServiceWorkerVersion::SendMessage( |
| if (running_status() != RUNNING) { |
| // Schedule calling this method after starting the worker. |
| StartWorker(base::Bind(&RunTaskAfterStartWorker, |
| - weak_factory_.GetWeakPtr(), callback, |
| + weak_factory_.GetWeakPtr(), |
| + callback, |
| base::Bind(&self::SendMessage, |
| weak_factory_.GetWeakPtr(), |
| - message, callback))); |
| + message, |
| + callback)), |
| + std::vector<int>()); |
| return; |
| } |
| @@ -192,22 +201,27 @@ void ServiceWorkerVersion::SendMessage( |
| RunSoon(base::Bind(callback, status)); |
| } |
| -void ServiceWorkerVersion::DispatchInstallEvent( |
| - int active_version_id, |
| - const StatusCallback& callback) { |
| - DCHECK_EQ(NEW, status()) << status(); |
| +void ServiceWorkerVersion::DispatchInstallEvent(int active_version_id, |
| + const StatusCallback& callback, |
| + bool second_call) { |
| + if (!second_call) |
| + DCHECK_EQ(NEW, status()) << status(); |
| + SetStatus(INSTALLING); |
| if (running_status() != RUNNING) { |
| // Schedule calling this method after starting the worker. |
| StartWorker(base::Bind(&RunTaskAfterStartWorker, |
| - weak_factory_.GetWeakPtr(), callback, |
| + weak_factory_.GetWeakPtr(), |
| + callback, |
| base::Bind(&self::DispatchInstallEvent, |
| weak_factory_.GetWeakPtr(), |
| - active_version_id, callback))); |
| + active_version_id, |
| + callback, |
| + true)), |
| + std::vector<int>()); |
| return; |
| } |
| - SetStatus(INSTALLING); |
| int request_id = install_callbacks_.Add(new StatusCallback(callback)); |
| ServiceWorkerStatusCode status = embedded_worker_->SendMessage( |
| ServiceWorkerMsg_InstallEvent(request_id, active_version_id)); |
| @@ -217,21 +231,25 @@ void ServiceWorkerVersion::DispatchInstallEvent( |
| } |
| } |
| -void ServiceWorkerVersion::DispatchActivateEvent( |
| - const StatusCallback& callback) { |
| - DCHECK_EQ(INSTALLED, status()) << status(); |
| +void ServiceWorkerVersion::DispatchActivateEvent(const StatusCallback& callback, |
| + bool second_call) { |
| + if (!second_call) |
| + DCHECK_EQ(INSTALLED, status()) << status(); |
| + SetStatus(ACTIVATING); |
|
Jeffrey Yasskin
2014/04/25 04:40:33
This fixes the url_request_job_unittest, which was
kinuko
2014/04/25 13:46:35
Uh oh I see. Thanks for noticing, this was sketchy
Jeffrey Yasskin
2014/04/26 03:52:19
Using a new field for this will allow the user to
|
| if (running_status() != RUNNING) { |
| // Schedule calling this method after starting the worker. |
| StartWorker(base::Bind(&RunTaskAfterStartWorker, |
| - weak_factory_.GetWeakPtr(), callback, |
| + weak_factory_.GetWeakPtr(), |
| + callback, |
| base::Bind(&self::DispatchActivateEvent, |
| weak_factory_.GetWeakPtr(), |
| - callback))); |
| + callback, |
| + true)), |
| + std::vector<int>()); |
| return; |
| } |
| - SetStatus(ACTIVATING); |
| int request_id = activate_callbacks_.Add(new StatusCallback(callback)); |
| ServiceWorkerStatusCode status = embedded_worker_->SendMessage( |
| ServiceWorkerMsg_ActivateEvent(request_id)); |
| @@ -253,7 +271,9 @@ void ServiceWorkerVersion::DispatchFetchEvent( |
| base::Bind(&RunErrorFetchCallback, callback), |
| base::Bind(&self::DispatchFetchEvent, |
| weak_factory_.GetWeakPtr(), |
| - request, callback))); |
| + request, |
| + callback)), |
| + std::vector<int>()); |
| return; |
| } |
| @@ -280,10 +300,12 @@ void ServiceWorkerVersion::DispatchSyncEvent(const StatusCallback& callback) { |
| if (running_status() != RUNNING) { |
| // Schedule calling this method after starting the worker. |
| StartWorker(base::Bind(&RunTaskAfterStartWorker, |
| - weak_factory_.GetWeakPtr(), callback, |
| + weak_factory_.GetWeakPtr(), |
| + callback, |
| base::Bind(&self::DispatchSyncEvent, |
| weak_factory_.GetWeakPtr(), |
| - callback))); |
| + callback)), |
| + std::vector<int>()); |
| return; |
| } |
| @@ -433,6 +455,12 @@ bool ServiceWorkerVersion::OnMessageReceived(const IPC::Message& message) { |
| return handled; |
| } |
| +void ServiceWorkerVersion::RunStartWorkerCallbacksOnError( |
| + ServiceWorkerStatusCode status) { |
| + if (status != SERVICE_WORKER_OK) |
| + RunCallbacks(this, &start_callbacks_, status); |
| +} |
| + |
| void ServiceWorkerVersion::OnGetClientDocuments(int request_id) { |
| std::vector<int> client_ids; |
| ControlleeByIDMap::iterator it(&controllee_by_id_); |