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

Side by Side Diff: content/browser/service_worker/service_worker_registration.cc

Issue 413063004: Service Worker: in Unregister, wait until after the active worker no longer controls a document (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 4 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 12 matching lines...) Expand all
23 } // namespace 23 } // namespace
24 24
25 ServiceWorkerRegistration::ServiceWorkerRegistration( 25 ServiceWorkerRegistration::ServiceWorkerRegistration(
26 const GURL& pattern, 26 const GURL& pattern,
27 const GURL& script_url, 27 const GURL& script_url,
28 int64 registration_id, 28 int64 registration_id,
29 base::WeakPtr<ServiceWorkerContextCore> context) 29 base::WeakPtr<ServiceWorkerContextCore> context)
30 : pattern_(pattern), 30 : pattern_(pattern),
31 script_url_(script_url), 31 script_url_(script_url),
32 registration_id_(registration_id), 32 registration_id_(registration_id),
33 is_uninstalling_(false),
33 context_(context) { 34 context_(context) {
34 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 35 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
35 DCHECK(context_); 36 DCHECK(context_);
36 context_->AddLiveRegistration(this); 37 context_->AddLiveRegistration(this);
37 } 38 }
38 39
39 ServiceWorkerRegistration::~ServiceWorkerRegistration() { 40 ServiceWorkerRegistration::~ServiceWorkerRegistration() {
40 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 41 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
41 if (context_) 42 if (context_)
42 context_->RemoveLiveRegistration(registration_id_); 43 context_->RemoveLiveRegistration(registration_id_);
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
84 return; 85 return;
85 ChangedVersionAttributesMask mask; 86 ChangedVersionAttributesMask mask;
86 UnsetVersionInternal(version, &mask); 87 UnsetVersionInternal(version, &mask);
87 if (mask.changed()) { 88 if (mask.changed()) {
88 ServiceWorkerRegistrationInfo info = GetInfo(); 89 ServiceWorkerRegistrationInfo info = GetInfo();
89 FOR_EACH_OBSERVER(Listener, listeners_, 90 FOR_EACH_OBSERVER(Listener, listeners_,
90 OnVersionAttributesChanged(this, mask, info)); 91 OnVersionAttributesChanged(this, mask, info));
91 } 92 }
92 } 93 }
93 94
95 void ServiceWorkerRegistration::OnNoControllees(ServiceWorkerVersion* version) {
96 DCHECK_EQ(active_version(), version);
97 version->RemoveListener(this);
98 if (is_uninstalling())
99 Uninstall();
100 }
101
94 void ServiceWorkerRegistration::SetVersionInternal( 102 void ServiceWorkerRegistration::SetVersionInternal(
95 ServiceWorkerVersion* version, 103 ServiceWorkerVersion* version,
96 scoped_refptr<ServiceWorkerVersion>* data_member, 104 scoped_refptr<ServiceWorkerVersion>* data_member,
97 int change_flag) { 105 int change_flag) {
98 if (version == data_member->get()) 106 if (version == data_member->get())
99 return; 107 return;
100 scoped_refptr<ServiceWorkerVersion> protect(version); 108 scoped_refptr<ServiceWorkerVersion> protect(version);
101 ChangedVersionAttributesMask mask; 109 ChangedVersionAttributesMask mask;
102 if (version) 110 if (version)
103 UnsetVersionInternal(version, &mask); 111 UnsetVersionInternal(version, &mask);
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
157 activating_version->SetStatus(ServiceWorkerVersion::ACTIVATING); 165 activating_version->SetStatus(ServiceWorkerVersion::ACTIVATING);
158 166
159 // TODO(nhiroki): "8. Fire a simple event named controllerchange..." 167 // TODO(nhiroki): "8. Fire a simple event named controllerchange..."
160 168
161 // "9. Queue a task to fire an event named activate..." 169 // "9. Queue a task to fire an event named activate..."
162 activating_version->DispatchActivateEvent( 170 activating_version->DispatchActivateEvent(
163 base::Bind(&ServiceWorkerRegistration::OnActivateEventFinished, 171 base::Bind(&ServiceWorkerRegistration::OnActivateEventFinished,
164 this, activating_version, completion_callback)); 172 this, activating_version, completion_callback));
165 } 173 }
166 174
175 void ServiceWorkerRegistration::StartUninstall() {
michaeln 2014/07/25 00:02:04 let's harmonize on naming, i'm using ActivateWait
falken 2014/07/25 12:47:25 Sounds good.
176 DCHECK(context_);
177 set_uninstalling(true);
178 // "11. Wait until no document is using registration as their Service Worker
179 // registration."
180 if (active_version() && active_version()->HasControllee())
181 active_version()->AddListener(this);
182 else
183 Uninstall();
184 }
185
186 void ServiceWorkerRegistration::Uninstall() {
187 DCHECK(is_uninstalling());
188 if (!context_)
189 return;
190
191 // "12. If registration.activeWorker is not null, then:"
192 if (active_version()) {
193 // "1. Run the [[UpdateState]] algorithm passing registration.activeWorker
194 // and 'redundant' as the arguments."
195 active_version()->Doom();
196 // "2. Set registration.activeWorker to null."
197 UnsetVersion(active_version());
198 }
199
200 // "13. Delete a Record {[[key]], [[value]]} entry of its
201 // [[ScopeToRegistrationMap]] where scope matches entry.[[key]]."
202 context_->storage()->DeleteRegistration(
203 id(),
204 script_url().GetOrigin(),
205 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback));
206 }
207
167 void ServiceWorkerRegistration::OnActivateEventFinished( 208 void ServiceWorkerRegistration::OnActivateEventFinished(
168 ServiceWorkerVersion* activating_version, 209 ServiceWorkerVersion* activating_version,
169 const StatusCallback& completion_callback, 210 const StatusCallback& completion_callback,
170 ServiceWorkerStatusCode status) { 211 ServiceWorkerStatusCode status) {
171 if (activating_version != active_version()) 212 if (activating_version != active_version())
172 return; 213 return;
173 // TODO(kinuko,falken): For some error cases (e.g. ServiceWorker is 214 // TODO(kinuko,falken): For some error cases (e.g. ServiceWorker is
174 // unexpectedly terminated) we may want to retry sending the event again. 215 // unexpectedly terminated) we may want to retry sending the event again.
175 if (status != SERVICE_WORKER_OK) { 216 if (status != SERVICE_WORKER_OK) {
176 // "11. If activateFailed is true, then:..." 217 // "11. If activateFailed is true, then:..."
(...skipping 15 matching lines...) Expand all
192 activating_version->SetStatus(ServiceWorkerVersion::ACTIVATED); 233 activating_version->SetStatus(ServiceWorkerVersion::ACTIVATED);
193 if (context_) { 234 if (context_) {
194 context_->storage()->UpdateToActiveState( 235 context_->storage()->UpdateToActiveState(
195 this, 236 this,
196 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); 237 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback));
197 } 238 }
198 completion_callback.Run(SERVICE_WORKER_OK); 239 completion_callback.Run(SERVICE_WORKER_OK);
199 } 240 }
200 241
201 } // namespace content 242 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698