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

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

Issue 535753002: ServiceWorker: Implement navigator.serviceWorker.getRegistration [2/3] (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 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/debug/trace_event.h" 7 #include "base/debug/trace_event.h"
8 #include "base/lazy_instance.h" 8 #include "base/lazy_instance.h"
9 #include "base/stl_util.h" 9 #include "base/stl_util.h"
10 #include "base/threading/thread_local.h" 10 #include "base/threading/thread_local.h"
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
54 void ServiceWorkerDispatcher::OnMessageReceived(const IPC::Message& msg) { 54 void ServiceWorkerDispatcher::OnMessageReceived(const IPC::Message& msg) {
55 bool handled = true; 55 bool handled = true;
56 IPC_BEGIN_MESSAGE_MAP(ServiceWorkerDispatcher, msg) 56 IPC_BEGIN_MESSAGE_MAP(ServiceWorkerDispatcher, msg)
57 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_AssociateRegistration, 57 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_AssociateRegistration,
58 OnAssociateRegistration) 58 OnAssociateRegistration)
59 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_DisassociateRegistration, 59 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_DisassociateRegistration,
60 OnDisassociateRegistration) 60 OnDisassociateRegistration)
61 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_ServiceWorkerRegistered, OnRegistered) 61 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_ServiceWorkerRegistered, OnRegistered)
62 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_ServiceWorkerUnregistered, 62 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_ServiceWorkerUnregistered,
63 OnUnregistered) 63 OnUnregistered)
64 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_DidGetRegistration,
65 OnDidGetRegistration)
64 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_ServiceWorkerRegistrationError, 66 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_ServiceWorkerRegistrationError,
65 OnRegistrationError) 67 OnRegistrationError)
66 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_ServiceWorkerUnregistrationError, 68 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_ServiceWorkerUnregistrationError,
67 OnUnregistrationError) 69 OnUnregistrationError)
70 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_ServiceWorkerGetRegistrationError,
71 OnGetRegistrationError)
68 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_ServiceWorkerStateChanged, 72 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_ServiceWorkerStateChanged,
69 OnServiceWorkerStateChanged) 73 OnServiceWorkerStateChanged)
70 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_SetVersionAttributes, 74 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_SetVersionAttributes,
71 OnSetVersionAttributes) 75 OnSetVersionAttributes)
72 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_UpdateFound, 76 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_UpdateFound,
73 OnUpdateFound) 77 OnUpdateFound)
74 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_SetControllerServiceWorker, 78 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_SetControllerServiceWorker,
75 OnSetControllerServiceWorker) 79 OnSetControllerServiceWorker)
76 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_MessageToDocument, 80 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_MessageToDocument,
77 OnPostMessage) 81 OnPostMessage)
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
128 132
129 int request_id = pending_unregistration_callbacks_.Add(callbacks); 133 int request_id = pending_unregistration_callbacks_.Add(callbacks);
130 TRACE_EVENT_ASYNC_BEGIN1("ServiceWorker", 134 TRACE_EVENT_ASYNC_BEGIN1("ServiceWorker",
131 "ServiceWorkerDispatcher::UnregisterServiceWorker", 135 "ServiceWorkerDispatcher::UnregisterServiceWorker",
132 request_id, 136 request_id,
133 "Pettern", pattern.spec()); 137 "Pettern", pattern.spec());
134 thread_safe_sender_->Send(new ServiceWorkerHostMsg_UnregisterServiceWorker( 138 thread_safe_sender_->Send(new ServiceWorkerHostMsg_UnregisterServiceWorker(
135 CurrentWorkerId(), request_id, provider_id, pattern)); 139 CurrentWorkerId(), request_id, provider_id, pattern));
136 } 140 }
137 141
142 void ServiceWorkerDispatcher::GetRegistration(
143 int provider_id,
144 const GURL& document_url,
145 WebServiceWorkerRegistrationCallbacks* callbacks) {
146 DCHECK(callbacks);
147
148 if (document_url.possibly_invalid_spec().size() > GetMaxURLChars()) {
149 scoped_ptr<WebServiceWorkerRegistrationCallbacks>
150 owned_callbacks(callbacks);
151 scoped_ptr<WebServiceWorkerError> error(new WebServiceWorkerError(
152 WebServiceWorkerError::ErrorTypeSecurity, "URL too long"));
153 callbacks->onError(error.release());
154 return;
155 }
156
157 int request_id = pending_get_registration_callbacks_.Add(callbacks);
158 TRACE_EVENT_ASYNC_BEGIN1("ServiceWorker",
159 "ServiceWorkerDispatcher::GetRegistration",
160 request_id,
161 "Document URL", document_url.spec());
162 thread_safe_sender_->Send(new ServiceWorkerHostMsg_GetRegistration(
163 CurrentWorkerId(), request_id, provider_id, document_url));
164 }
165
138 void ServiceWorkerDispatcher::AddProviderContext( 166 void ServiceWorkerDispatcher::AddProviderContext(
139 ServiceWorkerProviderContext* provider_context) { 167 ServiceWorkerProviderContext* provider_context) {
140 DCHECK(provider_context); 168 DCHECK(provider_context);
141 int provider_id = provider_context->provider_id(); 169 int provider_id = provider_context->provider_id();
142 DCHECK(!ContainsKey(provider_contexts_, provider_id)); 170 DCHECK(!ContainsKey(provider_contexts_, provider_id));
143 provider_contexts_[provider_id] = provider_context; 171 provider_contexts_[provider_id] = provider_context;
144 } 172 }
145 173
146 void ServiceWorkerDispatcher::RemoveProviderContext( 174 void ServiceWorkerDispatcher::RemoveProviderContext(
147 ServiceWorkerProviderContext* provider_context) { 175 ServiceWorkerProviderContext* provider_context) {
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
296 TRACE_EVENT_ASYNC_STEP_INTO0("ServiceWorker", 324 TRACE_EVENT_ASYNC_STEP_INTO0("ServiceWorker",
297 "ServiceWorkerDispatcher::RegisterServiceWorker", 325 "ServiceWorkerDispatcher::RegisterServiceWorker",
298 request_id, 326 request_id,
299 "OnRegistered"); 327 "OnRegistered");
300 WebServiceWorkerRegistrationCallbacks* callbacks = 328 WebServiceWorkerRegistrationCallbacks* callbacks =
301 pending_registration_callbacks_.Lookup(request_id); 329 pending_registration_callbacks_.Lookup(request_id);
302 DCHECK(callbacks); 330 DCHECK(callbacks);
303 if (!callbacks) 331 if (!callbacks)
304 return; 332 return;
305 333
306 WebServiceWorkerRegistrationImpl* registration = 334 callbacks->onSuccess(FindOrCreateRegistration(info, attrs));
307 FindServiceWorkerRegistration(info, true);
308 if (!registration) {
309 registration = CreateServiceWorkerRegistration(info, true);
310 registration->SetInstalling(GetServiceWorker(attrs.installing, true));
311 registration->SetWaiting(GetServiceWorker(attrs.waiting, true));
312 registration->SetActive(GetServiceWorker(attrs.active, true));
313 } else {
314 // |registration| must already have version attributes, so adopt and destroy
315 // handle refs for them.
316 ServiceWorkerHandleReference::Adopt(
317 attrs.installing, thread_safe_sender_.get());
318 ServiceWorkerHandleReference::Adopt(
319 attrs.waiting, thread_safe_sender_.get());
320 ServiceWorkerHandleReference::Adopt(
321 attrs.active, thread_safe_sender_.get());
322 }
323
324 callbacks->onSuccess(registration);
325 pending_registration_callbacks_.Remove(request_id); 335 pending_registration_callbacks_.Remove(request_id);
326 TRACE_EVENT_ASYNC_END0("ServiceWorker", 336 TRACE_EVENT_ASYNC_END0("ServiceWorker",
327 "ServiceWorkerDispatcher::RegisterServiceWorker", 337 "ServiceWorkerDispatcher::RegisterServiceWorker",
328 request_id); 338 request_id);
329 } 339 }
330 340
331 void ServiceWorkerDispatcher::OnUnregistered(int thread_id, 341 void ServiceWorkerDispatcher::OnUnregistered(int thread_id,
332 int request_id, 342 int request_id,
333 bool is_success) { 343 bool is_success) {
334 WebServiceWorkerUnregistrationCallbacks* callbacks = 344 WebServiceWorkerUnregistrationCallbacks* callbacks =
335 pending_unregistration_callbacks_.Lookup(request_id); 345 pending_unregistration_callbacks_.Lookup(request_id);
336 TRACE_EVENT_ASYNC_STEP_INTO0( 346 TRACE_EVENT_ASYNC_STEP_INTO0(
337 "ServiceWorker", 347 "ServiceWorker",
338 "ServiceWorkerDispatcher::UnregisterServiceWorker", 348 "ServiceWorkerDispatcher::UnregisterServiceWorker",
339 request_id, 349 request_id,
340 "OnUnregistered"); 350 "OnUnregistered");
341 DCHECK(callbacks); 351 DCHECK(callbacks);
342 if (!callbacks) 352 if (!callbacks)
343 return; 353 return;
344 callbacks->onSuccess(&is_success); 354 callbacks->onSuccess(&is_success);
345 pending_unregistration_callbacks_.Remove(request_id); 355 pending_unregistration_callbacks_.Remove(request_id);
346 TRACE_EVENT_ASYNC_END0("ServiceWorker", 356 TRACE_EVENT_ASYNC_END0("ServiceWorker",
347 "ServiceWorkerDispatcher::UnregisterServiceWorker", 357 "ServiceWorkerDispatcher::UnregisterServiceWorker",
348 request_id); 358 request_id);
349 } 359 }
350 360
361 void ServiceWorkerDispatcher::OnDidGetRegistration(
362 int thread_id,
363 int request_id,
364 const ServiceWorkerRegistrationObjectInfo& info,
365 const ServiceWorkerVersionAttributes& attrs) {
366 WebServiceWorkerRegistrationCallbacks* callbacks =
367 pending_get_registration_callbacks_.Lookup(request_id);
368 TRACE_EVENT_ASYNC_STEP_INTO0(
369 "ServiceWorker",
370 "ServiceWorkerDispatcher::GetRegistration",
371 request_id,
372 "OnDidGetRegistration");
373 DCHECK(callbacks);
374 if (!callbacks)
375 return;
376
377 WebServiceWorkerRegistrationImpl* registration = NULL;
378 if (info.handle_id != kInvalidServiceWorkerHandleId)
379 registration = FindOrCreateRegistration(info, attrs);
380
381 callbacks->onSuccess(registration);
382 pending_get_registration_callbacks_.Remove(request_id);
383 TRACE_EVENT_ASYNC_END0("ServiceWorker",
384 "ServiceWorkerDispatcher::GetRegistration",
385 request_id);
386 }
387
351 void ServiceWorkerDispatcher::OnRegistrationError( 388 void ServiceWorkerDispatcher::OnRegistrationError(
352 int thread_id, 389 int thread_id,
353 int request_id, 390 int request_id,
354 WebServiceWorkerError::ErrorType error_type, 391 WebServiceWorkerError::ErrorType error_type,
355 const base::string16& message) { 392 const base::string16& message) {
356 TRACE_EVENT_ASYNC_STEP_INTO0("ServiceWorker", 393 TRACE_EVENT_ASYNC_STEP_INTO0("ServiceWorker",
357 "ServiceWorkerDispatcher::RegisterServiceWorker", 394 "ServiceWorkerDispatcher::RegisterServiceWorker",
358 request_id, 395 request_id,
359 "OnRegistrationError"); 396 "OnRegistrationError");
360 WebServiceWorkerRegistrationCallbacks* callbacks = 397 WebServiceWorkerRegistrationCallbacks* callbacks =
(...skipping 29 matching lines...) Expand all
390 427
391 scoped_ptr<WebServiceWorkerError> error( 428 scoped_ptr<WebServiceWorkerError> error(
392 new WebServiceWorkerError(error_type, message)); 429 new WebServiceWorkerError(error_type, message));
393 callbacks->onError(error.release()); 430 callbacks->onError(error.release());
394 pending_unregistration_callbacks_.Remove(request_id); 431 pending_unregistration_callbacks_.Remove(request_id);
395 TRACE_EVENT_ASYNC_END0("ServiceWorker", 432 TRACE_EVENT_ASYNC_END0("ServiceWorker",
396 "ServiceWorkerDispatcher::UnregisterServiceWorker", 433 "ServiceWorkerDispatcher::UnregisterServiceWorker",
397 request_id); 434 request_id);
398 } 435 }
399 436
437 void ServiceWorkerDispatcher::OnGetRegistrationError(
438 int thread_id,
439 int request_id,
440 WebServiceWorkerError::ErrorType error_type,
441 const base::string16& message) {
442 TRACE_EVENT_ASYNC_STEP_INTO0(
443 "ServiceWorker",
444 "ServiceWorkerDispatcher::GetRegistration",
445 request_id,
446 "OnGetRegistrationError");
447 WebServiceWorkerGetRegistrationCallbacks* callbacks =
448 pending_get_registration_callbacks_.Lookup(request_id);
449 DCHECK(callbacks);
450 if (!callbacks)
451 return;
452
453 scoped_ptr<WebServiceWorkerError> error(
454 new WebServiceWorkerError(error_type, message));
455 callbacks->onError(error.release());
456 pending_get_registration_callbacks_.Remove(request_id);
457 TRACE_EVENT_ASYNC_END0("ServiceWorker",
458 "ServiceWorkerDispatcher::GetRegistration",
459 request_id);
460 }
461
400 void ServiceWorkerDispatcher::OnServiceWorkerStateChanged( 462 void ServiceWorkerDispatcher::OnServiceWorkerStateChanged(
401 int thread_id, 463 int thread_id,
402 int handle_id, 464 int handle_id,
403 blink::WebServiceWorkerState state) { 465 blink::WebServiceWorkerState state) {
404 TRACE_EVENT2("ServiceWorker", 466 TRACE_EVENT2("ServiceWorker",
405 "ServiceWorkerDispatcher::OnServiceWorkerStateChanged", 467 "ServiceWorkerDispatcher::OnServiceWorkerStateChanged",
406 "Thread ID", thread_id, 468 "Thread ID", thread_id,
407 "State", state); 469 "State", state);
408 WorkerObjectMap::iterator worker = service_workers_.find(handle_id); 470 WorkerObjectMap::iterator worker = service_workers_.find(handle_id);
409 if (worker != service_workers_.end()) 471 if (worker != service_workers_.end())
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after
643 DCHECK(!ContainsKey(registrations_, registration_handle_id)); 705 DCHECK(!ContainsKey(registrations_, registration_handle_id));
644 registrations_[registration_handle_id] = registration; 706 registrations_[registration_handle_id] = registration;
645 } 707 }
646 708
647 void ServiceWorkerDispatcher::RemoveServiceWorkerRegistration( 709 void ServiceWorkerDispatcher::RemoveServiceWorkerRegistration(
648 int registration_handle_id) { 710 int registration_handle_id) {
649 DCHECK(ContainsKey(registrations_, registration_handle_id)); 711 DCHECK(ContainsKey(registrations_, registration_handle_id));
650 registrations_.erase(registration_handle_id); 712 registrations_.erase(registration_handle_id);
651 } 713 }
652 714
715 WebServiceWorkerRegistrationImpl*
716 ServiceWorkerDispatcher::FindOrCreateRegistration(
717 const ServiceWorkerRegistrationObjectInfo& info,
718 const ServiceWorkerVersionAttributes& attrs) {
719 WebServiceWorkerRegistrationImpl* registration =
720 FindServiceWorkerRegistration(info, true);
721 if (!registration) {
722 registration = CreateServiceWorkerRegistration(info, true);
723 registration->SetInstalling(GetServiceWorker(attrs.installing, true));
724 registration->SetWaiting(GetServiceWorker(attrs.waiting, true));
725 registration->SetActive(GetServiceWorker(attrs.active, true));
726 } else {
727 // |registration| must already have version attributes, so adopt and destroy
728 // handle refs for them.
729 ServiceWorkerHandleReference::Adopt(
730 attrs.installing, thread_safe_sender_.get());
731 ServiceWorkerHandleReference::Adopt(
732 attrs.waiting, thread_safe_sender_.get());
733 ServiceWorkerHandleReference::Adopt(
734 attrs.active, thread_safe_sender_.get());
735 }
736 return registration;
737 }
738
653 } // namespace content 739 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698