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

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

Issue 224733014: Introduce ServiceWorkerHandle for tracking WebServiceWorkerImpl reference (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: sigh, rebased Created 6 years, 8 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_version.h" 5 #include "content/browser/service_worker/service_worker_version.h"
6 6
7 #include "base/stl_util.h" 7 #include "base/stl_util.h"
8 #include "content/browser/service_worker/embedded_worker_instance.h" 8 #include "content/browser/service_worker/embedded_worker_instance.h"
9 #include "content/browser/service_worker/embedded_worker_registry.h" 9 #include "content/browser/service_worker/embedded_worker_registry.h"
10 #include "content/browser/service_worker/service_worker_context_core.h" 10 #include "content/browser/service_worker/service_worker_context_core.h"
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
160 callback.Run(status); 160 callback.Run(status);
161 } 161 }
162 162
163 } // namespace 163 } // namespace
164 164
165 ServiceWorkerVersion::ServiceWorkerVersion( 165 ServiceWorkerVersion::ServiceWorkerVersion(
166 ServiceWorkerRegistration* registration, 166 ServiceWorkerRegistration* registration,
167 int64 version_id, 167 int64 version_id,
168 base::WeakPtr<ServiceWorkerContextCore> context) 168 base::WeakPtr<ServiceWorkerContextCore> context)
169 : version_id_(version_id), 169 : version_id_(version_id),
170 registration_id_(kInvalidServiceWorkerVersionId),
170 status_(NEW), 171 status_(NEW),
171 is_shutdown_(false),
172 registration_(registration),
173 weak_factory_(this), 172 weak_factory_(this),
174 context_(context) { 173 context_(context) {
175 DCHECK(context_); 174 DCHECK(context_);
175 if (registration) {
176 registration_id_ = registration->id();
177 script_url_ = registration->script_url();
178 }
176 context_->AddLiveVersion(this); 179 context_->AddLiveVersion(this);
177 embedded_worker_ = context_->embedded_worker_registry()->CreateWorker(); 180 embedded_worker_ = context_->embedded_worker_registry()->CreateWorker();
178 embedded_worker_->AddObserver(this); 181 embedded_worker_->AddObserver(this);
179 } 182 }
180 183
181 ServiceWorkerVersion::~ServiceWorkerVersion() { 184 ServiceWorkerVersion::~ServiceWorkerVersion() {
182 DCHECK(is_shutdown_);
183 }
184
185 void ServiceWorkerVersion::Shutdown() {
186 is_shutdown_ = true;
187 registration_ = NULL;
188 status_change_callbacks_.clear(); 185 status_change_callbacks_.clear();
189 if (embedded_worker_) { 186 if (embedded_worker_) {
190 embedded_worker_->RemoveObserver(this); 187 embedded_worker_->RemoveObserver(this);
191 embedded_worker_.reset(); 188 embedded_worker_.reset();
192 } 189 }
193 if (context_) 190 if (context_)
194 context_->RemoveLiveVersion(version_id_); 191 context_->RemoveLiveVersion(version_id_);
195 } 192 }
196 193
197 void ServiceWorkerVersion::SetStatus(Status status) { 194 void ServiceWorkerVersion::SetStatus(Status status) {
(...skipping 14 matching lines...) Expand all
212 209
213 ServiceWorkerVersionInfo ServiceWorkerVersion::GetInfo() { 210 ServiceWorkerVersionInfo ServiceWorkerVersion::GetInfo() {
214 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 211 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
215 return ServiceWorkerVersionInfo(running_status(), 212 return ServiceWorkerVersionInfo(running_status(),
216 status(), 213 status(),
217 embedded_worker()->process_id(), 214 embedded_worker()->process_id(),
218 embedded_worker()->thread_id()); 215 embedded_worker()->thread_id());
219 } 216 }
220 217
221 void ServiceWorkerVersion::StartWorker(const StatusCallback& callback) { 218 void ServiceWorkerVersion::StartWorker(const StatusCallback& callback) {
222 DCHECK(!is_shutdown_);
223 DCHECK(embedded_worker_); 219 DCHECK(embedded_worker_);
224 DCHECK(registration_);
225 if (running_status() == RUNNING) { 220 if (running_status() == RUNNING) {
226 RunSoon(base::Bind(callback, SERVICE_WORKER_OK)); 221 RunSoon(base::Bind(callback, SERVICE_WORKER_OK));
227 return; 222 return;
228 } 223 }
229 if (running_status() == STOPPING) { 224 if (running_status() == STOPPING) {
230 RunSoon(base::Bind(callback, SERVICE_WORKER_ERROR_START_WORKER_FAILED)); 225 RunSoon(base::Bind(callback, SERVICE_WORKER_ERROR_START_WORKER_FAILED));
231 return; 226 return;
232 } 227 }
233 if (start_callbacks_.empty()) { 228 if (start_callbacks_.empty()) {
234 ServiceWorkerStatusCode status = embedded_worker_->Start( 229 ServiceWorkerStatusCode status = embedded_worker_->Start(
235 version_id_, 230 version_id_,
236 registration_->script_url()); 231 script_url_);
237 if (status != SERVICE_WORKER_OK) { 232 if (status != SERVICE_WORKER_OK) {
238 RunSoon(base::Bind(callback, status)); 233 RunSoon(base::Bind(callback, status));
239 return; 234 return;
240 } 235 }
241 } 236 }
242 start_callbacks_.push_back(callback); 237 start_callbacks_.push_back(callback);
243 } 238 }
244 239
245 void ServiceWorkerVersion::StopWorker(const StatusCallback& callback) { 240 void ServiceWorkerVersion::StopWorker(const StatusCallback& callback) {
246 DCHECK(!is_shutdown_);
247 DCHECK(embedded_worker_); 241 DCHECK(embedded_worker_);
248 if (running_status() == STOPPED) { 242 if (running_status() == STOPPED) {
249 RunSoon(base::Bind(callback, SERVICE_WORKER_OK)); 243 RunSoon(base::Bind(callback, SERVICE_WORKER_OK));
250 return; 244 return;
251 } 245 }
252 if (stop_callbacks_.empty()) { 246 if (stop_callbacks_.empty()) {
253 ServiceWorkerStatusCode status = embedded_worker_->Stop(); 247 ServiceWorkerStatusCode status = embedded_worker_->Stop();
254 if (status != SERVICE_WORKER_OK) { 248 if (status != SERVICE_WORKER_OK) {
255 RunSoon(base::Bind(callback, status)); 249 RunSoon(base::Bind(callback, status));
256 return; 250 return;
257 } 251 }
258 } 252 }
259 stop_callbacks_.push_back(callback); 253 stop_callbacks_.push_back(callback);
260 } 254 }
261 255
262 void ServiceWorkerVersion::SendMessage( 256 void ServiceWorkerVersion::SendMessage(
263 const IPC::Message& message, const StatusCallback& callback) { 257 const IPC::Message& message, const StatusCallback& callback) {
264 DCHECK(!is_shutdown_);
265 DCHECK(embedded_worker_); 258 DCHECK(embedded_worker_);
266 if (running_status() != RUNNING) { 259 if (running_status() != RUNNING) {
267 // Schedule calling this method after starting the worker. 260 // Schedule calling this method after starting the worker.
268 StartWorker(base::Bind(&RunTaskAfterStartWorker, 261 StartWorker(base::Bind(&RunTaskAfterStartWorker,
269 weak_factory_.GetWeakPtr(), callback, 262 weak_factory_.GetWeakPtr(), callback,
270 base::Bind(&self::SendMessage, 263 base::Bind(&self::SendMessage,
271 weak_factory_.GetWeakPtr(), 264 weak_factory_.GetWeakPtr(),
272 message, callback))); 265 message, callback)));
273 return; 266 return;
274 } 267 }
275 268
276 ServiceWorkerStatusCode status = embedded_worker_->SendMessage( 269 ServiceWorkerStatusCode status = embedded_worker_->SendMessage(
277 kInvalidServiceWorkerRequestId, message); 270 kInvalidServiceWorkerRequestId, message);
278 RunSoon(base::Bind(callback, status)); 271 RunSoon(base::Bind(callback, status));
279 } 272 }
280 273
281 void ServiceWorkerVersion::SendMessageAndRegisterCallback( 274 void ServiceWorkerVersion::SendMessageAndRegisterCallback(
282 const IPC::Message& message, const MessageCallback& callback) { 275 const IPC::Message& message, const MessageCallback& callback) {
283 DCHECK(!is_shutdown_);
284 DCHECK(embedded_worker_); 276 DCHECK(embedded_worker_);
285 if (running_status() != RUNNING) { 277 if (running_status() != RUNNING) {
286 // Schedule calling this method after starting the worker. 278 // Schedule calling this method after starting the worker.
287 StartWorker(base::Bind(&RunTaskAfterStartWorker, 279 StartWorker(base::Bind(&RunTaskAfterStartWorker,
288 weak_factory_.GetWeakPtr(), 280 weak_factory_.GetWeakPtr(),
289 base::Bind(&RunEmptyMessageCallback, callback), 281 base::Bind(&RunEmptyMessageCallback, callback),
290 base::Bind(&self::SendMessageAndRegisterCallback, 282 base::Bind(&self::SendMessageAndRegisterCallback,
291 weak_factory_.GetWeakPtr(), 283 weak_factory_.GetWeakPtr(),
292 message, callback))); 284 message, callback)));
293 return; 285 return;
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
350 } 342 }
351 343
352 void ServiceWorkerVersion::DispatchSyncEvent(const StatusCallback& callback) { 344 void ServiceWorkerVersion::DispatchSyncEvent(const StatusCallback& callback) {
353 DCHECK_EQ(ACTIVE, status()) << status(); 345 DCHECK_EQ(ACTIVE, status()) << status();
354 SendMessageAndRegisterCallback( 346 SendMessageAndRegisterCallback(
355 ServiceWorkerMsg_SyncEvent(), 347 ServiceWorkerMsg_SyncEvent(),
356 base::Bind(&HandleSyncEventFinished, callback)); 348 base::Bind(&HandleSyncEventFinished, callback));
357 } 349 }
358 350
359 void ServiceWorkerVersion::AddProcessToWorker(int process_id) { 351 void ServiceWorkerVersion::AddProcessToWorker(int process_id) {
360 DCHECK(!is_shutdown_);
361 embedded_worker_->AddProcessReference(process_id); 352 embedded_worker_->AddProcessReference(process_id);
362 } 353 }
363 354
364 void ServiceWorkerVersion::RemoveProcessToWorker(int process_id) { 355 void ServiceWorkerVersion::RemoveProcessFromWorker(int process_id) {
365 // We may have been shutdown. 356 embedded_worker_->ReleaseProcessReference(process_id);
366 if (embedded_worker_)
367 embedded_worker_->ReleaseProcessReference(process_id);
368 } 357 }
369 358
370 void ServiceWorkerVersion::OnStarted() { 359 void ServiceWorkerVersion::OnStarted() {
371 DCHECK_EQ(RUNNING, running_status()); 360 DCHECK_EQ(RUNNING, running_status());
372 // Fire all start callbacks. 361 // Fire all start callbacks.
373 RunCallbacks(this, &start_callbacks_, SERVICE_WORKER_OK); 362 RunCallbacks(this, &start_callbacks_, SERVICE_WORKER_OK);
374 } 363 }
375 364
376 void ServiceWorkerVersion::OnStopped() { 365 void ServiceWorkerVersion::OnStopped() {
377 DCHECK_EQ(STOPPED, running_status()); 366 DCHECK_EQ(STOPPED, running_status());
(...skipping 25 matching lines...) Expand all
403 scoped_refptr<ServiceWorkerVersion> protect(this); 392 scoped_refptr<ServiceWorkerVersion> protect(this);
404 callback->Run(SERVICE_WORKER_OK, message); 393 callback->Run(SERVICE_WORKER_OK, message);
405 message_callbacks_.Remove(request_id); 394 message_callbacks_.Remove(request_id);
406 return; 395 return;
407 } 396 }
408 NOTREACHED() << "Got unexpected message: " << request_id 397 NOTREACHED() << "Got unexpected message: " << request_id
409 << " " << message.type(); 398 << " " << message.type();
410 } 399 }
411 400
412 } // namespace content 401 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698