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 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
110 UnsetVersionInternal(version, &mask); | 110 UnsetVersionInternal(version, &mask); |
111 if (mask.changed()) { | 111 if (mask.changed()) { |
112 ServiceWorkerRegistrationInfo info = GetInfo(); | 112 ServiceWorkerRegistrationInfo info = GetInfo(); |
113 FOR_EACH_OBSERVER(Listener, listeners_, | 113 FOR_EACH_OBSERVER(Listener, listeners_, |
114 OnVersionAttributesChanged(this, mask, info)); | 114 OnVersionAttributesChanged(this, mask, info)); |
115 } | 115 } |
116 } | 116 } |
117 | 117 |
118 void ServiceWorkerRegistration::SetVersionInternal( | 118 void ServiceWorkerRegistration::SetVersionInternal( |
119 ServiceWorkerVersion* version, | 119 ServiceWorkerVersion* version, |
120 scoped_refptr<ServiceWorkerVersion>* data_member, | 120 scoped_refptr<ServiceWorkerVersion>* data_member, |
dcheng
2014/12/04 00:17:09
o.O
| |
121 int change_flag) { | 121 int change_flag) { |
122 if (version == data_member->get()) | 122 if (version == data_member->get()) |
123 return; | 123 return; |
124 scoped_refptr<ServiceWorkerVersion> protect(version); | 124 scoped_refptr<ServiceWorkerVersion> protect(version); |
125 ChangedVersionAttributesMask mask; | 125 ChangedVersionAttributesMask mask; |
126 if (version) | 126 if (version) |
127 UnsetVersionInternal(version, &mask); | 127 UnsetVersionInternal(version, &mask); |
128 if (data_member->get() && data_member->get() == active_version_.get()) | |
dcheng
2014/12/04 00:17:09
if (data_member && *data_member == active_version_
xiang
2014/12/04 07:51:37
seems it should be "if (*data_member && *data_memb
| |
129 active_version_->RemoveListener(this); | |
128 *data_member = version; | 130 *data_member = version; |
129 if (active_version_.get() && active_version_.get() == version) | 131 if (active_version_.get() && active_version_.get() == version) |
130 active_version_->AddListener(this); | 132 active_version_->AddListener(this); |
131 mask.add(change_flag); | 133 mask.add(change_flag); |
132 ServiceWorkerRegistrationInfo info = GetInfo(); | 134 ServiceWorkerRegistrationInfo info = GetInfo(); |
133 FOR_EACH_OBSERVER(Listener, listeners_, | 135 FOR_EACH_OBSERVER(Listener, listeners_, |
134 OnVersionAttributesChanged(this, mask, info)); | 136 OnVersionAttributesChanged(this, mask, info)); |
135 } | 137 } |
136 | 138 |
137 void ServiceWorkerRegistration::UnsetVersionInternal( | 139 void ServiceWorkerRegistration::UnsetVersionInternal( |
138 ServiceWorkerVersion* version, | 140 ServiceWorkerVersion* version, |
139 ChangedVersionAttributesMask* mask) { | 141 ChangedVersionAttributesMask* mask) { |
140 DCHECK(version); | 142 DCHECK(version); |
141 if (installing_version_.get() == version) { | 143 if (installing_version_.get() == version) { |
142 installing_version_ = NULL; | 144 installing_version_ = NULL; |
143 mask->add(ChangedVersionAttributesMask::INSTALLING_VERSION); | 145 mask->add(ChangedVersionAttributesMask::INSTALLING_VERSION); |
144 } else if (waiting_version_.get() == version) { | 146 } else if (waiting_version_.get() == version) { |
145 waiting_version_ = NULL; | 147 waiting_version_ = NULL; |
146 mask->add(ChangedVersionAttributesMask::WAITING_VERSION); | 148 mask->add(ChangedVersionAttributesMask::WAITING_VERSION); |
147 } else if (active_version_.get() == version) { | 149 } else if (active_version_.get() == version) { |
148 active_version_->RemoveListener(this); | 150 active_version_->RemoveListener(this); |
149 active_version_ = NULL; | 151 active_version_ = NULL; |
150 mask->add(ChangedVersionAttributesMask::ACTIVE_VERSION); | 152 mask->add(ChangedVersionAttributesMask::ACTIVE_VERSION); |
151 } | 153 } |
152 } | 154 } |
153 | 155 |
154 void ServiceWorkerRegistration::ActivateWaitingVersionWhenReady() { | 156 void ServiceWorkerRegistration::ActivateWaitingVersionWhenReady() { |
155 DCHECK(waiting_version()); | 157 DCHECK(waiting_version()); |
156 should_activate_when_ready_ = true; | 158 should_activate_when_ready_ = true; |
157 if (!active_version() || !active_version()->HasControllee()) | 159 if (!active_version() || !active_version()->HasControllee() || |
160 waiting_version()->skip_waiting()) | |
158 ActivateWaitingVersion(); | 161 ActivateWaitingVersion(); |
159 } | 162 } |
160 | 163 |
161 void ServiceWorkerRegistration::ClearWhenReady() { | 164 void ServiceWorkerRegistration::ClearWhenReady() { |
162 DCHECK(context_); | 165 DCHECK(context_); |
163 if (is_uninstalling_) | 166 if (is_uninstalling_) |
164 return; | 167 return; |
165 is_uninstalling_ = true; | 168 is_uninstalling_ = true; |
166 | 169 |
167 context_->storage()->NotifyUninstallingRegistration(this); | 170 context_->storage()->NotifyUninstallingRegistration(this); |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
213 DCHECK(should_activate_when_ready_); | 216 DCHECK(should_activate_when_ready_); |
214 should_activate_when_ready_ = false; | 217 should_activate_when_ready_ = false; |
215 scoped_refptr<ServiceWorkerVersion> activating_version = waiting_version(); | 218 scoped_refptr<ServiceWorkerVersion> activating_version = waiting_version(); |
216 scoped_refptr<ServiceWorkerVersion> exiting_version = active_version(); | 219 scoped_refptr<ServiceWorkerVersion> exiting_version = active_version(); |
217 | 220 |
218 if (activating_version->is_doomed() || | 221 if (activating_version->is_doomed() || |
219 activating_version->status() == ServiceWorkerVersion::REDUNDANT) { | 222 activating_version->status() == ServiceWorkerVersion::REDUNDANT) { |
220 return; // Activation is no longer relevant. | 223 return; // Activation is no longer relevant. |
221 } | 224 } |
222 | 225 |
223 // "4. If exitingWorker is not null, | 226 // "5. If exitingWorker is not null, |
224 if (exiting_version.get()) { | 227 if (exiting_version.get()) { |
225 DCHECK(!exiting_version->HasControllee()); | |
226 // TODO(michaeln): should wait for events to be complete | 228 // TODO(michaeln): should wait for events to be complete |
227 // "1. Wait for exitingWorker to finish handling any in-progress requests." | 229 // "1. Wait for exitingWorker to finish handling any in-progress requests." |
228 // "2. Terminate exitingWorker." | 230 // "2. Terminate exitingWorker." |
229 exiting_version->StopWorker( | 231 exiting_version->StopWorker( |
230 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); | 232 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); |
231 // "3. Run the [[UpdateState]] algorithm passing exitingWorker and | 233 // "3. Run the [[UpdateState]] algorithm passing exitingWorker and |
232 // "redundant" as the arguments." | 234 // "redundant" as the arguments." |
233 exiting_version->SetStatus(ServiceWorkerVersion::REDUNDANT); | 235 exiting_version->SetStatus(ServiceWorkerVersion::REDUNDANT); |
234 } | 236 } |
235 | 237 |
236 // "5. Set serviceWorkerRegistration.activeWorker to activatingWorker." | 238 // "6. Set serviceWorkerRegistration.activeWorker to activatingWorker." |
237 // "6. Set serviceWorkerRegistration.waitingWorker to null." | 239 // "7. Set serviceWorkerRegistration.waitingWorker to null." |
238 SetActiveVersion(activating_version.get()); | 240 SetActiveVersion(activating_version.get()); |
239 | 241 |
240 // "7. Run the [[UpdateState]] algorithm passing registration.activeWorker and | 242 // "8. Run the [[UpdateState]] algorithm passing registration.activeWorker and |
241 // "activating" as arguments." | 243 // "activating" as arguments." |
242 activating_version->SetStatus(ServiceWorkerVersion::ACTIVATING); | 244 activating_version->SetStatus(ServiceWorkerVersion::ACTIVATING); |
245 // "9. Fire a simple event named controllerchange..." | |
246 // Notify associated provider hosts to change the controller. | |
247 if (activating_version->skip_waiting()) | |
248 FOR_EACH_OBSERVER(Listener, listeners_, OnSkippedWaiting(this)); | |
243 | 249 |
244 // TODO(nhiroki): "8. Fire a simple event named controllerchange..." | 250 // "10. Queue a task to fire an event named activate..." |
245 | |
246 // "9. Queue a task to fire an event named activate..." | |
247 activating_version->DispatchActivateEvent( | 251 activating_version->DispatchActivateEvent( |
248 base::Bind(&ServiceWorkerRegistration::OnActivateEventFinished, | 252 base::Bind(&ServiceWorkerRegistration::OnActivateEventFinished, |
249 this, activating_version)); | 253 this, activating_version)); |
250 } | 254 } |
251 | 255 |
252 void ServiceWorkerRegistration::OnActivateEventFinished( | 256 void ServiceWorkerRegistration::OnActivateEventFinished( |
253 ServiceWorkerVersion* activating_version, | 257 ServiceWorkerVersion* activating_version, |
254 ServiceWorkerStatusCode status) { | 258 ServiceWorkerStatusCode status) { |
255 if (!context_ || activating_version != active_version()) | 259 if (!context_ || activating_version != active_version()) |
256 return; | 260 return; |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
328 if (!context_) { | 332 if (!context_) { |
329 callback.Run(SERVICE_WORKER_ERROR_ABORT); | 333 callback.Run(SERVICE_WORKER_ERROR_ABORT); |
330 return; | 334 return; |
331 } | 335 } |
332 context_->storage()->NotifyDoneInstallingRegistration( | 336 context_->storage()->NotifyDoneInstallingRegistration( |
333 this, version.get(), status); | 337 this, version.get(), status); |
334 callback.Run(status); | 338 callback.Run(status); |
335 } | 339 } |
336 | 340 |
337 } // namespace content | 341 } // namespace content |
OLD | NEW |