Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(937)

Unified Diff: content/browser/service_worker/service_worker_version.cc

Issue 238043002: Teach EmbeddedWorkerInstance to create a process when it needs one. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix another compile error. Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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_);

Powered by Google App Engine
This is Rietveld 408576698