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

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: Null out browser_context_ in Shutdown 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..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_);

Powered by Google App Engine
This is Rietveld 408576698