Index: content/browser/service_worker/service_worker_register_job.cc |
diff --git a/content/browser/service_worker/service_worker_register_job.cc b/content/browser/service_worker/service_worker_register_job.cc |
index f293237f780dfb87e9759bc9b155a0173e8ed379..3a72e6f7566cd6dda0788d5106003585b90e8c4c 100644 |
--- a/content/browser/service_worker/service_worker_register_job.cc |
+++ b/content/browser/service_worker/service_worker_register_job.cc |
@@ -15,12 +15,15 @@ namespace content { |
ServiceWorkerRegisterJob::ServiceWorkerRegisterJob( |
ServiceWorkerStorage* storage, |
+ EmbeddedWorkerRegistry* worker_registry, |
ServiceWorkerJobCoordinator* coordinator, |
const GURL& pattern, |
const GURL& script_url, |
RegistrationType type) |
: storage_(storage), |
+ worker_registry_(worker_registry), |
coordinator_(coordinator), |
+ pending_version_(NULL), |
pattern_(pattern), |
script_url_(script_url), |
type_(type), |
@@ -28,9 +31,17 @@ ServiceWorkerRegisterJob::ServiceWorkerRegisterJob( |
ServiceWorkerRegisterJob::~ServiceWorkerRegisterJob() {} |
-void ServiceWorkerRegisterJob::AddCallback( |
- const RegistrationCallback& callback) { |
+void ServiceWorkerRegisterJob::AddCallback(const RegistrationCallback& callback, |
+ int process_id) { |
+ // if we've created a pending version, associate source_provider it with |
+ // that, otherwise queue it up |
callbacks_.push_back(callback); |
+ DCHECK(process_id != -1); |
+ if (pending_version_) { |
+ pending_version_->AddProcessToWorker(process_id); |
+ } else { |
+ pending_process_ids_.push_back(process_id); |
+ } |
} |
void ServiceWorkerRegisterJob::Start() { |
@@ -38,6 +49,7 @@ void ServiceWorkerRegisterJob::Start() { |
StartRegister(); |
else |
StartUnregister(); |
+ LOG(ERROR) << "Starting job of type " << type_; |
kinuko
2014/02/04 03:37:53
Please remove this line (or replace with DVLOG) be
alecflett
2014/02/04 20:09:04
Done.
|
} |
bool ServiceWorkerRegisterJob::Equals(ServiceWorkerRegisterJob* job) { |
@@ -49,13 +61,18 @@ bool ServiceWorkerRegisterJob::Equals(ServiceWorkerRegisterJob* job) { |
void ServiceWorkerRegisterJob::StartRegister() { |
// Set up a chain of callbacks, in reverse order. Each of these |
// callbacks may be called asynchronously by the previous callback. |
- RegistrationCallback finish_registration(base::Bind( |
+ StatusCallback finish_registration(base::Bind( |
&ServiceWorkerRegisterJob::RegisterComplete, weak_factory_.GetWeakPtr())); |
+ RegistrationCallback start_worker( |
+ base::Bind(&ServiceWorkerRegisterJob::StartWorkerAndContinue, |
+ weak_factory_.GetWeakPtr(), |
+ finish_registration)); |
+ |
UnregistrationCallback register_new( |
base::Bind(&ServiceWorkerRegisterJob::RegisterPatternAndContinue, |
weak_factory_.GetWeakPtr(), |
- finish_registration)); |
+ start_worker)); |
ServiceWorkerStorage::FindRegistrationCallback unregister_old( |
base::Bind(&ServiceWorkerRegisterJob::UnregisterPatternAndContinue, |
@@ -80,6 +97,36 @@ void ServiceWorkerRegisterJob::StartUnregister() { |
storage_->FindRegistrationForPattern(pattern_, unregister); |
} |
+void ServiceWorkerRegisterJob::StartWorkerAndContinue( |
+ const StatusCallback& callback, |
+ ServiceWorkerStatusCode status, |
+ const scoped_refptr<ServiceWorkerRegistration>& registration) { |
+ if (registration->active_version()) { |
+ // We have an active version, so we can complete immediately, even |
+ // if the service worker isn't running. |
+ callback.Run(registration, SERVICE_WORKER_OK); |
+ return; |
+ } |
+ |
+ pending_version_ = new ServiceWorkerVersion( |
+ registration, worker_registry_, registration->next_version_id()); |
+ LOG(ERROR) << "StartWorkerAndContinue..."; |
kinuko
2014/02/04 03:37:53
Ditto, please remove or replace with DVLOG
|
+ for (std::vector<int>::const_iterator it = pending_process_ids_.begin(); |
+ it != pending_process_ids_.end(); |
+ ++it) |
+ pending_version_->AddProcessToWorker(*it); |
+ |
+ // The callback to watch "installation" actually fires as soon as |
+ // the worker is up and running, just before the install event is |
+ // dispatched. The job will continue to run even though the main |
+ // callback has executed. |
kinuko
2014/02/04 03:37:53
After my next a few patches land (if they look goo
|
+ pending_version_->StartWorker(base::Bind(callback, registration)); |
+ |
+ // TODO(alecflett): Don't set the active version until just before |
+ // the activate event is dispatched. |
+ registration->set_active_version(pending_version_); |
+} |
+ |
void ServiceWorkerRegisterJob::RegisterPatternAndContinue( |
const RegistrationCallback& callback, |
ServiceWorkerStatusCode previous_status) { |
@@ -97,6 +144,7 @@ void ServiceWorkerRegisterJob::RegisterPatternAndContinue( |
// operation. Pass its resulting status through 'callback'. |
scoped_refptr<ServiceWorkerRegistration> registration = |
storage_->RegisterInternal(pattern_, script_url_); |
+ |
BrowserThread::PostTask(BrowserThread::IO, |
FROM_HERE, |
base::Bind(callback, SERVICE_WORKER_OK, |
@@ -109,6 +157,8 @@ void ServiceWorkerRegisterJob::UnregisterPatternAndContinue( |
ServiceWorkerStatusCode previous_status, |
const scoped_refptr<ServiceWorkerRegistration>& previous_registration) { |
+ LOG(ERROR) << "UnregisterPatternAndContinue(callback, " << found << ", " |
+ << previous_status << ", " << previous_registration << ");"; |
kinuko
2014/02/04 03:37:53
ditto
|
// The previous registration may not exist, which is ok. |
if (previous_status == SERVICE_WORKER_OK && found && |
(script_url_.is_empty() || |
@@ -118,6 +168,9 @@ void ServiceWorkerRegisterJob::UnregisterPatternAndContinue( |
// 'callback'. |
storage_->UnregisterInternal(pattern_); |
DCHECK(previous_registration->is_shutdown()); |
+ } else { |
+ // TODO(alecflett): We have an existing registration, we should |
+ // schedule an update. |
} |
BrowserThread::PostTask( |
BrowserThread::IO, FROM_HERE, base::Bind(callback, previous_status)); |
@@ -132,10 +185,11 @@ void ServiceWorkerRegisterJob::RunCallbacks( |
it->Run(status, registration); |
} |
} |
+ |
void ServiceWorkerRegisterJob::RegisterComplete( |
- ServiceWorkerStatusCode status, |
- const scoped_refptr<ServiceWorkerRegistration>& registration) { |
- RunCallbacks(status, registration); |
+ const scoped_refptr<ServiceWorkerRegistration>& registration, |
+ ServiceWorkerStatusCode start_status) { |
+ RunCallbacks(start_status, registration); |
coordinator_->FinishJob(pattern_, this); |
} |