Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(57)

Unified Diff: content/browser/service_worker/service_worker_version.cc

Issue 988063004: Use UUID for ServiceWorker Client identifier (2/3, chromium) (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: addressed comments Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 4857ff945871867b0ed6c703669c1ad678b28c18..c7804bf431f16a6e1ee26fbcb4a94dd463f28b1f 100644
--- a/content/browser/service_worker/service_worker_version.cc
+++ b/content/browser/service_worker/service_worker_version.cc
@@ -263,8 +263,8 @@ base::TimeDelta GetTickDuration(const base::TimeTicks& time) {
}
void OnGetClientsFromUI(
- // The tuple contains process_id, frame_id, client_id.
- const std::vector<Tuple<int,int,int>>& clients_info,
+ // The tuple contains process_id, frame_id, client_uuid.
+ const std::vector<Tuple<int,int,std::string>>& clients_info,
const GURL& script_url,
const GetClientsCallback& callback) {
std::vector<ServiceWorkerClientInfo> clients;
@@ -286,7 +286,7 @@ void OnGetClientsFromUI(
if (info.url.GetOrigin() != script_url.GetOrigin())
return;
- info.client_id = get<2>(it);
+ info.client_uuid = get<2>(it);
clients.push_back(info);
}
@@ -731,21 +731,19 @@ void ServiceWorkerVersion::DispatchCrossOriginMessageEvent(
void ServiceWorkerVersion::AddControllee(
ServiceWorkerProviderHost* provider_host) {
- DCHECK(!ContainsKey(controllee_map_, provider_host));
- int controllee_id = controllee_by_id_.Add(provider_host);
- // IDMap<>'s last index is kInvalidServiceWorkerClientId.
- CHECK(controllee_id != kInvalidServiceWorkerClientId);
- controllee_map_[provider_host] = controllee_id;
+ const std::string& uuid = provider_host->client_uuid();
+ CHECK(!provider_host->client_uuid().empty());
+ DCHECK(!ContainsKey(controllee_map_, uuid));
+ controllee_map_[uuid] = provider_host;
// Keep the worker alive a bit longer right after a new controllee is added.
RestartTick(&idle_time_);
}
void ServiceWorkerVersion::RemoveControllee(
ServiceWorkerProviderHost* provider_host) {
- ControlleeMap::iterator found = controllee_map_.find(provider_host);
- DCHECK(found != controllee_map_.end());
- controllee_by_id_.Remove(found->second);
- controllee_map_.erase(found);
+ const std::string& uuid = provider_host->client_uuid();
+ DCHECK(ContainsKey(controllee_map_, uuid));
+ controllee_map_.erase(uuid);
if (HasControllee())
return;
FOR_EACH_OBSERVER(Listener, listeners_, OnNoControllees(this));
@@ -944,8 +942,8 @@ bool ServiceWorkerVersion::OnMessageReceived(const IPC::Message& message) {
OnSetCachedMetadata)
IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_ClearCachedMetadata,
OnClearCachedMetadata)
- IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_PostMessageToDocument,
- OnPostMessageToDocument)
+ IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_PostMessageToClient,
+ OnPostMessageToClient)
IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_FocusClient,
OnFocusClient)
IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_SkipWaiting,
@@ -996,7 +994,7 @@ void ServiceWorkerVersion::OnGetClients(
int request_id,
const ServiceWorkerClientQueryOptions& /* options */) {
// TODO(kinuko): Handle ClientQueryOptions. (crbug.com/455241, 460415 etc)
- if (controllee_by_id_.IsEmpty()) {
+ if (controllee_map_.empty()) {
if (running_status() == RUNNING) {
embedded_worker_->SendMessage(
ServiceWorkerMsg_DidGetClients(request_id,
@@ -1008,14 +1006,13 @@ void ServiceWorkerVersion::OnGetClients(
TRACE_EVENT0("ServiceWorker",
"ServiceWorkerVersion::OnGetClients");
- std::vector<Tuple<int,int,int>> clients_info;
- for (ControlleeByIDMap::iterator it(&controllee_by_id_); !it.IsAtEnd();
- it.Advance()) {
- int process_id = it.GetCurrentValue()->process_id();
- int frame_id = it.GetCurrentValue()->frame_id();
- int client_id = it.GetCurrentKey();
+ 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_id));
+ clients_info.push_back(MakeTuple(process_id, frame_id, client_uuid));
}
BrowserThread::PostTask(
@@ -1222,27 +1219,27 @@ void ServiceWorkerVersion::DidOpenWindow(int request_id,
}
for (const auto& it : controllee_map_) {
- const ServiceWorkerProviderHost* provider_host = it.first;
+ const ServiceWorkerProviderHost* provider_host = it.second;
if (provider_host->process_id() != render_process_id ||
provider_host->frame_id() != render_frame_id) {
continue;
}
- // it.second is the client_id associated with the provider_host.
+ // it.second is the client_uuid associated with the provider_host.
provider_host->GetClientInfo(
base::Bind(&ServiceWorkerVersion::OnOpenWindowFinished,
- weak_factory_.GetWeakPtr(), request_id, it.second));
+ weak_factory_.GetWeakPtr(), request_id, it.first));
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.
- OnOpenWindowFinished(request_id, 0, ServiceWorkerClientInfo());
+ OnOpenWindowFinished(request_id, std::string(), ServiceWorkerClientInfo());
}
void ServiceWorkerVersion::OnOpenWindowFinished(
int request_id,
- int client_id,
+ const std::string& client_uuid,
const ServiceWorkerClientInfo& client_info) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
@@ -1255,7 +1252,7 @@ void ServiceWorkerVersion::OnOpenWindowFinished(
// controlled but the action still succeeded. The renderer process is
// expecting an empty client in such case.
if (!client.IsEmpty())
- client.client_id = client_id;
+ client.client_uuid = client_uuid;
embedded_worker_->SendMessage(ServiceWorkerMsg_OpenWindowResponse(
request_id, client));
@@ -1298,44 +1295,53 @@ void ServiceWorkerVersion::OnClearCachedMetadataFinished(int64 callback_id,
FOR_EACH_OBSERVER(Listener, listeners_, OnCachedMetadataUpdated(this));
}
-void ServiceWorkerVersion::OnPostMessageToDocument(
- int client_id,
+void ServiceWorkerVersion::OnPostMessageToClient(
+ const std::string& client_uuid,
const base::string16& message,
const std::vector<TransferredMessagePort>& sent_message_ports) {
TRACE_EVENT1("ServiceWorker",
"ServiceWorkerVersion::OnPostMessageToDocument",
- "Client id", client_id);
- ServiceWorkerProviderHost* provider_host =
- controllee_by_id_.Lookup(client_id);
- if (!provider_host) {
+ "Client id", client_uuid);
+ auto it = controllee_map_.find(client_uuid);
+ if (it == controllee_map_.end()) {
// The client may already have been closed, just ignore.
return;
}
- provider_host->PostMessage(message, sent_message_ports);
+ if (it->second->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);
}
-void ServiceWorkerVersion::OnFocusClient(int request_id, int client_id) {
+void ServiceWorkerVersion::OnFocusClient(int request_id,
+ const std::string& client_uuid) {
TRACE_EVENT2("ServiceWorker",
"ServiceWorkerVersion::OnFocusClient",
"Request id", request_id,
- "Client id", client_id);
- ServiceWorkerProviderHost* provider_host =
- controllee_by_id_.Lookup(client_id);
- if (!provider_host) {
+ "Client id", client_uuid);
+ auto it = controllee_map_.find(client_uuid);
+ if (it == controllee_map_.end()) {
// The client may already have been closed, just ignore.
return;
}
+ if (it->second->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;
+ }
- provider_host->Focus(
+ it->second->Focus(
base::Bind(&ServiceWorkerVersion::OnFocusClientFinished,
weak_factory_.GetWeakPtr(),
request_id,
- client_id));
+ client_uuid));
}
void ServiceWorkerVersion::OnFocusClientFinished(
int request_id,
- int cliend_id,
+ const std::string& cliend_uuid,
const ServiceWorkerClientInfo& client) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
@@ -1343,7 +1349,7 @@ void ServiceWorkerVersion::OnFocusClientFinished(
return;
ServiceWorkerClientInfo client_info(client);
- client_info.client_id = cliend_id;
+ client_info.client_uuid = cliend_uuid;
embedded_worker_->SendMessage(ServiceWorkerMsg_FocusClientResponse(
request_id, client_info));
« no previous file with comments | « content/browser/service_worker/service_worker_version.h ('k') | content/common/service_worker/service_worker_client_info.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698