Chromium Code Reviews| 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 98590e007ff616bc609461001276996baf621f5c..79b09cf36b3def5d0113a8201ff3479616b32319 100644 |
| --- a/content/browser/service_worker/service_worker_version.cc |
| +++ b/content/browser/service_worker/service_worker_version.cc |
| @@ -39,8 +39,9 @@ |
| namespace content { |
| using StatusCallback = ServiceWorkerVersion::StatusCallback; |
| +using ServiceWorkerClients = std::vector<ServiceWorkerClientInfo>; |
| using GetClientsCallback = |
| - base::Callback<void(const std::vector<ServiceWorkerClientInfo>&)>; |
| + base::Callback<void(scoped_ptr<ServiceWorkerClients>)>; |
| namespace { |
| @@ -282,16 +283,17 @@ base::TimeDelta GetTickDuration(const base::TimeTicks& time) { |
| return base::TimeTicks().Now() - time; |
| } |
| -void OnGetClientsFromUI( |
| +void OnGetWindowClientsFromUI( |
| // The tuple contains process_id, frame_id, client_uuid. |
| - const std::vector<Tuple<int,int,std::string>>& clients_info, |
| + const std::vector<Tuple<int, int, std::string>>& clients_info, |
| const GURL& script_url, |
| const GetClientsCallback& callback) { |
| - std::vector<ServiceWorkerClientInfo> clients; |
| + scoped_ptr<ServiceWorkerClients> clients(new ServiceWorkerClients); |
| for (const auto& it : clients_info) { |
| ServiceWorkerClientInfo info = |
| - ServiceWorkerProviderHost::GetClientInfoOnUI(get<0>(it), get<1>(it)); |
| + ServiceWorkerProviderHost::GetWindowClientInfoOnUI(get<0>(it), |
| + get<1>(it)); |
| // If the request to the provider_host returned an empty |
| // ServiceWorkerClientInfo, that means that it wasn't possible to associate |
| @@ -304,14 +306,40 @@ void OnGetClientsFromUI( |
| // different URL than expected. In such case, we should make sure to not |
| // expose cross-origin WindowClient. |
| if (info.url.GetOrigin() != script_url.GetOrigin()) |
| - return; |
| + continue; |
|
nhiroki
2015/03/31 05:26:33
Oh... |callback| was gone... good catch!
|
| info.client_uuid = get<2>(it); |
| - clients.push_back(info); |
| + clients->push_back(info); |
| } |
| BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
| - base::Bind(callback, clients)); |
| + base::Bind(callback, base::Passed(&clients))); |
| +} |
| + |
| +void AddWindowClient(ServiceWorkerProviderHost* host, |
| + std::vector<Tuple<int, int, std::string>>* client_info) { |
| + if (host->client_type() != blink::WebServiceWorkerClientTypeWindow) |
| + return; |
| + client_info->push_back( |
| + MakeTuple(host->process_id(), host->frame_id(), host->client_uuid())); |
| +} |
| + |
| +void AddNonWindowClient(ServiceWorkerProviderHost* host, |
| + const ServiceWorkerClientQueryOptions& options, |
| + ServiceWorkerClients* clients) { |
| + blink::WebServiceWorkerClientType host_client_type = host->client_type(); |
| + if (host_client_type == blink::WebServiceWorkerClientTypeWindow) |
| + return; |
| + if (options.client_type != blink::WebServiceWorkerClientTypeAll && |
| + options.client_type != host_client_type) |
| + return; |
| + |
| + ServiceWorkerClientInfo client_info( |
| + blink::WebPageVisibilityStateHidden, |
| + false, // is_focused |
| + host->document_url(), REQUEST_CONTEXT_FRAME_TYPE_NONE, host_client_type); |
| + client_info.client_uuid = host->client_uuid(); |
| + clients->push_back(client_info); |
| } |
| } // namespace |
| @@ -1037,35 +1065,17 @@ void ServiceWorkerVersion::OnGetClients( |
| return; |
| } |
| - TRACE_EVENT0("ServiceWorker", |
| - "ServiceWorkerVersion::OnGetClients"); |
| - |
| - // 4.3.1 matchAll(options) |
| - std::vector<Tuple<int,int,std::string>> clients_info; |
| - 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_->GetClientProviderHostIterator(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())); |
| - } |
| + // For Window clients we want to query the info on the UI thread first. |
| + if (options.client_type == blink::WebServiceWorkerClientTypeWindow || |
| + options.client_type == blink::WebServiceWorkerClientTypeAll) { |
| + GetWindowClients(request_id, options); |
| + return; |
| } |
| - BrowserThread::PostTask( |
| - BrowserThread::UI, FROM_HERE, |
| - base::Bind(&OnGetClientsFromUI, clients_info, script_url_, |
| - base::Bind(&ServiceWorkerVersion::DidGetClients, |
| - weak_factory_.GetWeakPtr(), |
| - request_id))); |
| - |
| + ServiceWorkerClients clients; |
| + GetNonWindowClients(request_id, options, &clients); |
| + embedded_worker_->SendMessage( |
| + ServiceWorkerMsg_DidGetClients(request_id, clients)); |
| } |
| void ServiceWorkerVersion::OnActivateEventFinished( |
| @@ -1284,7 +1294,7 @@ void ServiceWorkerVersion::DidOpenWindow(int request_id, |
| provider_host->frame_id() != render_frame_id) { |
| continue; |
| } |
| - provider_host->GetClientInfo(base::Bind( |
| + provider_host->GetWindowClientInfo(base::Bind( |
| &ServiceWorkerVersion::OnOpenWindowFinished, weak_factory_.GetWeakPtr(), |
| request_id, provider_host->client_uuid())); |
| return; |
| @@ -1505,15 +1515,69 @@ void ServiceWorkerVersion::StartWorkerInternal(bool pause_after_download) { |
| } |
| } |
| -void ServiceWorkerVersion::DidGetClients( |
| +void ServiceWorkerVersion::GetWindowClients( |
| + int request_id, |
| + const ServiceWorkerClientQueryOptions& options) { |
| + DCHECK(options.client_type == blink::WebServiceWorkerClientTypeWindow || |
| + options.client_type == blink::WebServiceWorkerClientTypeAll); |
| + TRACE_EVENT0("ServiceWorker", "ServiceWorkerVersion::GetWindowClients"); |
|
falken
2015/03/31 03:39:48
Should this trace span to DidGetWindowClients?
nhiroki
2015/04/01 00:50:53
Done in https://codereview.chromium.org/1050733002
|
| + |
| + // 4.3.1 matchAll(options) |
|
falken
2015/03/31 03:39:48
FYI I've given up on putting spec section numbers
nhiroki
2015/04/01 00:50:53
Done in https://codereview.chromium.org/1050733002
|
| + std::vector<Tuple<int, int, std::string>> clients_info; |
| + if (!options.include_uncontrolled) { |
| + for (auto& controllee : controllee_map_) |
| + AddWindowClient(controllee.second, &clients_info); |
| + } else { |
| + for (auto it = |
| + context_->GetClientProviderHostIterator(script_url_.GetOrigin()); |
| + !it->IsAtEnd(); it->Advance()) { |
| + AddWindowClient(it->GetProviderHost(), &clients_info); |
| + } |
| + } |
| + |
| + if (clients_info.empty()) { |
| + DidGetWindowClients(request_id, options, |
| + make_scoped_ptr(new ServiceWorkerClients)); |
| + return; |
| + } |
| + |
| + BrowserThread::PostTask( |
| + BrowserThread::UI, FROM_HERE, |
| + base::Bind(&OnGetWindowClientsFromUI, clients_info, script_url_, |
| + base::Bind(&ServiceWorkerVersion::DidGetWindowClients, |
| + weak_factory_.GetWeakPtr(), request_id, options))); |
| +} |
| + |
| +void ServiceWorkerVersion::DidGetWindowClients( |
| int request_id, |
| - const std::vector<ServiceWorkerClientInfo>& clients) { |
| + const ServiceWorkerClientQueryOptions& options, |
| + scoped_ptr<ServiceWorkerClients> clients) { |
| DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| if (running_status() != RUNNING) |
| return; |
| + if (options.client_type == blink::WebServiceWorkerClientTypeAll) |
| + GetNonWindowClients(request_id, options, clients.get()); |
| + |
| embedded_worker_->SendMessage( |
| - ServiceWorkerMsg_DidGetClients(request_id, clients)); |
| + ServiceWorkerMsg_DidGetClients(request_id, *clients)); |
| +} |
| + |
| +void ServiceWorkerVersion::GetNonWindowClients( |
| + int request_id, |
| + const ServiceWorkerClientQueryOptions& options, |
| + ServiceWorkerClients* clients) { |
| + if (!options.include_uncontrolled) { |
| + for (auto& controllee : controllee_map_) { |
| + AddNonWindowClient(controllee.second, options, clients); |
| + } |
| + } else { |
| + for (auto it = |
| + context_->GetClientProviderHostIterator(script_url_.GetOrigin()); |
| + !it->IsAtEnd(); it->Advance()) { |
| + AddNonWindowClient(it->GetProviderHost(), options, clients); |
| + } |
| + } |
| } |
| void ServiceWorkerVersion::StartTimeoutTimer() { |