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

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

Issue 985113002: ServiceWorker: coalesce all SWClientInfo request into one task. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@relax_sw_openWindow
Patch Set: 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
« no previous file with comments | « content/browser/service_worker/service_worker_version.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 f02e26f22ccf5119ba654f0f7bf525afadabfcf5..336babd56d12765b78059d0a7d465a78a246834f 100644
--- a/content/browser/service_worker/service_worker_version.cc
+++ b/content/browser/service_worker/service_worker_version.cc
@@ -37,41 +37,9 @@
namespace content {
-typedef ServiceWorkerVersion::StatusCallback StatusCallback;
-
-class ServiceWorkerVersion::GetClientDocumentsCallback
- : public base::RefCounted<GetClientDocumentsCallback> {
- public:
- GetClientDocumentsCallback(int request_id,
- ServiceWorkerVersion* version)
- : request_id_(request_id),
- version_(version) {
- DCHECK(version_);
- }
-
- void AddClientInfo(int client_id, const ServiceWorkerClientInfo& info) {
- clients_.push_back(info);
- clients_.back().client_id = client_id;
- }
-
- private:
- friend class base::RefCounted<GetClientDocumentsCallback>;
-
- virtual ~GetClientDocumentsCallback() {
- DCHECK_CURRENTLY_ON(BrowserThread::IO);
-
- if (version_->running_status() == RUNNING) {
- version_->embedded_worker_->SendMessage(
- ServiceWorkerMsg_DidGetClientDocuments(request_id_, clients_));
- }
- }
-
- std::vector<ServiceWorkerClientInfo> clients_;
- int request_id_;
- scoped_refptr<ServiceWorkerVersion> version_;
-
- DISALLOW_COPY_AND_ASSIGN(GetClientDocumentsCallback);
-};
+using StatusCallback = ServiceWorkerVersion::StatusCallback;
+using GetClientDocumentsCallback =
+ base::Callback<void(const std::vector<ServiceWorkerClientInfo>&)>;
namespace {
@@ -286,6 +254,38 @@ base::TimeDelta GetTickDuration(const base::TimeTicks& time) {
return base::TimeTicks().Now() - time;
}
+void OnGetClientDocumentsFromUI(
+ // The tuple contains process_id, frame_id, client_id.
michaeln 2015/03/06 23:55:22 nice comment
+ const std::vector<Tuple<int,int,int>>& clients_info,
+ const GURL& script_url,
+ const GetClientDocumentsCallback& callback) {
+ std::vector<ServiceWorkerClientInfo> clients;
+
+ for (const auto& it : clients_info) {
+ ServiceWorkerClientInfo info =
+ ServiceWorkerProviderHost::GetClientInfoOnUI(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
+ // it with a valid RenderFrameHost. It might be because the frame was killed
+ // or navigated in between.
+ if (info.IsEmpty())
+ continue;
+
+ // We can get info for a frame that was navigating end ended up with a
+ // 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;
+
+ info.client_id = get<2>(it);
+ clients.push_back(info);
+ }
+
+ BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
+ base::Bind(callback, clients));
+}
+
} // namespace
ServiceWorkerVersion::ServiceWorkerVersion(
@@ -993,18 +993,27 @@ void ServiceWorkerVersion::OnGetClientDocuments(int request_id) {
}
return;
}
- scoped_refptr<GetClientDocumentsCallback> callback(
- new GetClientDocumentsCallback(request_id, this));
- ControlleeByIDMap::iterator it(&controllee_by_id_);
+
TRACE_EVENT0("ServiceWorker",
"ServiceWorkerVersion::OnGetClientDocuments");
- while (!it.IsAtEnd()) {
- // TODO(mlamouri): we could coalesce those requests into one.
- it.GetCurrentValue()->GetClientInfo(
- base::Bind(&ServiceWorkerVersion::DidGetClientInfo,
- weak_factory_.GetWeakPtr(), it.GetCurrentKey(), callback));
- it.Advance();
+
+ 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();
+
+ clients_info.push_back(MakeTuple(process_id, frame_id, client_id));
}
+
+ BrowserThread::PostTask(
+ BrowserThread::UI, FROM_HERE,
+ base::Bind(&OnGetClientDocumentsFromUI, clients_info, script_url_,
+ base::Bind(&ServiceWorkerVersion::DidGetClientDocuments,
+ weak_factory_.GetWeakPtr(),
+ request_id)));
+
}
void ServiceWorkerVersion::OnActivateEventFinished(
@@ -1397,24 +1406,15 @@ void ServiceWorkerVersion::DidClaimClients(
embedded_worker_->SendMessage(ServiceWorkerMsg_DidClaimClients(request_id));
}
-void ServiceWorkerVersion::DidGetClientInfo(
- int client_id,
- scoped_refptr<GetClientDocumentsCallback> callback,
- const ServiceWorkerClientInfo& info) {
- // If the request to the provider_host returned an empty
- // ServiceWorkerClientInfo, that means that it wasn't possible to associate
- // it with a valid RenderFrameHost. It might be because the frame was killed
- // or navigated in between.
- if (info.IsEmpty())
- return;
-
- // We can get info for a frame that was navigating end ended up with a
- // different URL than expected. In such case, we should make sure to not
- // expose cross-origin WindowClient.
- if (info.url.GetOrigin() != script_url_.GetOrigin())
+void ServiceWorkerVersion::DidGetClientDocuments(
+ int request_id,
+ const std::vector<ServiceWorkerClientInfo>& clients) {
+ DCHECK_CURRENTLY_ON(BrowserThread::IO);
+ if (running_status() != RUNNING)
return;
- callback->AddClientInfo(client_id, info);
+ embedded_worker_->SendMessage(
+ ServiceWorkerMsg_DidGetClientDocuments(request_id, clients));
}
void ServiceWorkerVersion::StartTimeoutTimer() {
« no previous file with comments | « content/browser/service_worker/service_worker_version.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698