| 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/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/stl_util.h" | 8 #include "base/stl_util.h" |
| 9 #include "base/threading/thread_local.h" | 9 #include "base/threading/thread_local.h" |
| 10 #include "content/child/child_thread.h" | 10 #include "content/child/child_thread.h" |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 51 } | 51 } |
| 52 | 52 |
| 53 void ServiceWorkerDispatcher::OnMessageReceived(const IPC::Message& msg) { | 53 void ServiceWorkerDispatcher::OnMessageReceived(const IPC::Message& msg) { |
| 54 bool handled = true; | 54 bool handled = true; |
| 55 IPC_BEGIN_MESSAGE_MAP(ServiceWorkerDispatcher, msg) | 55 IPC_BEGIN_MESSAGE_MAP(ServiceWorkerDispatcher, msg) |
| 56 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_ServiceWorkerRegistered, OnRegistered) | 56 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_ServiceWorkerRegistered, OnRegistered) |
| 57 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_ServiceWorkerUnregistered, | 57 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_ServiceWorkerUnregistered, |
| 58 OnUnregistered) | 58 OnUnregistered) |
| 59 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_ServiceWorkerRegistrationError, | 59 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_ServiceWorkerRegistrationError, |
| 60 OnRegistrationError) | 60 OnRegistrationError) |
| 61 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_ServiceWorkerUnregistrationError, |
| 62 OnUnregistrationError) |
| 61 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_ServiceWorkerStateChanged, | 63 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_ServiceWorkerStateChanged, |
| 62 OnServiceWorkerStateChanged) | 64 OnServiceWorkerStateChanged) |
| 63 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_SetVersionAttributes, | 65 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_SetVersionAttributes, |
| 64 OnSetVersionAttributes) | 66 OnSetVersionAttributes) |
| 65 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_UpdateFound, | 67 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_UpdateFound, |
| 66 OnUpdateFound) | 68 OnUpdateFound) |
| 67 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_SetControllerServiceWorker, | 69 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_SetControllerServiceWorker, |
| 68 OnSetControllerServiceWorker) | 70 OnSetControllerServiceWorker) |
| 69 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_MessageToDocument, | 71 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_MessageToDocument, |
| 70 OnPostMessage) | 72 OnPostMessage) |
| (...skipping 16 matching lines...) Expand all Loading... |
| 87 if (pattern.possibly_invalid_spec().size() > GetMaxURLChars() || | 89 if (pattern.possibly_invalid_spec().size() > GetMaxURLChars() || |
| 88 script_url.possibly_invalid_spec().size() > GetMaxURLChars()) { | 90 script_url.possibly_invalid_spec().size() > GetMaxURLChars()) { |
| 89 scoped_ptr<WebServiceWorkerRegistrationCallbacks> | 91 scoped_ptr<WebServiceWorkerRegistrationCallbacks> |
| 90 owned_callbacks(callbacks); | 92 owned_callbacks(callbacks); |
| 91 scoped_ptr<WebServiceWorkerError> error(new WebServiceWorkerError( | 93 scoped_ptr<WebServiceWorkerError> error(new WebServiceWorkerError( |
| 92 WebServiceWorkerError::ErrorTypeSecurity, "URL too long")); | 94 WebServiceWorkerError::ErrorTypeSecurity, "URL too long")); |
| 93 callbacks->onError(error.release()); | 95 callbacks->onError(error.release()); |
| 94 return; | 96 return; |
| 95 } | 97 } |
| 96 | 98 |
| 97 int request_id = pending_callbacks_.Add(callbacks); | 99 int request_id = pending_registration_callbacks_.Add(callbacks); |
| 98 thread_safe_sender_->Send(new ServiceWorkerHostMsg_RegisterServiceWorker( | 100 thread_safe_sender_->Send(new ServiceWorkerHostMsg_RegisterServiceWorker( |
| 99 CurrentWorkerId(), request_id, provider_id, pattern, script_url)); | 101 CurrentWorkerId(), request_id, provider_id, pattern, script_url)); |
| 100 } | 102 } |
| 101 | 103 |
| 102 void ServiceWorkerDispatcher::UnregisterServiceWorker( | 104 void ServiceWorkerDispatcher::UnregisterServiceWorker( |
| 103 int provider_id, | 105 int provider_id, |
| 104 const GURL& pattern, | 106 const GURL& pattern, |
| 105 WebServiceWorkerRegistrationCallbacks* callbacks) { | 107 WebServiceWorkerUnregistrationCallbacks* callbacks) { |
| 106 DCHECK(callbacks); | 108 DCHECK(callbacks); |
| 107 | 109 |
| 108 if (pattern.possibly_invalid_spec().size() > GetMaxURLChars()) { | 110 if (pattern.possibly_invalid_spec().size() > GetMaxURLChars()) { |
| 109 scoped_ptr<WebServiceWorkerRegistrationCallbacks> | 111 scoped_ptr<WebServiceWorkerUnregistrationCallbacks> |
| 110 owned_callbacks(callbacks); | 112 owned_callbacks(callbacks); |
| 111 scoped_ptr<WebServiceWorkerError> error(new WebServiceWorkerError( | 113 scoped_ptr<WebServiceWorkerError> error(new WebServiceWorkerError( |
| 112 WebServiceWorkerError::ErrorTypeSecurity, "URL too long")); | 114 WebServiceWorkerError::ErrorTypeSecurity, "URL too long")); |
| 113 callbacks->onError(error.release()); | 115 callbacks->onError(error.release()); |
| 114 return; | 116 return; |
| 115 } | 117 } |
| 116 | 118 |
| 117 int request_id = pending_callbacks_.Add(callbacks); | 119 int request_id = pending_unregistration_callbacks_.Add(callbacks); |
| 118 thread_safe_sender_->Send(new ServiceWorkerHostMsg_UnregisterServiceWorker( | 120 thread_safe_sender_->Send(new ServiceWorkerHostMsg_UnregisterServiceWorker( |
| 119 CurrentWorkerId(), request_id, provider_id, pattern)); | 121 CurrentWorkerId(), request_id, provider_id, pattern)); |
| 120 } | 122 } |
| 121 | 123 |
| 122 void ServiceWorkerDispatcher::AddProviderContext( | 124 void ServiceWorkerDispatcher::AddProviderContext( |
| 123 ServiceWorkerProviderContext* provider_context) { | 125 ServiceWorkerProviderContext* provider_context) { |
| 124 DCHECK(provider_context); | 126 DCHECK(provider_context); |
| 125 int provider_id = provider_context->provider_id(); | 127 int provider_id = provider_context->provider_id(); |
| 126 DCHECK(!ContainsKey(provider_contexts_, provider_id)); | 128 DCHECK(!ContainsKey(provider_contexts_, provider_id)); |
| 127 provider_contexts_[provider_id] = provider_context; | 129 provider_contexts_[provider_id] = provider_context; |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 236 // AddServiceWorkerRegistration. | 238 // AddServiceWorkerRegistration. |
| 237 return new WebServiceWorkerRegistrationImpl(handle_ref.Pass()); | 239 return new WebServiceWorkerRegistrationImpl(handle_ref.Pass()); |
| 238 } | 240 } |
| 239 | 241 |
| 240 void ServiceWorkerDispatcher::OnRegistered( | 242 void ServiceWorkerDispatcher::OnRegistered( |
| 241 int thread_id, | 243 int thread_id, |
| 242 int request_id, | 244 int request_id, |
| 243 const ServiceWorkerRegistrationObjectInfo& info, | 245 const ServiceWorkerRegistrationObjectInfo& info, |
| 244 const ServiceWorkerVersionAttributes& attrs) { | 246 const ServiceWorkerVersionAttributes& attrs) { |
| 245 WebServiceWorkerRegistrationCallbacks* callbacks = | 247 WebServiceWorkerRegistrationCallbacks* callbacks = |
| 246 pending_callbacks_.Lookup(request_id); | 248 pending_registration_callbacks_.Lookup(request_id); |
| 247 DCHECK(callbacks); | 249 DCHECK(callbacks); |
| 248 if (!callbacks) | 250 if (!callbacks) |
| 249 return; | 251 return; |
| 250 | 252 |
| 251 WebServiceWorkerRegistrationImpl* registration = | 253 WebServiceWorkerRegistrationImpl* registration = |
| 252 GetServiceWorkerRegistration(info, true); | 254 GetServiceWorkerRegistration(info, true); |
| 253 registration->SetInstalling(GetServiceWorker(attrs.installing, true)); | 255 registration->SetInstalling(GetServiceWorker(attrs.installing, true)); |
| 254 registration->SetWaiting(GetServiceWorker(attrs.waiting, true)); | 256 registration->SetWaiting(GetServiceWorker(attrs.waiting, true)); |
| 255 registration->SetActive(GetServiceWorker(attrs.active, true)); | 257 registration->SetActive(GetServiceWorker(attrs.active, true)); |
| 256 | 258 |
| 257 callbacks->onSuccess(registration); | 259 callbacks->onSuccess(registration); |
| 258 pending_callbacks_.Remove(request_id); | 260 pending_registration_callbacks_.Remove(request_id); |
| 259 } | 261 } |
| 260 | 262 |
| 261 void ServiceWorkerDispatcher::OnUnregistered( | 263 void ServiceWorkerDispatcher::OnUnregistered( |
| 262 int thread_id, | 264 int thread_id, |
| 263 int request_id) { | 265 int request_id) { |
| 264 WebServiceWorkerRegistrationCallbacks* callbacks = | 266 WebServiceWorkerUnregistrationCallbacks* callbacks = |
| 265 pending_callbacks_.Lookup(request_id); | 267 pending_unregistration_callbacks_.Lookup(request_id); |
| 266 DCHECK(callbacks); | 268 DCHECK(callbacks); |
| 267 if (!callbacks) | 269 if (!callbacks) |
| 268 return; | 270 return; |
| 269 | 271 #ifdef DISABLE_SERVICEWORKER_UNREGISTER_RESOLVE_TO_BOOLEAN |
| 270 callbacks->onSuccess(NULL); | 272 callbacks->onSuccess(NULL); |
| 271 pending_callbacks_.Remove(request_id); | 273 #else |
| 274 bool is_success = true; |
| 275 callbacks->onSuccess(&is_success); |
| 276 #endif |
| 277 pending_unregistration_callbacks_.Remove(request_id); |
| 272 } | 278 } |
| 273 | 279 |
| 274 void ServiceWorkerDispatcher::OnRegistrationError( | 280 void ServiceWorkerDispatcher::OnRegistrationError( |
| 275 int thread_id, | 281 int thread_id, |
| 276 int request_id, | 282 int request_id, |
| 277 WebServiceWorkerError::ErrorType error_type, | 283 WebServiceWorkerError::ErrorType error_type, |
| 278 const base::string16& message) { | 284 const base::string16& message) { |
| 279 WebServiceWorkerRegistrationCallbacks* callbacks = | 285 WebServiceWorkerRegistrationCallbacks* callbacks = |
| 280 pending_callbacks_.Lookup(request_id); | 286 pending_registration_callbacks_.Lookup(request_id); |
| 281 DCHECK(callbacks); | 287 DCHECK(callbacks); |
| 282 if (!callbacks) | 288 if (!callbacks) |
| 283 return; | 289 return; |
| 290 |
| 291 scoped_ptr<WebServiceWorkerError> error( |
| 292 new WebServiceWorkerError(error_type, message)); |
| 293 callbacks->onError(error.release()); |
| 294 pending_registration_callbacks_.Remove(request_id); |
| 295 } |
| 296 |
| 297 void ServiceWorkerDispatcher::OnUnregistrationError( |
| 298 int thread_id, |
| 299 int request_id, |
| 300 WebServiceWorkerError::ErrorType error_type, |
| 301 const base::string16& message) { |
| 302 WebServiceWorkerUnregistrationCallbacks* callbacks = |
| 303 pending_unregistration_callbacks_.Lookup(request_id); |
| 304 DCHECK(callbacks); |
| 305 if (!callbacks) |
| 306 return; |
| 284 | 307 |
| 285 scoped_ptr<WebServiceWorkerError> error( | 308 scoped_ptr<WebServiceWorkerError> error( |
| 286 new WebServiceWorkerError(error_type, message)); | 309 new WebServiceWorkerError(error_type, message)); |
| 287 callbacks->onError(error.release()); | 310 callbacks->onError(error.release()); |
| 288 pending_callbacks_.Remove(request_id); | 311 pending_unregistration_callbacks_.Remove(request_id); |
| 289 } | 312 } |
| 290 | 313 |
| 291 void ServiceWorkerDispatcher::OnServiceWorkerStateChanged( | 314 void ServiceWorkerDispatcher::OnServiceWorkerStateChanged( |
| 292 int thread_id, | 315 int thread_id, |
| 293 int handle_id, | 316 int handle_id, |
| 294 blink::WebServiceWorkerState state) { | 317 blink::WebServiceWorkerState state) { |
| 295 WorkerObjectMap::iterator worker = service_workers_.find(handle_id); | 318 WorkerObjectMap::iterator worker = service_workers_.find(handle_id); |
| 296 if (worker != service_workers_.end()) | 319 if (worker != service_workers_.end()) |
| 297 worker->second->OnStateChanged(state); | 320 worker->second->OnStateChanged(state); |
| 298 | 321 |
| (...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 482 registrations_[registration_handle_id] = registration; | 505 registrations_[registration_handle_id] = registration; |
| 483 } | 506 } |
| 484 | 507 |
| 485 void ServiceWorkerDispatcher::RemoveServiceWorkerRegistration( | 508 void ServiceWorkerDispatcher::RemoveServiceWorkerRegistration( |
| 486 int registration_handle_id) { | 509 int registration_handle_id) { |
| 487 DCHECK(ContainsKey(registrations_, registration_handle_id)); | 510 DCHECK(ContainsKey(registrations_, registration_handle_id)); |
| 488 registrations_.erase(registration_handle_id); | 511 registrations_.erase(registration_handle_id); |
| 489 } | 512 } |
| 490 | 513 |
| 491 } // namespace content | 514 } // namespace content |
| OLD | NEW |