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

Side by Side Diff: content/child/service_worker/service_worker_dispatcher.cc

Issue 1307133003: ServiceWorker: Make APIs that return ServiceWorkerRegistration coin a new JS object (2/3) (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 3 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
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/child/service_worker/service_worker_dispatcher.h" 5 #include "content/child/service_worker/service_worker_dispatcher.h"
6 6
7 #include "base/lazy_instance.h" 7 #include "base/lazy_instance.h"
8 #include "base/single_thread_task_runner.h" 8 #include "base/single_thread_task_runner.h"
9 #include "base/stl_util.h" 9 #include "base/stl_util.h"
10 #include "base/thread_task_runner_handle.h" 10 #include "base/thread_task_runner_handle.h"
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after
290 290
291 scoped_ptr<ServiceWorkerHandleReference> handle_ref = 291 scoped_ptr<ServiceWorkerHandleReference> handle_ref =
292 adopt_handle 292 adopt_handle
293 ? ServiceWorkerHandleReference::Adopt(info, thread_safe_sender_.get()) 293 ? ServiceWorkerHandleReference::Adopt(info, thread_safe_sender_.get())
294 : ServiceWorkerHandleReference::Create(info, 294 : ServiceWorkerHandleReference::Create(info,
295 thread_safe_sender_.get()); 295 thread_safe_sender_.get());
296 // WebServiceWorkerImpl constructor calls AddServiceWorker. 296 // WebServiceWorkerImpl constructor calls AddServiceWorker.
297 return new WebServiceWorkerImpl(handle_ref.Pass(), thread_safe_sender_.get()); 297 return new WebServiceWorkerImpl(handle_ref.Pass(), thread_safe_sender_.get());
298 } 298 }
299 299
300 WebServiceWorkerRegistrationImpl* 300 scoped_ptr<WebServiceWorkerRegistrationImpl>
301 ServiceWorkerDispatcher::CreateServiceWorkerRegistration( 301 ServiceWorkerDispatcher::CreateRegistration(
302 const ServiceWorkerRegistrationObjectInfo& info, 302 const ServiceWorkerRegistrationObjectInfo& info,
303 const ServiceWorkerVersionAttributes& attrs,
303 bool adopt_handle) { 304 bool adopt_handle) {
304 DCHECK(!ContainsKey(registrations_, info.handle_id)); 305 DCHECK(!ContainsKey(registrations_, info.handle_id));
305 if (info.handle_id == kInvalidServiceWorkerRegistrationHandleId) 306 DCHECK_NE(kInvalidServiceWorkerRegistrationHandleId, info.handle_id);
306 return NULL;
307 307
308 scoped_ptr<ServiceWorkerRegistrationHandleReference> handle_ref = 308 scoped_ptr<ServiceWorkerRegistrationHandleReference> handle_ref =
309 adopt_handle ? ServiceWorkerRegistrationHandleReference::Adopt( 309 adopt_handle ? ServiceWorkerRegistrationHandleReference::Adopt(
310 info, thread_safe_sender_.get()) 310 info, thread_safe_sender_.get())
311 : ServiceWorkerRegistrationHandleReference::Create( 311 : ServiceWorkerRegistrationHandleReference::Create(
312 info, thread_safe_sender_.get()); 312 info, thread_safe_sender_.get());
313 313
314 // WebServiceWorkerRegistrationImpl constructor calls 314 // WebServiceWorkerRegistrationImpl constructor calls
315 // AddServiceWorkerRegistration. 315 // AddServiceWorkerRegistration.
316 return new WebServiceWorkerRegistrationImpl(handle_ref.Pass()); 316 scoped_ptr<WebServiceWorkerRegistrationImpl> registration(
317 new WebServiceWorkerRegistrationImpl(handle_ref.Pass()));
318
319 registration->SetInstalling(GetServiceWorker(attrs.installing, adopt_handle));
320 registration->SetWaiting(GetServiceWorker(attrs.waiting, adopt_handle));
321 registration->SetActive(GetServiceWorker(attrs.active, adopt_handle));
322 return registration.Pass();
317 } 323 }
318 324
319 // We can assume that this message handler is called before the worker context 325 // We can assume that this message handler is called before the worker context
320 // starts because script loading happens after this association. 326 // starts because script loading happens after this association.
321 // TODO(nhiroki): This association information could be pushed into 327 // TODO(nhiroki): This association information could be pushed into
322 // EmbeddedWorkerMsg_StartWorker message and handed over to the worker thread 328 // EmbeddedWorkerMsg_StartWorker message and handed over to the worker thread
323 // without a lock in ServiceWorkerProviderContext. 329 // without a lock in ServiceWorkerProviderContext.
324 void ServiceWorkerDispatcher::OnAssociateRegistrationWithServiceWorker( 330 void ServiceWorkerDispatcher::OnAssociateRegistrationWithServiceWorker(
325 int thread_id, 331 int thread_id,
326 int provider_id, 332 int provider_id,
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
378 "OnRegistered"); 384 "OnRegistered");
379 TRACE_EVENT_ASYNC_END0("ServiceWorker", 385 TRACE_EVENT_ASYNC_END0("ServiceWorker",
380 "ServiceWorkerDispatcher::RegisterServiceWorker", 386 "ServiceWorkerDispatcher::RegisterServiceWorker",
381 request_id); 387 request_id);
382 WebServiceWorkerRegistrationCallbacks* callbacks = 388 WebServiceWorkerRegistrationCallbacks* callbacks =
383 pending_registration_callbacks_.Lookup(request_id); 389 pending_registration_callbacks_.Lookup(request_id);
384 DCHECK(callbacks); 390 DCHECK(callbacks);
385 if (!callbacks) 391 if (!callbacks)
386 return; 392 return;
387 393
388 callbacks->onSuccess(FindOrCreateRegistration(info, attrs)); 394 callbacks->onSuccess(CreateRegistration(info, attrs, true).release());
389 pending_registration_callbacks_.Remove(request_id); 395 pending_registration_callbacks_.Remove(request_id);
390 } 396 }
391 397
392 void ServiceWorkerDispatcher::OnUpdated(int thread_id, int request_id) { 398 void ServiceWorkerDispatcher::OnUpdated(int thread_id, int request_id) {
393 TRACE_EVENT_ASYNC_STEP_INTO0("ServiceWorker", 399 TRACE_EVENT_ASYNC_STEP_INTO0("ServiceWorker",
394 "ServiceWorkerDispatcher::UpdateServiceWorker", 400 "ServiceWorkerDispatcher::UpdateServiceWorker",
395 request_id, "OnUpdated"); 401 request_id, "OnUpdated");
396 TRACE_EVENT_ASYNC_END0("ServiceWorker", 402 TRACE_EVENT_ASYNC_END0("ServiceWorker",
397 "ServiceWorkerDispatcher::UpdateServiceWorker", 403 "ServiceWorkerDispatcher::UpdateServiceWorker",
398 request_id); 404 request_id);
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
438 "OnDidGetRegistration"); 444 "OnDidGetRegistration");
439 TRACE_EVENT_ASYNC_END0("ServiceWorker", 445 TRACE_EVENT_ASYNC_END0("ServiceWorker",
440 "ServiceWorkerDispatcher::GetRegistration", 446 "ServiceWorkerDispatcher::GetRegistration",
441 request_id); 447 request_id);
442 WebServiceWorkerRegistrationCallbacks* callbacks = 448 WebServiceWorkerRegistrationCallbacks* callbacks =
443 pending_get_registration_callbacks_.Lookup(request_id); 449 pending_get_registration_callbacks_.Lookup(request_id);
444 DCHECK(callbacks); 450 DCHECK(callbacks);
445 if (!callbacks) 451 if (!callbacks)
446 return; 452 return;
447 453
448 WebServiceWorkerRegistrationImpl* registration = NULL; 454 scoped_ptr<WebServiceWorkerRegistrationImpl> registration;
449 if (info.handle_id != kInvalidServiceWorkerHandleId) 455 if (info.handle_id != kInvalidServiceWorkerHandleId)
450 registration = FindOrCreateRegistration(info, attrs); 456 registration = CreateRegistration(info, attrs, true);
451 457
452 callbacks->onSuccess(registration); 458 callbacks->onSuccess(registration.release());
453 pending_get_registration_callbacks_.Remove(request_id); 459 pending_get_registration_callbacks_.Remove(request_id);
454 } 460 }
455 461
456 void ServiceWorkerDispatcher::OnDidGetRegistrations( 462 void ServiceWorkerDispatcher::OnDidGetRegistrations(
457 int thread_id, 463 int thread_id,
458 int request_id, 464 int request_id,
459 const std::vector<ServiceWorkerRegistrationObjectInfo>& infos, 465 const std::vector<ServiceWorkerRegistrationObjectInfo>& infos,
460 const std::vector<ServiceWorkerVersionAttributes>& attrs) { 466 const std::vector<ServiceWorkerVersionAttributes>& attrs) {
461 TRACE_EVENT_ASYNC_STEP_INTO0( 467 TRACE_EVENT_ASYNC_STEP_INTO0(
462 "ServiceWorker", 468 "ServiceWorker",
(...skipping 11 matching lines...) Expand all
474 return; 480 return;
475 481
476 typedef blink::WebVector<blink::WebServiceWorkerRegistration*> 482 typedef blink::WebVector<blink::WebServiceWorkerRegistration*>
477 WebServiceWorkerRegistrationArray; 483 WebServiceWorkerRegistrationArray;
478 WebServiceWorkerRegistrationArray* registrations = 484 WebServiceWorkerRegistrationArray* registrations =
479 new WebServiceWorkerRegistrationArray(infos.size()); 485 new WebServiceWorkerRegistrationArray(infos.size());
480 for (size_t i = 0; i < infos.size(); ++i) { 486 for (size_t i = 0; i < infos.size(); ++i) {
481 if (infos[i].handle_id != kInvalidServiceWorkerHandleId) { 487 if (infos[i].handle_id != kInvalidServiceWorkerHandleId) {
482 ServiceWorkerRegistrationObjectInfo info(infos[i]); 488 ServiceWorkerRegistrationObjectInfo info(infos[i]);
483 ServiceWorkerVersionAttributes attr(attrs[i]); 489 ServiceWorkerVersionAttributes attr(attrs[i]);
484 (*registrations)[i] = FindOrCreateRegistration(info, attr); 490 (*registrations)[i] = CreateRegistration(info, attr, true).release();
485 } 491 }
486 } 492 }
487 493
488 callbacks->onSuccess(registrations); 494 callbacks->onSuccess(registrations);
489 pending_get_registrations_callbacks_.Remove(request_id); 495 pending_get_registrations_callbacks_.Remove(request_id);
490 } 496 }
491 497
492 void ServiceWorkerDispatcher::OnDidGetRegistrationForReady( 498 void ServiceWorkerDispatcher::OnDidGetRegistrationForReady(
493 int thread_id, 499 int thread_id,
494 int request_id, 500 int request_id,
495 const ServiceWorkerRegistrationObjectInfo& info, 501 const ServiceWorkerRegistrationObjectInfo& info,
496 const ServiceWorkerVersionAttributes& attrs) { 502 const ServiceWorkerVersionAttributes& attrs) {
497 TRACE_EVENT_ASYNC_STEP_INTO0( 503 TRACE_EVENT_ASYNC_STEP_INTO0(
498 "ServiceWorker", 504 "ServiceWorker",
499 "ServiceWorkerDispatcher::GetRegistrationForReady", 505 "ServiceWorkerDispatcher::GetRegistrationForReady",
500 request_id, 506 request_id,
501 "OnDidGetRegistrationForReady"); 507 "OnDidGetRegistrationForReady");
502 TRACE_EVENT_ASYNC_END0("ServiceWorker", 508 TRACE_EVENT_ASYNC_END0("ServiceWorker",
503 "ServiceWorkerDispatcher::GetRegistrationForReady", 509 "ServiceWorkerDispatcher::GetRegistrationForReady",
504 request_id); 510 request_id);
505 WebServiceWorkerGetRegistrationForReadyCallbacks* callbacks = 511 WebServiceWorkerGetRegistrationForReadyCallbacks* callbacks =
506 get_for_ready_callbacks_.Lookup(request_id); 512 get_for_ready_callbacks_.Lookup(request_id);
507 DCHECK(callbacks); 513 DCHECK(callbacks);
508 if (!callbacks) 514 if (!callbacks)
509 return; 515 return;
510 516
511 WebServiceWorkerRegistrationImpl* registration = NULL; 517 callbacks->onSuccess(CreateRegistration(info, attrs, true).release());
512 DCHECK(info.handle_id != kInvalidServiceWorkerHandleId);
513 registration = FindOrCreateRegistration(info, attrs);
514 callbacks->onSuccess(registration);
515 get_for_ready_callbacks_.Remove(request_id); 518 get_for_ready_callbacks_.Remove(request_id);
516 } 519 }
517 520
518 void ServiceWorkerDispatcher::OnRegistrationError( 521 void ServiceWorkerDispatcher::OnRegistrationError(
519 int thread_id, 522 int thread_id,
520 int request_id, 523 int request_id,
521 WebServiceWorkerError::ErrorType error_type, 524 WebServiceWorkerError::ErrorType error_type,
522 const base::string16& message) { 525 const base::string16& message) {
523 TRACE_EVENT_ASYNC_STEP_INTO0("ServiceWorker", 526 TRACE_EVENT_ASYNC_STEP_INTO0("ServiceWorker",
524 "ServiceWorkerDispatcher::RegisterServiceWorker", 527 "ServiceWorkerDispatcher::RegisterServiceWorker",
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after
769 DCHECK(!ContainsKey(registrations_, registration_handle_id)); 772 DCHECK(!ContainsKey(registrations_, registration_handle_id));
770 registrations_[registration_handle_id] = registration; 773 registrations_[registration_handle_id] = registration;
771 } 774 }
772 775
773 void ServiceWorkerDispatcher::RemoveServiceWorkerRegistration( 776 void ServiceWorkerDispatcher::RemoveServiceWorkerRegistration(
774 int registration_handle_id) { 777 int registration_handle_id) {
775 DCHECK(ContainsKey(registrations_, registration_handle_id)); 778 DCHECK(ContainsKey(registrations_, registration_handle_id));
776 registrations_.erase(registration_handle_id); 779 registrations_.erase(registration_handle_id);
777 } 780 }
778 781
779 WebServiceWorkerRegistrationImpl*
780 ServiceWorkerDispatcher::FindOrCreateRegistration(
781 const ServiceWorkerRegistrationObjectInfo& info,
782 const ServiceWorkerVersionAttributes& attrs) {
783 RegistrationObjectMap::iterator found = registrations_.find(info.handle_id);
784 if (found != registrations_.end()) {
785 ServiceWorkerRegistrationHandleReference::Adopt(info,
786 thread_safe_sender_.get());
787 ServiceWorkerHandleReference::Adopt(attrs.installing,
788 thread_safe_sender_.get());
789 ServiceWorkerHandleReference::Adopt(attrs.waiting,
790 thread_safe_sender_.get());
791 ServiceWorkerHandleReference::Adopt(attrs.active,
792 thread_safe_sender_.get());
793 return found->second;
794 }
795
796 bool adopt_handle = true;
797 WebServiceWorkerRegistrationImpl* registration =
798 CreateServiceWorkerRegistration(info, adopt_handle);
799 registration->SetInstalling(GetServiceWorker(attrs.installing, adopt_handle));
800 registration->SetWaiting(GetServiceWorker(attrs.waiting, adopt_handle));
801 registration->SetActive(GetServiceWorker(attrs.active, adopt_handle));
802 return registration;
803 }
804
805 } // namespace content 782 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698