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..c880270b0657b35c1391928c3eb017ad4ef54725 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()) { |
| + 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) { |
| @@ -196,48 +202,39 @@ void ServiceWorkerVersion::DispatchInstallEvent( |
| int active_version_id, |
| const StatusCallback& callback) { |
| 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, |
| - base::Bind(&self::DispatchInstallEvent, |
| - weak_factory_.GetWeakPtr(), |
| - active_version_id, callback))); |
| - return; |
| - } |
| - |
| - SetStatus(INSTALLING); |
| - int request_id = install_callbacks_.Add(new StatusCallback(callback)); |
| - ServiceWorkerStatusCode status = embedded_worker_->SendMessage( |
| - ServiceWorkerMsg_InstallEvent(request_id, active_version_id)); |
| - if (status != SERVICE_WORKER_OK) { |
| - install_callbacks_.Remove(request_id); |
| - RunSoon(base::Bind(callback, status)); |
| + StartWorker( |
| + base::Bind(&RunTaskAfterStartWorker, |
| + weak_factory_.GetWeakPtr(), |
| + callback, |
| + base::Bind(&self::DispatchInstallEventAfterStartWorker, |
| + weak_factory_.GetWeakPtr(), |
| + active_version_id, |
| + callback))); |
| + } else { |
| + DispatchInstallEventAfterStartWorker(active_version_id, callback); |
|
kinuko
2014/04/28 06:58:16
Thx, using private methods look nicer to me.
|
| } |
| } |
| void ServiceWorkerVersion::DispatchActivateEvent( |
| const StatusCallback& callback) { |
| DCHECK_EQ(INSTALLED, status()) << status(); |
| + SetStatus(ACTIVATING); |
| if (running_status() != RUNNING) { |
| // Schedule calling this method after starting the worker. |
| - StartWorker(base::Bind(&RunTaskAfterStartWorker, |
| - weak_factory_.GetWeakPtr(), callback, |
| - base::Bind(&self::DispatchActivateEvent, |
| - weak_factory_.GetWeakPtr(), |
| - callback))); |
| - return; |
| - } |
| - |
| - SetStatus(ACTIVATING); |
| - int request_id = activate_callbacks_.Add(new StatusCallback(callback)); |
| - ServiceWorkerStatusCode status = embedded_worker_->SendMessage( |
| - ServiceWorkerMsg_ActivateEvent(request_id)); |
| - if (status != SERVICE_WORKER_OK) { |
| - activate_callbacks_.Remove(request_id); |
| - RunSoon(base::Bind(callback, status)); |
| + StartWorker( |
| + base::Bind(&RunTaskAfterStartWorker, |
| + weak_factory_.GetWeakPtr(), |
| + callback, |
| + base::Bind(&self::DispatchActivateEventAfterStartWorker, |
| + weak_factory_.GetWeakPtr(), |
| + callback))); |
| + } else { |
| + DispatchActivateEventAfterStartWorker(callback); |
| } |
| } |
| @@ -433,6 +430,39 @@ 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::DispatchInstallEventAfterStartWorker( |
| + int active_version_id, |
| + const StatusCallback& callback) { |
| + DCHECK_EQ(RUNNING, running_status()) |
| + << "Worker stopped too soon after it was started."; |
| + int request_id = install_callbacks_.Add(new StatusCallback(callback)); |
| + ServiceWorkerStatusCode status = embedded_worker_->SendMessage( |
| + ServiceWorkerMsg_InstallEvent(request_id, active_version_id)); |
| + if (status != SERVICE_WORKER_OK) { |
| + install_callbacks_.Remove(request_id); |
| + RunSoon(base::Bind(callback, status)); |
| + } |
| +} |
| + |
| +void ServiceWorkerVersion::DispatchActivateEventAfterStartWorker( |
| + const StatusCallback& callback) { |
| + DCHECK_EQ(RUNNING, running_status()) |
| + << "Worker stopped too soon after it was started."; |
| + int request_id = activate_callbacks_.Add(new StatusCallback(callback)); |
| + ServiceWorkerStatusCode status = |
| + embedded_worker_->SendMessage(ServiceWorkerMsg_ActivateEvent(request_id)); |
| + if (status != SERVICE_WORKER_OK) { |
| + activate_callbacks_.Remove(request_id); |
| + RunSoon(base::Bind(callback, status)); |
| + } |
| +} |
| + |
| void ServiceWorkerVersion::OnGetClientDocuments(int request_id) { |
| std::vector<int> client_ids; |
| ControlleeByIDMap::iterator it(&controllee_by_id_); |