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 2635365b2c8421f4c3eef89a9941d8c0fbb062a5..aed3a6b28f06eb5655fc8d9277fd799188d0355f 100644 |
| --- a/content/browser/service_worker/service_worker_version.cc |
| +++ b/content/browser/service_worker/service_worker_version.cc |
| @@ -21,6 +21,8 @@ |
| #include "base/time/time.h" |
| #include "content/browser/bad_message.h" |
| #include "content/browser/child_process_security_policy_impl.h" |
| +#include "content/browser/frame_host/frame_tree_node.h" |
| +#include "content/browser/frame_host/render_frame_host_impl.h" |
| #include "content/browser/message_port_message_filter.h" |
| #include "content/browser/message_port_service.h" |
| #include "content/browser/service_worker/embedded_worker_instance.h" |
| @@ -50,6 +52,8 @@ namespace content { |
| using StatusCallback = ServiceWorkerVersion::StatusCallback; |
| using ServiceWorkerClients = std::vector<ServiceWorkerClientInfo>; |
| +using GetClientCallback = |
|
zino
2016/01/04 09:05:27
This was already defined in provider host[1] as we
|
| + base::Callback<void(scoped_ptr<ServiceWorkerClientInfo>)>; |
| using GetClientsCallback = |
| base::Callback<void(scoped_ptr<ServiceWorkerClients>)>; |
| @@ -1101,6 +1105,7 @@ void ServiceWorkerVersion::OnReportConsoleMessage(int source_identifier, |
| bool ServiceWorkerVersion::OnMessageReceived(const IPC::Message& message) { |
| bool handled = true; |
| IPC_BEGIN_MESSAGE_MAP(ServiceWorkerVersion, message) |
| + IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_GetClient, OnGetClient) |
| IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_GetClients, |
| OnGetClients) |
| IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_ActivateEventFinished, |
| @@ -1175,6 +1180,29 @@ void ServiceWorkerVersion::DispatchActivateEventAfterStartWorker( |
| } |
| } |
| +void ServiceWorkerVersion::OnGetClient(int request_id, const std::string& id) { |
| + TRACE_EVENT_ASYNC_BEGIN1("ServiceWorker", "ServiceWorkerVersion::OnGetClient", |
| + request_id, "id", id); |
| + |
| + ServiceWorkerClientInfo client; |
| + |
| + GetClient(request_id, id, &client); |
|
zino
2016/01/04 09:05:27
IMHO, Many functions are defined duplicately.
What
|
| + OnGetClientFinished(request_id, &client); |
| +} |
| + |
| +void ServiceWorkerVersion::OnGetClientFinished( |
| + int request_id, |
| + ServiceWorkerClientInfo* client) { |
| + DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| + TRACE_EVENT_ASYNC_END1("ServiceWorker", "ServiceWorkerVersion::OnGetClients", |
| + request_id, "The retrieved client", client); |
| + |
| + if (running_status() != RUNNING) |
| + return; |
| + embedded_worker_->SendMessage( |
| + ServiceWorkerMsg_DidGetClient(request_id, *client)); |
| +} |
| + |
| void ServiceWorkerVersion::OnGetClients( |
| int request_id, |
| const ServiceWorkerClientQueryOptions& options) { |
| @@ -1766,6 +1794,44 @@ void ServiceWorkerVersion::StartWorkerInternal() { |
| } |
| } |
| +void ServiceWorkerVersion::GetClient(int request_id, |
| + std::string id, |
| + ServiceWorkerClientInfo* client_info) { |
| + ServiceWorkerProviderHost* provider_host = |
| + context_->GetProviderHostByClientID(id); |
| + if (!provider_host) { |
| + // The client may already have been closed, just ignore. |
| + return; |
| + } |
| + |
| + client_info->client_uuid = provider_host->client_uuid(); |
| + |
| + if (provider_host->client_type() == blink::WebServiceWorkerClientTypeWindow) { |
|
zino
2016/01/04 09:05:27
I think you can reuse the provider_host->GetWindow
|
| + RenderFrameHostImpl* render_frame_host = RenderFrameHostImpl::FromID( |
| + provider_host->process_id(), provider_host->frame_id()); |
| + if (!render_frame_host) |
| + return; |
| + |
| + client_info->url = render_frame_host->GetLastCommittedURL(); |
| + client_info->page_visibility_state = |
| + render_frame_host->GetVisibilityState(); |
| + client_info->is_focused = render_frame_host->IsFocused(); |
| + client_info->frame_type = render_frame_host->GetParent() |
| + ? REQUEST_CONTEXT_FRAME_TYPE_NESTED |
| + : REQUEST_CONTEXT_FRAME_TYPE_TOP_LEVEL; |
| + client_info->client_type = blink::WebServiceWorkerClientTypeWindow; |
| + client_info->last_focus_time = |
| + render_frame_host->frame_tree_node()->last_focus_time(); |
| + } else { |
| + client_info->url = provider_host->document_url(); |
| + client_info->page_visibility_state = blink::WebPageVisibilityStateHidden; |
| + client_info->is_focused = false; |
| + client_info->frame_type = REQUEST_CONTEXT_FRAME_TYPE_NONE; |
| + client_info->client_type = provider_host->client_type(); |
| + client_info->last_focus_time = base::TimeTicks(); |
| + } |
| +} |
| + |
| void ServiceWorkerVersion::GetWindowClients( |
| int request_id, |
| const ServiceWorkerClientQueryOptions& options) { |