Index: content/child/service_worker/service_worker_dispatcher.cc |
diff --git a/content/child/service_worker/service_worker_dispatcher.cc b/content/child/service_worker/service_worker_dispatcher.cc |
index 14dfde6b664263f297260fa7fa3c060c686ba783..255c4bf518e9641e4e7ca2e908aeaef8c9e6857a 100644 |
--- a/content/child/service_worker/service_worker_dispatcher.cc |
+++ b/content/child/service_worker/service_worker_dispatcher.cc |
@@ -10,6 +10,7 @@ |
#include "content/child/child_thread.h" |
#include "content/child/service_worker/service_worker_handle_reference.h" |
#include "content/child/service_worker/service_worker_provider_context.h" |
+#include "content/child/service_worker/service_worker_registration_handle_reference.h" |
#include "content/child/service_worker/web_service_worker_impl.h" |
#include "content/child/service_worker/web_service_worker_registration_impl.h" |
#include "content/child/thread_safe_sender.h" |
@@ -202,9 +203,43 @@ WebServiceWorkerImpl* ServiceWorkerDispatcher::GetServiceWorker( |
return new WebServiceWorkerImpl(handle_ref.Pass(), thread_safe_sender_); |
} |
+WebServiceWorkerRegistrationImpl* |
+ServiceWorkerDispatcher::GetServiceWorkerRegistration( |
+ int registration_handle_id, |
+ const ServiceWorkerObjectInfo& info, |
+ bool adopt_handle) { |
+ if (registration_handle_id == kInvalidServiceWorkerRegistrationHandleId) |
+ return NULL; |
+ |
+ RegistrationObjectMap::iterator existing_registration = |
+ registrations_.find(registration_handle_id); |
+ |
+ if (existing_registration != registrations_.end()) { |
+ if (adopt_handle) { |
+ // We are instructed to adopt a handle but we already have one, so |
+ // adopt and destroy a handle ref. |
+ ServiceWorkerRegistrationHandleReference::Adopt( |
+ registration_handle_id, info, thread_safe_sender_); |
+ } |
+ return existing_registration->second; |
+ } |
+ |
+ scoped_ptr<ServiceWorkerRegistrationHandleReference> handle_ref = |
+ adopt_handle |
+ ? ServiceWorkerRegistrationHandleReference::Adopt( |
+ registration_handle_id, info, thread_safe_sender_) |
+ : ServiceWorkerRegistrationHandleReference::Create( |
+ registration_handle_id, info, thread_safe_sender_); |
+ |
+ // WebServiceWorkerRegistrationImpl constructor calls |
+ // AddServiceWorkerRegistration. |
+ return new WebServiceWorkerRegistrationImpl(handle_ref.Pass()); |
+} |
+ |
void ServiceWorkerDispatcher::OnRegistered( |
int thread_id, |
int request_id, |
+ int registration_handle_id, |
const ServiceWorkerObjectInfo& info) { |
WebServiceWorkerRegistrationCallbacks* callbacks = |
pending_callbacks_.Lookup(request_id); |
@@ -214,8 +249,14 @@ void ServiceWorkerDispatcher::OnRegistered( |
#ifdef DISABLE_SERVICE_WORKER_REGISTRATION |
callbacks->onSuccess(GetServiceWorker(info, true)); |
+ // We should adopt and destroy an unused handle ref. |
+ ServiceWorkerRegistrationHandleReference::Adopt( |
+ registration_handle_id, info, thread_safe_sender_); |
#else |
- callbacks->onSuccess(new WebServiceWorkerRegistrationImpl(info)); |
+ callbacks->onSuccess(GetServiceWorkerRegistration( |
+ registration_handle_id, info, true)); |
+ // We should adopt and destroy an unused handle ref. |
+ ServiceWorkerHandleReference::Adopt(info, thread_safe_sender_); |
#endif |
pending_callbacks_.Remove(request_id); |
} |
@@ -266,19 +307,30 @@ void ServiceWorkerDispatcher::OnServiceWorkerStateChanged( |
void ServiceWorkerDispatcher::OnSetVersionAttributes( |
int thread_id, |
int provider_id, |
+ int registration_handle_id, |
int changed_mask, |
const ServiceWorkerVersionAttributes& attributes) { |
ChangedVersionAttributesMask mask(changed_mask); |
- if (mask.installing_changed()) |
- SetInstallingServiceWorker(provider_id, attributes.installing); |
- if (mask.waiting_changed()) |
- SetWaitingServiceWorker(provider_id, attributes.waiting); |
- if (mask.active_changed()) |
- SetActiveServiceWorker(provider_id, attributes.active); |
+ if (mask.installing_changed()) { |
+ SetInstallingServiceWorker(provider_id, |
+ registration_handle_id, |
+ attributes.installing); |
+ } |
+ if (mask.waiting_changed()) { |
+ SetWaitingServiceWorker(provider_id, |
+ registration_handle_id, |
+ attributes.waiting); |
+ } |
+ if (mask.active_changed()) { |
+ SetActiveServiceWorker(provider_id, |
+ registration_handle_id, |
+ attributes.active); |
+ } |
} |
void ServiceWorkerDispatcher::SetInstallingServiceWorker( |
int provider_id, |
+ int registration_handle_id, |
const ServiceWorkerObjectInfo& info) { |
ProviderContextMap::iterator provider = provider_contexts_.find(provider_id); |
if (provider != provider_contexts_.end()) { |
@@ -296,15 +348,26 @@ void ServiceWorkerDispatcher::SetInstallingServiceWorker( |
worker_to_provider_[info.handle_id] = provider->second; |
} |
+#ifdef DISABLE_SERVICE_WORKER_REGISTRATION |
ScriptClientMap::iterator found = script_clients_.find(provider_id); |
if (found != script_clients_.end()) { |
// Populate the .installing field with the new worker object. |
found->second->setInstalling(GetServiceWorker(info, false)); |
} |
+#else |
+ RegistrationObjectMap::iterator found = |
+ registrations_.find(registration_handle_id); |
+ if (found != registrations_.end()) { |
+ found->second->setInstalling(GetServiceWorker(info, false)); |
+ if (info.handle_id != kInvalidServiceWorkerHandleId) |
+ found->second->OnUpdateFound(); |
+ } |
+#endif |
} |
void ServiceWorkerDispatcher::SetWaitingServiceWorker( |
int provider_id, |
+ int registration_handle_id, |
const ServiceWorkerObjectInfo& info) { |
ProviderContextMap::iterator provider = provider_contexts_.find(provider_id); |
if (provider != provider_contexts_.end()) { |
@@ -322,15 +385,23 @@ void ServiceWorkerDispatcher::SetWaitingServiceWorker( |
worker_to_provider_[info.handle_id] = provider->second; |
} |
+#ifdef DISABLE_SERVICE_WORKER_REGISTRATION |
ScriptClientMap::iterator found = script_clients_.find(provider_id); |
if (found != script_clients_.end()) { |
// Populate the .waiting field with the new worker object. |
found->second->setWaiting(GetServiceWorker(info, false)); |
} |
+#else |
+ RegistrationObjectMap::iterator found = |
+ registrations_.find(registration_handle_id); |
+ if (found != registrations_.end()) |
+ found->second->setWaiting(GetServiceWorker(info, false)); |
+#endif |
} |
void ServiceWorkerDispatcher::SetActiveServiceWorker( |
int provider_id, |
+ int registration_handle_id, |
const ServiceWorkerObjectInfo& info) { |
ProviderContextMap::iterator provider = provider_contexts_.find(provider_id); |
if (provider != provider_contexts_.end()) { |
@@ -348,11 +419,18 @@ void ServiceWorkerDispatcher::SetActiveServiceWorker( |
worker_to_provider_[info.handle_id] = provider->second; |
} |
+#ifdef DISABLE_SERVICE_WORKER_REGISTRATION |
ScriptClientMap::iterator found = script_clients_.find(provider_id); |
if (found != script_clients_.end()) { |
// Populate the .active field with the new worker object. |
found->second->setActive(GetServiceWorker(info, false)); |
} |
+#else |
+ RegistrationObjectMap::iterator found = |
+ registrations_.find(registration_handle_id); |
+ if (found != registrations_.end()) |
+ found->second->setActive(GetServiceWorker(info, false)); |
+#endif |
} |
void ServiceWorkerDispatcher::OnSetControllerServiceWorker( |
@@ -413,4 +491,17 @@ void ServiceWorkerDispatcher::RemoveServiceWorker(int handle_id) { |
service_workers_.erase(handle_id); |
} |
+void ServiceWorkerDispatcher::AddServiceWorkerRegistration( |
+ int registration_handle_id, |
+ WebServiceWorkerRegistrationImpl* registration) { |
+ DCHECK(!ContainsKey(registrations_, registration_handle_id)); |
+ registrations_[registration_handle_id] = registration; |
+} |
+ |
+void ServiceWorkerDispatcher::RemoveServiceWorkerRegistration( |
+ int registration_handle_id) { |
+ DCHECK(ContainsKey(registrations_, registration_handle_id)); |
+ registrations_.erase(registration_handle_id); |
+} |
+ |
} // namespace content |