| 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 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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_ServiceWorkerStateChanged, | 61 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_ServiceWorkerStateChanged, |
| 62 OnServiceWorkerStateChanged) | 62 OnServiceWorkerStateChanged) |
| 63 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_SetVersionAttributes, | 63 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_SetVersionAttributes, |
| 64 OnSetVersionAttributes) | 64 OnSetVersionAttributes) |
| 65 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_UpdateFound, |
| 66 OnUpdateFound) |
| 65 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_SetControllerServiceWorker, | 67 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_SetControllerServiceWorker, |
| 66 OnSetControllerServiceWorker) | 68 OnSetControllerServiceWorker) |
| 67 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_MessageToDocument, | 69 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_MessageToDocument, |
| 68 OnPostMessage) | 70 OnPostMessage) |
| 69 IPC_MESSAGE_UNHANDLED(handled = false) | 71 IPC_MESSAGE_UNHANDLED(handled = false) |
| 70 IPC_END_MESSAGE_MAP() | 72 IPC_END_MESSAGE_MAP() |
| 71 DCHECK(handled) << "Unhandled message:" << msg.type(); | 73 DCHECK(handled) << "Unhandled message:" << msg.type(); |
| 72 } | 74 } |
| 73 | 75 |
| 74 bool ServiceWorkerDispatcher::Send(IPC::Message* msg) { | 76 bool ServiceWorkerDispatcher::Send(IPC::Message* msg) { |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 231 info, thread_safe_sender_.get()); | 233 info, thread_safe_sender_.get()); |
| 232 | 234 |
| 233 // WebServiceWorkerRegistrationImpl constructor calls | 235 // WebServiceWorkerRegistrationImpl constructor calls |
| 234 // AddServiceWorkerRegistration. | 236 // AddServiceWorkerRegistration. |
| 235 return new WebServiceWorkerRegistrationImpl(handle_ref.Pass()); | 237 return new WebServiceWorkerRegistrationImpl(handle_ref.Pass()); |
| 236 } | 238 } |
| 237 | 239 |
| 238 void ServiceWorkerDispatcher::OnRegistered( | 240 void ServiceWorkerDispatcher::OnRegistered( |
| 239 int thread_id, | 241 int thread_id, |
| 240 int request_id, | 242 int request_id, |
| 241 const ServiceWorkerRegistrationObjectInfo& info) { | 243 const ServiceWorkerRegistrationObjectInfo& info, |
| 244 const ServiceWorkerVersionAttributes& attrs) { |
| 242 WebServiceWorkerRegistrationCallbacks* callbacks = | 245 WebServiceWorkerRegistrationCallbacks* callbacks = |
| 243 pending_callbacks_.Lookup(request_id); | 246 pending_callbacks_.Lookup(request_id); |
| 244 DCHECK(callbacks); | 247 DCHECK(callbacks); |
| 245 if (!callbacks) | 248 if (!callbacks) |
| 246 return; | 249 return; |
| 247 | 250 |
| 248 callbacks->onSuccess(GetServiceWorkerRegistration(info, true)); | 251 WebServiceWorkerRegistrationImpl* registration = |
| 252 GetServiceWorkerRegistration(info, true); |
| 253 |
| 254 ChangedVersionAttributesMask mask(attrs.changed_mask); |
| 255 if (mask.installing_changed()) |
| 256 registration->SetInstalling(GetServiceWorker(attrs.installing, true)); |
| 257 if (mask.waiting_changed()) |
| 258 registration->SetWaiting(GetServiceWorker(attrs.waiting, true)); |
| 259 if (mask.active_changed()) |
| 260 registration->SetActive(GetServiceWorker(attrs.active, true)); |
| 261 |
| 262 callbacks->onSuccess(registration); |
| 249 pending_callbacks_.Remove(request_id); | 263 pending_callbacks_.Remove(request_id); |
| 250 } | 264 } |
| 251 | 265 |
| 252 void ServiceWorkerDispatcher::OnUnregistered( | 266 void ServiceWorkerDispatcher::OnUnregistered( |
| 253 int thread_id, | 267 int thread_id, |
| 254 int request_id) { | 268 int request_id) { |
| 255 WebServiceWorkerRegistrationCallbacks* callbacks = | 269 WebServiceWorkerRegistrationCallbacks* callbacks = |
| 256 pending_callbacks_.Lookup(request_id); | 270 pending_callbacks_.Lookup(request_id); |
| 257 DCHECK(callbacks); | 271 DCHECK(callbacks); |
| 258 if (!callbacks) | 272 if (!callbacks) |
| (...skipping 30 matching lines...) Expand all Loading... |
| 289 | 303 |
| 290 WorkerToProviderMap::iterator provider = worker_to_provider_.find(handle_id); | 304 WorkerToProviderMap::iterator provider = worker_to_provider_.find(handle_id); |
| 291 if (provider != worker_to_provider_.end()) | 305 if (provider != worker_to_provider_.end()) |
| 292 provider->second->OnServiceWorkerStateChanged(handle_id, state); | 306 provider->second->OnServiceWorkerStateChanged(handle_id, state); |
| 293 } | 307 } |
| 294 | 308 |
| 295 void ServiceWorkerDispatcher::OnSetVersionAttributes( | 309 void ServiceWorkerDispatcher::OnSetVersionAttributes( |
| 296 int thread_id, | 310 int thread_id, |
| 297 int provider_id, | 311 int provider_id, |
| 298 int registration_handle_id, | 312 int registration_handle_id, |
| 299 int changed_mask, | 313 const ServiceWorkerVersionAttributes& attrs) { |
| 300 const ServiceWorkerVersionAttributes& attributes) { | 314 ChangedVersionAttributesMask mask(attrs.changed_mask); |
| 301 ChangedVersionAttributesMask mask(changed_mask); | |
| 302 if (mask.installing_changed()) { | 315 if (mask.installing_changed()) { |
| 303 SetInstallingServiceWorker(provider_id, | 316 SetInstallingServiceWorker(provider_id, |
| 304 registration_handle_id, | 317 registration_handle_id, |
| 305 attributes.installing); | 318 attrs.installing); |
| 306 } | 319 } |
| 307 if (mask.waiting_changed()) { | 320 if (mask.waiting_changed()) { |
| 308 SetWaitingServiceWorker(provider_id, | 321 SetWaitingServiceWorker(provider_id, |
| 309 registration_handle_id, | 322 registration_handle_id, |
| 310 attributes.waiting); | 323 attrs.waiting); |
| 311 } | 324 } |
| 312 if (mask.active_changed()) { | 325 if (mask.active_changed()) { |
| 313 SetActiveServiceWorker(provider_id, | 326 SetActiveServiceWorker(provider_id, |
| 314 registration_handle_id, | 327 registration_handle_id, |
| 315 attributes.active); | 328 attrs.active); |
| 316 } | 329 } |
| 317 } | 330 } |
| 318 | 331 |
| 332 void ServiceWorkerDispatcher::OnUpdateFound( |
| 333 int thread_id, |
| 334 const ServiceWorkerRegistrationObjectInfo& info) { |
| 335 RegistrationObjectMap::iterator found = registrations_.find(info.handle_id); |
| 336 if (found != registrations_.end()) |
| 337 found->second->OnUpdateFound(); |
| 338 } |
| 339 |
| 319 void ServiceWorkerDispatcher::SetInstallingServiceWorker( | 340 void ServiceWorkerDispatcher::SetInstallingServiceWorker( |
| 320 int provider_id, | 341 int provider_id, |
| 321 int registration_handle_id, | 342 int registration_handle_id, |
| 322 const ServiceWorkerObjectInfo& info) { | 343 const ServiceWorkerObjectInfo& info) { |
| 323 ProviderContextMap::iterator provider = provider_contexts_.find(provider_id); | 344 ProviderContextMap::iterator provider = provider_contexts_.find(provider_id); |
| 324 if (provider != provider_contexts_.end()) { | 345 if (provider != provider_contexts_.end()) { |
| 325 int existing_installing_id = provider->second->installing_handle_id(); | 346 int existing_installing_id = provider->second->installing_handle_id(); |
| 326 if (existing_installing_id != info.handle_id && | 347 if (existing_installing_id != info.handle_id && |
| 327 existing_installing_id != kInvalidServiceWorkerHandleId) { | 348 existing_installing_id != kInvalidServiceWorkerHandleId) { |
| 328 WorkerToProviderMap::iterator associated_provider = | 349 WorkerToProviderMap::iterator associated_provider = |
| 329 worker_to_provider_.find(existing_installing_id); | 350 worker_to_provider_.find(existing_installing_id); |
| 330 DCHECK(associated_provider != worker_to_provider_.end()); | 351 DCHECK(associated_provider != worker_to_provider_.end()); |
| 331 DCHECK(associated_provider->second->provider_id() == provider_id); | 352 DCHECK(associated_provider->second->provider_id() == provider_id); |
| 332 worker_to_provider_.erase(associated_provider); | 353 worker_to_provider_.erase(associated_provider); |
| 333 } | 354 } |
| 334 provider->second->OnSetInstallingServiceWorker(provider_id, info); | 355 provider->second->OnSetInstallingServiceWorker(provider_id, info); |
| 335 if (info.handle_id != kInvalidServiceWorkerHandleId) | 356 if (info.handle_id != kInvalidServiceWorkerHandleId) |
| 336 worker_to_provider_[info.handle_id] = provider->second; | 357 worker_to_provider_[info.handle_id] = provider->second; |
| 337 } | 358 } |
| 338 | 359 |
| 339 RegistrationObjectMap::iterator found = | 360 RegistrationObjectMap::iterator found = |
| 340 registrations_.find(registration_handle_id); | 361 registrations_.find(registration_handle_id); |
| 341 if (found != registrations_.end()) { | 362 if (found != registrations_.end()) { |
| 342 // Populate the .installing field with the new worker object. | 363 // Populate the .installing field with the new worker object. |
| 343 found->second->SetInstalling(GetServiceWorker(info, false)); | 364 found->second->SetInstalling(GetServiceWorker(info, false)); |
| 344 if (info.handle_id != kInvalidServiceWorkerHandleId) | |
| 345 found->second->OnUpdateFound(); | |
| 346 } | 365 } |
| 347 } | 366 } |
| 348 | 367 |
| 349 void ServiceWorkerDispatcher::SetWaitingServiceWorker( | 368 void ServiceWorkerDispatcher::SetWaitingServiceWorker( |
| 350 int provider_id, | 369 int provider_id, |
| 351 int registration_handle_id, | 370 int registration_handle_id, |
| 352 const ServiceWorkerObjectInfo& info) { | 371 const ServiceWorkerObjectInfo& info) { |
| 353 ProviderContextMap::iterator provider = provider_contexts_.find(provider_id); | 372 ProviderContextMap::iterator provider = provider_contexts_.find(provider_id); |
| 354 if (provider != provider_contexts_.end()) { | 373 if (provider != provider_contexts_.end()) { |
| 355 int existing_waiting_id = provider->second->waiting_handle_id(); | 374 int existing_waiting_id = provider->second->waiting_handle_id(); |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 467 registrations_[registration_handle_id] = registration; | 486 registrations_[registration_handle_id] = registration; |
| 468 } | 487 } |
| 469 | 488 |
| 470 void ServiceWorkerDispatcher::RemoveServiceWorkerRegistration( | 489 void ServiceWorkerDispatcher::RemoveServiceWorkerRegistration( |
| 471 int registration_handle_id) { | 490 int registration_handle_id) { |
| 472 DCHECK(ContainsKey(registrations_, registration_handle_id)); | 491 DCHECK(ContainsKey(registrations_, registration_handle_id)); |
| 473 registrations_.erase(registration_handle_id); | 492 registrations_.erase(registration_handle_id); |
| 474 } | 493 } |
| 475 | 494 |
| 476 } // namespace content | 495 } // namespace content |
| OLD | NEW |