| 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..592f88b3095469d69db598ee3e20809836c127b5 100644
|
| --- a/content/browser/service_worker/service_worker_version.cc
|
| +++ b/content/browser/service_worker/service_worker_version.cc
|
| @@ -139,24 +139,34 @@ ServiceWorkerVersionInfo ServiceWorkerVersion::GetInfo() {
|
| }
|
|
|
| void ServiceWorkerVersion::StartWorker(const StatusCallback& callback) {
|
| + StartWorkerWithCandidateProcesses(std::vector<int>(), callback);
|
| +}
|
| +
|
| +void ServiceWorkerVersion::StartWorkerWithCandidateProcesses(
|
| + const std::vector<int>& possible_process_ids,
|
| + const StatusCallback& callback) {
|
| 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 +206,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);
|
| }
|
| }
|
|
|
| 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 +434,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_);
|
|
|