Index: content/browser/service_worker/service_worker_client_utils.cc |
diff --git a/content/browser/service_worker/service_worker_client_utils.cc b/content/browser/service_worker/service_worker_client_utils.cc |
index 26ef4d35f181bd9a43c4bb5922c5698da78e6aa3..a7eb04fc0290d7616f064ad27f15aedad4eaa5ee 100644 |
--- a/content/browser/service_worker/service_worker_client_utils.cc |
+++ b/content/browser/service_worker/service_worker_client_utils.cc |
@@ -176,15 +176,13 @@ void DidNavigate(const base::WeakPtr<ServiceWorkerContextCore>& context, |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
if (!context) { |
- callback.Run(SERVICE_WORKER_ERROR_ABORT, std::string(), |
- ServiceWorkerClientInfo()); |
+ callback.Run(SERVICE_WORKER_ERROR_ABORT, ServiceWorkerClientInfo()); |
return; |
} |
if (render_process_id == ChildProcessHost::kInvalidUniqueID && |
render_frame_id == MSG_ROUTING_NONE) { |
- callback.Run(SERVICE_WORKER_ERROR_FAILED, std::string(), |
- ServiceWorkerClientInfo()); |
+ callback.Run(SERVICE_WORKER_ERROR_FAILED, ServiceWorkerClientInfo()); |
return; |
} |
@@ -196,14 +194,13 @@ void DidNavigate(const base::WeakPtr<ServiceWorkerContextCore>& context, |
provider_host->frame_id() != render_frame_id) { |
continue; |
} |
- provider_host->GetWindowClientInfo( |
- base::Bind(callback, SERVICE_WORKER_OK, provider_host->client_uuid())); |
+ provider_host->GetWindowClientInfo(base::Bind(callback, SERVICE_WORKER_OK)); |
return; |
} |
// If here, it means that no provider_host was found, in which case, the |
// renderer should still be informed that the window was opened. |
- callback.Run(SERVICE_WORKER_OK, std::string(), ServiceWorkerClientInfo()); |
+ callback.Run(SERVICE_WORKER_OK, ServiceWorkerClientInfo()); |
} |
void AddWindowClient( |
@@ -225,12 +222,11 @@ void AddNonWindowClient(ServiceWorkerProviderHost* host, |
options.client_type != host_client_type) |
return; |
- ServiceWorkerClientInfo client_info(blink::WebPageVisibilityStateHidden, |
- false, // is_focused |
- host->document_url(), |
- REQUEST_CONTEXT_FRAME_TYPE_NONE, |
- base::TimeTicks(), host_client_type); |
- client_info.client_uuid = host->client_uuid(); |
+ ServiceWorkerClientInfo client_info( |
+ host->client_uuid(), blink::WebPageVisibilityStateHidden, |
+ false, // is_focused |
+ host->document_url(), REQUEST_CONTEXT_FRAME_TYPE_NONE, base::TimeTicks(), |
+ host_client_type); |
clients->push_back(client_info); |
} |
@@ -243,8 +239,8 @@ void OnGetWindowClientsOnUI( |
for (const auto& it : clients_info) { |
ServiceWorkerClientInfo info = |
- ServiceWorkerProviderHost::GetWindowClientInfoOnUI(base::get<0>(it), |
- base::get<1>(it)); |
+ ServiceWorkerProviderHost::GetWindowClientInfoOnUI( |
+ base::get<0>(it), base::get<1>(it), base::get<2>(it)); |
// If the request to the provider_host returned an empty |
// ServiceWorkerClientInfo, that means that it wasn't possible to associate |
@@ -259,7 +255,6 @@ void OnGetWindowClientsOnUI( |
if (info.url.GetOrigin() != script_url.GetOrigin()) |
continue; |
- info.client_uuid = base::get<2>(it); |
clients->push_back(info); |
} |
@@ -371,6 +366,49 @@ void NavigateClient(const GURL& url, |
base::Bind(&DidNavigate, context, script_url.GetOrigin(), callback))); |
} |
+void GetClient( |
+ const base::WeakPtr<ServiceWorkerVersion>& controller, |
+ const std::string& client_uuid, |
+ const base::WeakPtr<ServiceWorkerContextCore>& context, |
+ const ServiceWorkerProviderHost::GetClientInfoCallback& callback) { |
+ DCHECK_CURRENTLY_ON(BrowserThread::IO); |
+ |
+ ServiceWorkerProviderHost* provider_host = |
+ context->GetProviderHostByClientID(client_uuid); |
+ |
+ if (!provider_host) { |
+ // The client may already have been closed, just ignore. |
+ BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
+ base::Bind(callback, ServiceWorkerClientInfo())); |
+ return; |
+ } |
+ |
+ if (provider_host->document_url().GetOrigin() != |
+ controller->script_url().GetOrigin()) { |
+ BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
+ base::Bind(callback, ServiceWorkerClientInfo())); |
+ return; |
+ } |
+ |
+ if (provider_host->client_type() == blink::WebServiceWorkerClientTypeWindow) { |
+ provider_host->GetWindowClientInfo(callback); |
+ return; |
+ } |
+ |
+ DCHECK(provider_host->client_type() == |
+ blink::WebServiceWorkerClientTypeWorker || |
+ provider_host->client_type() == |
+ blink::WebServiceWorkerClientTypeSharedWorker); |
+ |
+ ServiceWorkerClientInfo client_info( |
+ provider_host->client_uuid(), blink::WebPageVisibilityStateHidden, |
+ false, // is_focused |
+ provider_host->document_url(), REQUEST_CONTEXT_FRAME_TYPE_NONE, |
+ base::TimeTicks(), provider_host->client_type()); |
+ BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
+ base::Bind(callback, client_info)); |
+} |
+ |
void GetClients(const base::WeakPtr<ServiceWorkerVersion>& controller, |
const ServiceWorkerClientQueryOptions& options, |
const ClientsCallback& callback) { |