Index: content/browser/service_worker/service_worker_version.cc |
diff --git a/content/browser/service_worker/service_worker_version.cc b/content/browser/service_worker/service_worker_version.cc |
index 113ed1c908112f70e2645945d9e22c821fbb226c..f2bbf0127a63b5f4a2ec669479253b2ef22023db 100644 |
--- a/content/browser/service_worker/service_worker_version.cc |
+++ b/content/browser/service_worker/service_worker_version.cc |
@@ -993,9 +993,8 @@ void ServiceWorkerVersion::DispatchActivateEventAfterStartWorker( |
void ServiceWorkerVersion::OnGetClients( |
int request_id, |
- const ServiceWorkerClientQueryOptions& /* options */) { |
- // TODO(kinuko): Handle ClientQueryOptions. (crbug.com/455241, 460415 etc) |
- if (controllee_map_.empty()) { |
+ const ServiceWorkerClientQueryOptions& options) { |
+ if (controllee_map_.empty() && options.include_uncontrolled) { |
nhiroki
2015/03/16 06:37:58
"controllee_map_.empty() && !options.include_uncon
kinuko
2015/03/20 08:19:39
Done.
This is how we need tests for every code...
|
if (running_status() == RUNNING) { |
embedded_worker_->SendMessage( |
ServiceWorkerMsg_DidGetClients(request_id, |
@@ -1007,13 +1006,23 @@ void ServiceWorkerVersion::OnGetClients( |
TRACE_EVENT0("ServiceWorker", |
"ServiceWorkerVersion::OnGetClients"); |
+ // 4.3.1 matchAll(options) |
std::vector<Tuple<int,int,std::string>> clients_info; |
- for (auto& controllee : controllee_map_) { |
- int process_id = controllee.second->process_id(); |
- int frame_id = controllee.second->frame_id(); |
- const std::string& client_uuid = controllee.first; |
- |
- clients_info.push_back(MakeTuple(process_id, frame_id, client_uuid)); |
+ if (!options.include_uncontrolled) { |
+ for (auto& controllee : controllee_map_) { |
+ int process_id = controllee.second->process_id(); |
+ int frame_id = controllee.second->frame_id(); |
+ const std::string& client_uuid = controllee.first; |
+ clients_info.push_back(MakeTuple(process_id, frame_id, client_uuid)); |
+ } |
+ } else { |
+ for (auto it = context_->GetProviderHostIteratorForOrigin( |
+ script_url_.GetOrigin()); |
+ !it->IsAtEnd(); it->Advance()) { |
+ ServiceWorkerProviderHost* host = it->GetProviderHost(); |
+ clients_info.push_back( |
+ MakeTuple(host->process_id(), host->frame_id(), host->client_uuid())); |
nhiroki
2015/03/16 06:37:58
We might need to check host->provider_type() and t
kinuko
2015/03/20 08:19:39
That's a good point, hmm yes it looks like. I chan
|
+ } |
} |
BrowserThread::PostTask( |
@@ -1233,17 +1242,17 @@ void ServiceWorkerVersion::DidOpenWindow(int request_id, |
return; |
} |
- for (const auto& it : controllee_map_) { |
- const ServiceWorkerProviderHost* provider_host = it.second; |
+ for (auto it = |
+ context_->GetProviderHostIteratorForOrigin(script_url_.GetOrigin()); |
+ !it->IsAtEnd(); it->Advance()) { |
+ ServiceWorkerProviderHost* provider_host = it->GetProviderHost(); |
if (provider_host->process_id() != render_process_id || |
provider_host->frame_id() != render_frame_id) { |
continue; |
} |
- |
- // it.second is the client_uuid associated with the provider_host. |
- provider_host->GetClientInfo( |
- base::Bind(&ServiceWorkerVersion::OnOpenWindowFinished, |
- weak_factory_.GetWeakPtr(), request_id, it.first)); |
+ provider_host->GetClientInfo(base::Bind( |
+ &ServiceWorkerVersion::OnOpenWindowFinished, weak_factory_.GetWeakPtr(), |
+ request_id, provider_host->client_uuid())); |
return; |
} |
@@ -1314,44 +1323,47 @@ void ServiceWorkerVersion::OnPostMessageToClient( |
const std::string& client_uuid, |
const base::string16& message, |
const std::vector<TransferredMessagePort>& sent_message_ports) { |
+ if (!context_) |
+ return; |
TRACE_EVENT1("ServiceWorker", |
"ServiceWorkerVersion::OnPostMessageToDocument", |
"Client id", client_uuid); |
- auto it = controllee_map_.find(client_uuid); |
- if (it == controllee_map_.end()) { |
+ ServiceWorkerProviderHost* provider_host = |
+ context_->GetProviderHostByClientID(client_uuid); |
+ if (!provider_host) { |
// The client may already have been closed, just ignore. |
return; |
} |
- if (it->second->document_url().GetOrigin() != script_url_.GetOrigin()) { |
+ if (provider_host->document_url().GetOrigin() != script_url_.GetOrigin()) { |
// The client does not belong to the same origin as this ServiceWorker, |
// possibly due to timing issue or bad message. |
return; |
} |
- it->second->PostMessage(message, sent_message_ports); |
+ provider_host->PostMessage(message, sent_message_ports); |
} |
void ServiceWorkerVersion::OnFocusClient(int request_id, |
const std::string& client_uuid) { |
+ if (!context_) |
+ return; |
TRACE_EVENT2("ServiceWorker", |
"ServiceWorkerVersion::OnFocusClient", |
"Request id", request_id, |
"Client id", client_uuid); |
- auto it = controllee_map_.find(client_uuid); |
- if (it == controllee_map_.end()) { |
+ ServiceWorkerProviderHost* provider_host = |
+ context_->GetProviderHostByClientID(client_uuid); |
+ if (!provider_host) { |
// The client may already have been closed, just ignore. |
return; |
} |
- if (it->second->document_url().GetOrigin() != script_url_.GetOrigin()) { |
+ if (provider_host->document_url().GetOrigin() != script_url_.GetOrigin()) { |
// The client does not belong to the same origin as this ServiceWorker, |
// possibly due to timing issue or bad message. |
return; |
} |
- |
- it->second->Focus( |
- base::Bind(&ServiceWorkerVersion::OnFocusClientFinished, |
- weak_factory_.GetWeakPtr(), |
- request_id, |
- client_uuid)); |
+ provider_host->Focus(base::Bind(&ServiceWorkerVersion::OnFocusClientFinished, |
+ weak_factory_.GetWeakPtr(), request_id, |
+ client_uuid)); |
} |
void ServiceWorkerVersion::OnFocusClientFinished( |