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 7c682b0d5c522b35c31694be3b13d97bd073a7c6..61933d2f2fd2260dff43bcc8c52287e4aaf2b424 100644 |
--- a/content/child/service_worker/service_worker_dispatcher.cc |
+++ b/content/child/service_worker/service_worker_dispatcher.cc |
@@ -113,6 +113,7 @@ void ServiceWorkerDispatcher::OnMessageReceived(const IPC::Message& msg) { |
OnSetControllerServiceWorker) |
IPC_MESSAGE_HANDLER(ServiceWorkerMsg_MessageToDocument, |
OnPostMessage) |
+ IPC_MESSAGE_HANDLER(ServiceWorkerMsg_CountFeature, OnCountFeature) |
IPC_MESSAGE_UNHANDLED(handled = false) |
IPC_END_MESSAGE_MAP() |
DCHECK(handled) << "Unhandled message:" << msg.type(); |
@@ -820,7 +821,8 @@ void ServiceWorkerDispatcher::OnSetControllerServiceWorker( |
int thread_id, |
int provider_id, |
const ServiceWorkerObjectInfo& info, |
- bool should_notify_controllerchange) { |
+ bool should_notify_controllerchange, |
+ const std::set<uint32_t>& used_features) { |
TRACE_EVENT2("ServiceWorker", |
"ServiceWorkerDispatcher::OnSetControllerServiceWorker", |
"Thread ID", thread_id, |
@@ -830,17 +832,26 @@ void ServiceWorkerDispatcher::OnSetControllerServiceWorker( |
// provider context if it exists. |
std::unique_ptr<ServiceWorkerHandleReference> handle_ref = Adopt(info); |
ProviderContextMap::iterator provider = provider_contexts_.find(provider_id); |
- if (provider != provider_contexts_.end()) |
- provider->second->OnSetControllerServiceWorker(std::move(handle_ref)); |
+ if (provider != provider_contexts_.end()) { |
+ provider->second->OnSetControllerServiceWorker(std::move(handle_ref), |
+ used_features); |
+ } |
ProviderClientMap::iterator found = provider_clients_.find(provider_id); |
if (found != provider_clients_.end()) { |
+ // Sync controllee's use counter with service worker's use counter. |
kinuko
2017/02/07 13:42:58
nit: controllee -> the controllee
service worker's
nhiroki
2017/02/09 05:11:32
Done.
|
+ for (uint32_t feature : used_features) |
+ found->second->countFeature(feature); |
+ |
// Get the existing worker object or create a new one with a new reference |
// to populate the .controller field. |
scoped_refptr<WebServiceWorkerImpl> worker = GetOrCreateServiceWorker( |
ServiceWorkerHandleReference::Create(info, thread_safe_sender_.get())); |
found->second->setController(WebServiceWorkerImpl::CreateHandle(worker), |
should_notify_controllerchange); |
+ // You must not access |found| after setController() because it may fire the |
+ // controllerchange event that may remove the provider client, for example, |
+ // by detaching an iframe. |
} |
} |
@@ -875,6 +886,14 @@ void ServiceWorkerDispatcher::OnPostMessage( |
blink::WebString::fromUTF16(params.message), ports); |
} |
+void ServiceWorkerDispatcher::OnCountFeature(int thread_id, |
+ int provider_id, |
+ uint32_t feature) { |
+ ProviderClientMap::iterator found = provider_clients_.find(provider_id); |
+ if (found != provider_clients_.end()) |
+ found->second->countFeature(feature); |
+} |
+ |
void ServiceWorkerDispatcher::AddServiceWorker( |
int handle_id, WebServiceWorkerImpl* worker) { |
DCHECK(!base::ContainsKey(service_workers_, handle_id)); |