| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/service_worker/service_worker_register_job.h" | 5 #include "content/browser/service_worker/service_worker_register_job.h" |
| 6 | 6 |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "content/browser/service_worker/service_worker_context_core.h" | 9 #include "content/browser/service_worker/service_worker_context_core.h" |
| 10 #include "content/browser/service_worker/service_worker_job_coordinator.h" | 10 #include "content/browser/service_worker/service_worker_job_coordinator.h" |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 78 // registration and abort. | 78 // registration and abort. |
| 79 if (registration.get() && registration->script_url() == script_url_) { | 79 if (registration.get() && registration->script_url() == script_url_) { |
| 80 registration_ = registration; | 80 registration_ = registration; |
| 81 // If there's no active version, go ahead to Update (this isn't in the spec | 81 // If there's no active version, go ahead to Update (this isn't in the spec |
| 82 // but seems reasonable, and without SoftUpdate implemented we can never | 82 // but seems reasonable, and without SoftUpdate implemented we can never |
| 83 // Update otherwise). | 83 // Update otherwise). |
| 84 if (!registration_->active_version()) { | 84 if (!registration_->active_version()) { |
| 85 UpdateAndContinue(status); | 85 UpdateAndContinue(status); |
| 86 return; | 86 return; |
| 87 } | 87 } |
| 88 RunCallbacks(status, registration_->active_version()); | 88 RunCallbacks(status, registration_, registration_->active_version()); |
| 89 Complete(SERVICE_WORKER_OK); | 89 Complete(SERVICE_WORKER_OK); |
| 90 return; | 90 return; |
| 91 } | 91 } |
| 92 | 92 |
| 93 // "If serviceWorkerRegistration is null..." create a new registration. | 93 // "If serviceWorkerRegistration is null..." create a new registration. |
| 94 if (!registration.get()) { | 94 if (!registration.get()) { |
| 95 RegisterAndContinue(SERVICE_WORKER_OK); | 95 RegisterAndContinue(SERVICE_WORKER_OK); |
| 96 return; | 96 return; |
| 97 } | 97 } |
| 98 | 98 |
| 99 // On script URL mismatch, "set serviceWorkerRegistration.scriptUrl to | 99 // On script URL mismatch, "set serviceWorkerRegistration.scriptUrl to |
| 100 // script." We accomplish this by deleting the existing registration and | 100 // script." We accomplish this by deleting the existing registration and |
| 101 // registering a new one. | 101 // registering a new one. |
| 102 // TODO(falken): Match the spec. We now throw away the active_version_ and | 102 // TODO(falken): Match the spec. We now throw away the active_version_ and |
| 103 // pending_version_ of the existing registration, which isn't in the spec. | 103 // pending_version_ of the existing registration, which isn't in the spec. |
| 104 registration->Shutdown(); | |
| 105 context_->storage()->DeleteRegistration( | 104 context_->storage()->DeleteRegistration( |
| 106 pattern_, | 105 pattern_, |
| 107 base::Bind(&ServiceWorkerRegisterJob::RegisterAndContinue, | 106 base::Bind(&ServiceWorkerRegisterJob::RegisterAndContinue, |
| 108 weak_factory_.GetWeakPtr())); | 107 weak_factory_.GetWeakPtr())); |
| 109 } | 108 } |
| 110 | 109 |
| 111 // Registers a new ServiceWorkerRegistration. | 110 // Registers a new ServiceWorkerRegistration. |
| 112 void ServiceWorkerRegisterJob::RegisterAndContinue( | 111 void ServiceWorkerRegisterJob::RegisterAndContinue( |
| 113 ServiceWorkerStatusCode status) { | 112 ServiceWorkerStatusCode status) { |
| 114 DCHECK(!registration_); | 113 DCHECK(!registration_); |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 167 Complete(status); | 166 Complete(status); |
| 168 return; | 167 return; |
| 169 } | 168 } |
| 170 | 169 |
| 171 // "Resolve promise with serviceWorker." | 170 // "Resolve promise with serviceWorker." |
| 172 // Although the spec doesn't set pendingWorker until after resolving the | 171 // Although the spec doesn't set pendingWorker until after resolving the |
| 173 // promise, our system's resolving works by passing ServiceWorkerRegistration | 172 // promise, our system's resolving works by passing ServiceWorkerRegistration |
| 174 // to the callbacks, so pendingWorker must be set first. | 173 // to the callbacks, so pendingWorker must be set first. |
| 175 DCHECK(!registration_->pending_version()); | 174 DCHECK(!registration_->pending_version()); |
| 176 registration_->set_pending_version(pending_version_); | 175 registration_->set_pending_version(pending_version_); |
| 177 RunCallbacks(status, pending_version_.get()); | 176 RunCallbacks(status, registration_, pending_version_.get()); |
| 178 | 177 |
| 179 InstallAndContinue(); | 178 InstallAndContinue(); |
| 180 } | 179 } |
| 181 | 180 |
| 182 // This function corresponds to the spec's _Install algorithm. | 181 // This function corresponds to the spec's _Install algorithm. |
| 183 void ServiceWorkerRegisterJob::InstallAndContinue() { | 182 void ServiceWorkerRegisterJob::InstallAndContinue() { |
| 184 // "Set serviceWorkerRegistration.pendingWorker._state to installing." | 183 // "Set serviceWorkerRegistration.pendingWorker._state to installing." |
| 185 // "Fire install event on the associated ServiceWorkerGlobalScope object." | 184 // "Fire install event on the associated ServiceWorkerGlobalScope object." |
| 186 pending_version_->DispatchInstallEvent( | 185 pending_version_->DispatchInstallEvent( |
| 187 -1, | 186 -1, |
| (...skipping 27 matching lines...) Expand all Loading... |
| 215 registration_->set_active_version(pending_version_); | 214 registration_->set_active_version(pending_version_); |
| 216 pending_version_ = NULL; | 215 pending_version_ = NULL; |
| 217 Complete(SERVICE_WORKER_OK); | 216 Complete(SERVICE_WORKER_OK); |
| 218 } | 217 } |
| 219 | 218 |
| 220 void ServiceWorkerRegisterJob::Complete(ServiceWorkerStatusCode status) { | 219 void ServiceWorkerRegisterJob::Complete(ServiceWorkerStatusCode status) { |
| 221 // In success case the callbacks must have been dispatched already | 220 // In success case the callbacks must have been dispatched already |
| 222 // (so this is no-op), otherwise we must have come here for abort case, | 221 // (so this is no-op), otherwise we must have come here for abort case, |
| 223 // so dispatch callbacks with NULL. | 222 // so dispatch callbacks with NULL. |
| 224 DCHECK(callbacks_.empty() || status != SERVICE_WORKER_OK); | 223 DCHECK(callbacks_.empty() || status != SERVICE_WORKER_OK); |
| 225 RunCallbacks(status, NULL); | 224 RunCallbacks(status, NULL, NULL); |
| 226 | |
| 227 // If |pending_version_| exists, it was not activated, so we are the sole | |
| 228 // owner of it, so it will be destroyed when this job ends, so Shutdown here. | |
| 229 // We should be able to remove this code later, when something else holds a | |
| 230 // reference to |pending_version_|. | |
| 231 // TODO(kinuko): Fix these ownership and shutdown semantics. | |
| 232 if (pending_version_) { | |
| 233 DCHECK(!registration_->pending_version()); | |
| 234 DCHECK(!registration_->active_version()); | |
| 235 pending_version_->Shutdown(); | |
| 236 } | |
| 237 | 225 |
| 238 context_->job_coordinator()->FinishJob(pattern_, this); | 226 context_->job_coordinator()->FinishJob(pattern_, this); |
| 239 } | 227 } |
| 240 | 228 |
| 241 void ServiceWorkerRegisterJob::RunCallbacks(ServiceWorkerStatusCode status, | 229 void ServiceWorkerRegisterJob::RunCallbacks( |
| 242 ServiceWorkerVersion* version) { | 230 ServiceWorkerStatusCode status, |
| 231 ServiceWorkerRegistration* registration, |
| 232 ServiceWorkerVersion* version) { |
| 243 for (std::vector<RegistrationCallback>::iterator it = callbacks_.begin(); | 233 for (std::vector<RegistrationCallback>::iterator it = callbacks_.begin(); |
| 244 it != callbacks_.end(); | 234 it != callbacks_.end(); |
| 245 ++it) { | 235 ++it) { |
| 246 it->Run(status, version); | 236 it->Run(status, registration, version); |
| 247 } | 237 } |
| 248 callbacks_.clear(); | 238 callbacks_.clear(); |
| 249 } | 239 } |
| 250 | 240 |
| 251 } // namespace content | 241 } // namespace content |
| OLD | NEW |