| 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_registration.h" | 5 #include "content/browser/service_worker/service_worker_registration.h" |
| 6 | 6 |
| 7 #include "content/browser/service_worker/service_worker_context_core.h" | 7 #include "content/browser/service_worker/service_worker_context_core.h" |
| 8 #include "content/browser/service_worker/service_worker_info.h" | 8 #include "content/browser/service_worker/service_worker_info.h" |
| 9 #include "content/browser/service_worker/service_worker_register_job.h" | 9 #include "content/browser/service_worker/service_worker_register_job.h" |
| 10 #include "content/browser/service_worker/service_worker_utils.h" | 10 #include "content/browser/service_worker/service_worker_utils.h" |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 77 return ServiceWorkerRegistrationInfo( | 77 return ServiceWorkerRegistrationInfo( |
| 78 pattern(), registration_id_, | 78 pattern(), registration_id_, |
| 79 is_deleted_ ? ServiceWorkerRegistrationInfo::IS_DELETED | 79 is_deleted_ ? ServiceWorkerRegistrationInfo::IS_DELETED |
| 80 : ServiceWorkerRegistrationInfo::IS_NOT_DELETED, | 80 : ServiceWorkerRegistrationInfo::IS_NOT_DELETED, |
| 81 GetVersionInfo(active_version_.get()), | 81 GetVersionInfo(active_version_.get()), |
| 82 GetVersionInfo(waiting_version_.get()), | 82 GetVersionInfo(waiting_version_.get()), |
| 83 GetVersionInfo(installing_version_.get()), resources_total_size_bytes_); | 83 GetVersionInfo(installing_version_.get()), resources_total_size_bytes_); |
| 84 } | 84 } |
| 85 | 85 |
| 86 void ServiceWorkerRegistration::SetActiveVersion( | 86 void ServiceWorkerRegistration::SetActiveVersion( |
| 87 ServiceWorkerVersion* version) { | 87 const scoped_refptr<ServiceWorkerVersion>& version) { |
| 88 should_activate_when_ready_ = false; | 88 should_activate_when_ready_ = false; |
| 89 SetVersionInternal(version, &active_version_, | 89 if (active_version_ == version) |
| 90 ChangedVersionAttributesMask::ACTIVE_VERSION); | 90 return; |
| 91 |
| 92 ChangedVersionAttributesMask mask; |
| 93 if (version) |
| 94 UnsetVersionInternal(version.get(), &mask); |
| 95 if (active_version_) |
| 96 active_version_->RemoveListener(this); |
| 97 active_version_ = version; |
| 98 if (active_version_) |
| 99 active_version_->AddListener(this); |
| 100 mask.add(ChangedVersionAttributesMask::ACTIVE_VERSION); |
| 101 |
| 102 FOR_EACH_OBSERVER(Listener, listeners_, |
| 103 OnVersionAttributesChanged(this, mask, GetInfo())); |
| 91 } | 104 } |
| 92 | 105 |
| 93 void ServiceWorkerRegistration::SetWaitingVersion( | 106 void ServiceWorkerRegistration::SetWaitingVersion( |
| 94 ServiceWorkerVersion* version) { | 107 const scoped_refptr<ServiceWorkerVersion>& version) { |
| 95 should_activate_when_ready_ = false; | 108 should_activate_when_ready_ = false; |
| 96 SetVersionInternal(version, &waiting_version_, | 109 if (waiting_version_ == version) |
| 97 ChangedVersionAttributesMask::WAITING_VERSION); | 110 return; |
| 111 |
| 112 ChangedVersionAttributesMask mask; |
| 113 if (version) |
| 114 UnsetVersionInternal(version.get(), &mask); |
| 115 waiting_version_ = version; |
| 116 mask.add(ChangedVersionAttributesMask::WAITING_VERSION); |
| 117 |
| 118 FOR_EACH_OBSERVER(Listener, listeners_, |
| 119 OnVersionAttributesChanged(this, mask, GetInfo())); |
| 98 } | 120 } |
| 99 | 121 |
| 100 void ServiceWorkerRegistration::SetInstallingVersion( | 122 void ServiceWorkerRegistration::SetInstallingVersion( |
| 101 ServiceWorkerVersion* version) { | 123 const scoped_refptr<ServiceWorkerVersion>& version) { |
| 102 SetVersionInternal(version, &installing_version_, | 124 if (installing_version_ == version) |
| 103 ChangedVersionAttributesMask::INSTALLING_VERSION); | 125 return; |
| 126 |
| 127 ChangedVersionAttributesMask mask; |
| 128 if (version) |
| 129 UnsetVersionInternal(version.get(), &mask); |
| 130 installing_version_ = version; |
| 131 mask.add(ChangedVersionAttributesMask::INSTALLING_VERSION); |
| 132 |
| 133 FOR_EACH_OBSERVER(Listener, listeners_, |
| 134 OnVersionAttributesChanged(this, mask, GetInfo())); |
| 104 } | 135 } |
| 105 | 136 |
| 106 void ServiceWorkerRegistration::UnsetVersion(ServiceWorkerVersion* version) { | 137 void ServiceWorkerRegistration::UnsetVersion(ServiceWorkerVersion* version) { |
| 107 if (!version) | 138 if (!version) |
| 108 return; | 139 return; |
| 109 ChangedVersionAttributesMask mask; | 140 ChangedVersionAttributesMask mask; |
| 110 UnsetVersionInternal(version, &mask); | 141 UnsetVersionInternal(version, &mask); |
| 111 if (mask.changed()) { | 142 if (mask.changed()) { |
| 112 ServiceWorkerRegistrationInfo info = GetInfo(); | 143 ServiceWorkerRegistrationInfo info = GetInfo(); |
| 113 FOR_EACH_OBSERVER(Listener, listeners_, | 144 FOR_EACH_OBSERVER(Listener, listeners_, |
| 114 OnVersionAttributesChanged(this, mask, info)); | 145 OnVersionAttributesChanged(this, mask, info)); |
| 115 } | 146 } |
| 116 } | 147 } |
| 117 | 148 |
| 118 void ServiceWorkerRegistration::SetVersionInternal( | |
| 119 ServiceWorkerVersion* version, | |
| 120 scoped_refptr<ServiceWorkerVersion>* data_member, | |
| 121 int change_flag) { | |
| 122 if (version == data_member->get()) | |
| 123 return; | |
| 124 scoped_refptr<ServiceWorkerVersion> protect(version); | |
| 125 ChangedVersionAttributesMask mask; | |
| 126 if (version) | |
| 127 UnsetVersionInternal(version, &mask); | |
| 128 if (*data_member && *data_member == active_version_) | |
| 129 active_version_->RemoveListener(this); | |
| 130 *data_member = version; | |
| 131 if (active_version_.get() && active_version_.get() == version) | |
| 132 active_version_->AddListener(this); | |
| 133 mask.add(change_flag); | |
| 134 ServiceWorkerRegistrationInfo info = GetInfo(); | |
| 135 FOR_EACH_OBSERVER(Listener, listeners_, | |
| 136 OnVersionAttributesChanged(this, mask, info)); | |
| 137 } | |
| 138 | |
| 139 void ServiceWorkerRegistration::UnsetVersionInternal( | 149 void ServiceWorkerRegistration::UnsetVersionInternal( |
| 140 ServiceWorkerVersion* version, | 150 ServiceWorkerVersion* version, |
| 141 ChangedVersionAttributesMask* mask) { | 151 ChangedVersionAttributesMask* mask) { |
| 142 DCHECK(version); | 152 DCHECK(version); |
| 143 if (installing_version_.get() == version) { | 153 if (installing_version_.get() == version) { |
| 144 installing_version_ = NULL; | 154 installing_version_ = NULL; |
| 145 mask->add(ChangedVersionAttributesMask::INSTALLING_VERSION); | 155 mask->add(ChangedVersionAttributesMask::INSTALLING_VERSION); |
| 146 } else if (waiting_version_.get() == version) { | 156 } else if (waiting_version_.get() == version) { |
| 147 waiting_version_ = NULL; | 157 waiting_version_ = NULL; |
| 148 mask->add(ChangedVersionAttributesMask::WAITING_VERSION); | 158 mask->add(ChangedVersionAttributesMask::WAITING_VERSION); |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 271 // "2. Terminate exitingWorker." | 281 // "2. Terminate exitingWorker." |
| 272 exiting_version->StopWorker( | 282 exiting_version->StopWorker( |
| 273 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); | 283 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); |
| 274 // "3. Run the [[UpdateState]] algorithm passing exitingWorker and | 284 // "3. Run the [[UpdateState]] algorithm passing exitingWorker and |
| 275 // "redundant" as the arguments." | 285 // "redundant" as the arguments." |
| 276 exiting_version->SetStatus(ServiceWorkerVersion::REDUNDANT); | 286 exiting_version->SetStatus(ServiceWorkerVersion::REDUNDANT); |
| 277 } | 287 } |
| 278 | 288 |
| 279 // "6. Set serviceWorkerRegistration.activeWorker to activatingWorker." | 289 // "6. Set serviceWorkerRegistration.activeWorker to activatingWorker." |
| 280 // "7. Set serviceWorkerRegistration.waitingWorker to null." | 290 // "7. Set serviceWorkerRegistration.waitingWorker to null." |
| 281 SetActiveVersion(activating_version.get()); | 291 SetActiveVersion(activating_version); |
| 282 | 292 |
| 283 // "8. Run the [[UpdateState]] algorithm passing registration.activeWorker and | 293 // "8. Run the [[UpdateState]] algorithm passing registration.activeWorker and |
| 284 // "activating" as arguments." | 294 // "activating" as arguments." |
| 285 activating_version->SetStatus(ServiceWorkerVersion::ACTIVATING); | 295 activating_version->SetStatus(ServiceWorkerVersion::ACTIVATING); |
| 286 // "9. Fire a simple event named controllerchange..." | 296 // "9. Fire a simple event named controllerchange..." |
| 287 if (activating_version->skip_waiting()) | 297 if (activating_version->skip_waiting()) |
| 288 FOR_EACH_OBSERVER(Listener, listeners_, OnSkippedWaiting(this)); | 298 FOR_EACH_OBSERVER(Listener, listeners_, OnSkippedWaiting(this)); |
| 289 | 299 |
| 290 // "10. Queue a task to fire an event named activate..." | 300 // "10. Queue a task to fire an event named activate..." |
| 291 activating_version->DispatchActivateEvent( | 301 activating_version->DispatchActivateEvent( |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 391 if (!context_) { | 401 if (!context_) { |
| 392 callback.Run(SERVICE_WORKER_ERROR_ABORT); | 402 callback.Run(SERVICE_WORKER_ERROR_ABORT); |
| 393 return; | 403 return; |
| 394 } | 404 } |
| 395 context_->storage()->NotifyDoneInstallingRegistration( | 405 context_->storage()->NotifyDoneInstallingRegistration( |
| 396 this, version.get(), status); | 406 this, version.get(), status); |
| 397 callback.Run(status); | 407 callback.Run(status); |
| 398 } | 408 } |
| 399 | 409 |
| 400 } // namespace content | 410 } // namespace content |
| OLD | NEW |