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

Side by Side Diff: content/browser/service_worker/service_worker_version.cc

Issue 1535983002: ServiceWorker: Factor out functions to collect client information from ServiceWorkerVersion (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 4 years, 11 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 unified diff | Download patch
« no previous file with comments | « content/browser/service_worker/service_worker_version.h ('k') | content/content_browser.gypi » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/service_worker/service_worker_version.h" 5 #include "content/browser/service_worker/service_worker_version.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <algorithm>
10 #include <map> 9 #include <map>
11 #include <string> 10 #include <string>
12 11
13 #include "base/command_line.h" 12 #include "base/command_line.h"
14 #include "base/guid.h" 13 #include "base/guid.h"
15 #include "base/location.h" 14 #include "base/location.h"
16 #include "base/macros.h" 15 #include "base/macros.h"
17 #include "base/memory/ref_counted.h" 16 #include "base/memory/ref_counted.h"
18 #include "base/metrics/histogram_macros.h" 17 #include "base/metrics/histogram_macros.h"
19 #include "base/single_thread_task_runner.h" 18 #include "base/single_thread_task_runner.h"
20 #include "base/stl_util.h" 19 #include "base/stl_util.h"
21 #include "base/strings/string16.h" 20 #include "base/strings/string16.h"
22 #include "base/strings/utf_string_conversions.h" 21 #include "base/strings/utf_string_conversions.h"
23 #include "base/thread_task_runner_handle.h" 22 #include "base/thread_task_runner_handle.h"
24 #include "base/time/time.h" 23 #include "base/time/time.h"
25 #include "content/browser/bad_message.h" 24 #include "content/browser/bad_message.h"
26 #include "content/browser/child_process_security_policy_impl.h" 25 #include "content/browser/child_process_security_policy_impl.h"
27 #include "content/browser/message_port_message_filter.h" 26 #include "content/browser/message_port_message_filter.h"
28 #include "content/browser/message_port_service.h" 27 #include "content/browser/message_port_service.h"
29 #include "content/browser/service_worker/embedded_worker_instance.h" 28 #include "content/browser/service_worker/embedded_worker_instance.h"
30 #include "content/browser/service_worker/embedded_worker_registry.h" 29 #include "content/browser/service_worker/embedded_worker_registry.h"
31 #include "content/browser/service_worker/service_worker_client_navigation_utils. h" 30 #include "content/browser/service_worker/service_worker_client_utils.h"
32 #include "content/browser/service_worker/service_worker_context_core.h" 31 #include "content/browser/service_worker/service_worker_context_core.h"
33 #include "content/browser/service_worker/service_worker_context_wrapper.h" 32 #include "content/browser/service_worker/service_worker_context_wrapper.h"
34 #include "content/browser/service_worker/service_worker_metrics.h" 33 #include "content/browser/service_worker/service_worker_metrics.h"
35 #include "content/browser/service_worker/service_worker_registration.h" 34 #include "content/browser/service_worker/service_worker_registration.h"
36 #include "content/common/service_worker/service_worker_messages.h" 35 #include "content/common/service_worker/service_worker_messages.h"
37 #include "content/common/service_worker/service_worker_type_converters.h" 36 #include "content/common/service_worker/service_worker_type_converters.h"
38 #include "content/common/service_worker/service_worker_utils.h" 37 #include "content/common/service_worker/service_worker_utils.h"
39 #include "content/public/browser/browser_thread.h" 38 #include "content/public/browser/browser_thread.h"
40 #include "content/public/browser/content_browser_client.h" 39 #include "content/public/browser/content_browser_client.h"
41 #include "content/public/browser/render_process_host.h" 40 #include "content/public/browser/render_process_host.h"
42 #include "content/public/common/background_sync.mojom.h" 41 #include "content/public/common/background_sync.mojom.h"
43 #include "content/public/common/content_client.h" 42 #include "content/public/common/content_client.h"
44 #include "content/public/common/content_switches.h" 43 #include "content/public/common/content_switches.h"
45 #include "content/public/common/result_codes.h" 44 #include "content/public/common/result_codes.h"
46 #include "content/public/common/service_registry.h" 45 #include "content/public/common/service_registry.h"
47 #include "mojo/common/common_type_converters.h" 46 #include "mojo/common/common_type_converters.h"
48 #include "mojo/common/url_type_converters.h" 47 #include "mojo/common/url_type_converters.h"
49 #include "net/http/http_response_headers.h" 48 #include "net/http/http_response_headers.h"
50 #include "net/http/http_response_info.h" 49 #include "net/http/http_response_info.h"
51 50
52 namespace content { 51 namespace content {
53 52
54 using StatusCallback = ServiceWorkerVersion::StatusCallback; 53 using StatusCallback = ServiceWorkerVersion::StatusCallback;
55 using ServiceWorkerClients = std::vector<ServiceWorkerClientInfo>;
56 using GetClientsCallback =
57 base::Callback<void(scoped_ptr<ServiceWorkerClients>)>;
58 54
59 namespace { 55 namespace {
60 56
61 // Time to wait until stopping an idle worker. 57 // Time to wait until stopping an idle worker.
62 const int kIdleWorkerTimeoutSeconds = 30; 58 const int kIdleWorkerTimeoutSeconds = 30;
63 59
64 // Default delay for scheduled update. 60 // Default delay for scheduled update.
65 const int kUpdateDelaySeconds = 1; 61 const int kUpdateDelaySeconds = 1;
66 62
67 // Timeout for waiting for a response to a ping. 63 // Timeout for waiting for a response to a ping.
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
192 return false; 188 return false;
193 return base::TimeTicks().Now() >= expiration; 189 return base::TimeTicks().Now() >= expiration;
194 } 190 }
195 191
196 base::TimeDelta GetTickDuration(const base::TimeTicks& time) { 192 base::TimeDelta GetTickDuration(const base::TimeTicks& time) {
197 if (time.is_null()) 193 if (time.is_null())
198 return base::TimeDelta(); 194 return base::TimeDelta();
199 return base::TimeTicks().Now() - time; 195 return base::TimeTicks().Now() - time;
200 } 196 }
201 197
202 void OnGetWindowClientsFromUI(
203 // The tuple contains process_id, frame_id, client_uuid.
204 const std::vector<base::Tuple<int, int, std::string>>& clients_info,
205 const GURL& script_url,
206 const GetClientsCallback& callback) {
207 scoped_ptr<ServiceWorkerClients> clients(new ServiceWorkerClients);
208
209 for (const auto& it : clients_info) {
210 ServiceWorkerClientInfo info =
211 ServiceWorkerProviderHost::GetWindowClientInfoOnUI(base::get<0>(it),
212 base::get<1>(it));
213
214 // If the request to the provider_host returned an empty
215 // ServiceWorkerClientInfo, that means that it wasn't possible to associate
216 // it with a valid RenderFrameHost. It might be because the frame was killed
217 // or navigated in between.
218 if (info.IsEmpty())
219 continue;
220
221 // We can get info for a frame that was navigating end ended up with a
222 // different URL than expected. In such case, we should make sure to not
223 // expose cross-origin WindowClient.
224 if (info.url.GetOrigin() != script_url.GetOrigin())
225 continue;
226
227 info.client_uuid = base::get<2>(it);
228 clients->push_back(info);
229 }
230
231 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
232 base::Bind(callback, base::Passed(&clients)));
233 }
234
235 void AddWindowClient(
236 ServiceWorkerProviderHost* host,
237 std::vector<base::Tuple<int, int, std::string>>* client_info) {
238 if (host->client_type() != blink::WebServiceWorkerClientTypeWindow)
239 return;
240 client_info->push_back(base::MakeTuple(host->process_id(), host->frame_id(),
241 host->client_uuid()));
242 }
243
244 void AddNonWindowClient(ServiceWorkerProviderHost* host,
245 const ServiceWorkerClientQueryOptions& options,
246 ServiceWorkerClients* clients) {
247 blink::WebServiceWorkerClientType host_client_type = host->client_type();
248 if (host_client_type == blink::WebServiceWorkerClientTypeWindow)
249 return;
250 if (options.client_type != blink::WebServiceWorkerClientTypeAll &&
251 options.client_type != host_client_type)
252 return;
253
254 ServiceWorkerClientInfo client_info(blink::WebPageVisibilityStateHidden,
255 false, // is_focused
256 host->document_url(),
257 REQUEST_CONTEXT_FRAME_TYPE_NONE,
258 base::TimeTicks(), host_client_type);
259 client_info.client_uuid = host->client_uuid();
260 clients->push_back(client_info);
261 }
262
263 bool IsInstalled(ServiceWorkerVersion::Status status) { 198 bool IsInstalled(ServiceWorkerVersion::Status status) {
264 switch (status) { 199 switch (status) {
265 case ServiceWorkerVersion::NEW: 200 case ServiceWorkerVersion::NEW:
266 case ServiceWorkerVersion::INSTALLING: 201 case ServiceWorkerVersion::INSTALLING:
267 case ServiceWorkerVersion::REDUNDANT: 202 case ServiceWorkerVersion::REDUNDANT:
268 return false; 203 return false;
269 case ServiceWorkerVersion::INSTALLED: 204 case ServiceWorkerVersion::INSTALLED:
270 case ServiceWorkerVersion::ACTIVATING: 205 case ServiceWorkerVersion::ACTIVATING:
271 case ServiceWorkerVersion::ACTIVATED: 206 case ServiceWorkerVersion::ACTIVATED:
272 return true; 207 return true;
273 } 208 }
274 NOTREACHED() << "Unexpected status: " << status; 209 NOTREACHED() << "Unexpected status: " << status;
275 return false; 210 return false;
276 } 211 }
277 212
278 struct ServiceWorkerClientInfoSortMRU {
279 bool operator()(const ServiceWorkerClientInfo& a,
280 const ServiceWorkerClientInfo& b) const {
281 return a.last_focus_time > b.last_focus_time;
282 }
283 };
284
285 } // namespace 213 } // namespace
286 214
287 const int ServiceWorkerVersion::kTimeoutTimerDelaySeconds = 30; 215 const int ServiceWorkerVersion::kTimeoutTimerDelaySeconds = 30;
288 const int ServiceWorkerVersion::kStartInstalledWorkerTimeoutSeconds = 10; 216 const int ServiceWorkerVersion::kStartInstalledWorkerTimeoutSeconds = 10;
289 const int ServiceWorkerVersion::kStartNewWorkerTimeoutMinutes = 5; 217 const int ServiceWorkerVersion::kStartNewWorkerTimeoutMinutes = 5;
290 const int ServiceWorkerVersion::kRequestTimeoutMinutes = 5; 218 const int ServiceWorkerVersion::kRequestTimeoutMinutes = 5;
291 const int ServiceWorkerVersion::kStopWorkerTimeoutSeconds = 5; 219 const int ServiceWorkerVersion::kStopWorkerTimeoutSeconds = 5;
292 220
293 class ServiceWorkerVersion::Metrics { 221 class ServiceWorkerVersion::Metrics {
294 public: 222 public:
(...skipping 883 matching lines...) Expand 10 before | Expand all | Expand 10 after
1178 } 1106 }
1179 } 1107 }
1180 1108
1181 void ServiceWorkerVersion::OnGetClients( 1109 void ServiceWorkerVersion::OnGetClients(
1182 int request_id, 1110 int request_id,
1183 const ServiceWorkerClientQueryOptions& options) { 1111 const ServiceWorkerClientQueryOptions& options) {
1184 TRACE_EVENT_ASYNC_BEGIN2( 1112 TRACE_EVENT_ASYNC_BEGIN2(
1185 "ServiceWorker", "ServiceWorkerVersion::OnGetClients", request_id, 1113 "ServiceWorker", "ServiceWorkerVersion::OnGetClients", request_id,
1186 "client_type", options.client_type, "include_uncontrolled", 1114 "client_type", options.client_type, "include_uncontrolled",
1187 options.include_uncontrolled); 1115 options.include_uncontrolled);
1188 1116 service_worker_client_utils::GetClients(
1189 ServiceWorkerClients clients; 1117 weak_factory_.GetWeakPtr(), options,
1190 if (controllee_map_.empty() && !options.include_uncontrolled) { 1118 base::Bind(&ServiceWorkerVersion::OnGetClientsFinished,
1191 OnGetClientsFinished(request_id, &clients); 1119 weak_factory_.GetWeakPtr(), request_id));
1192 return;
1193 }
1194
1195 // For Window clients we want to query the info on the UI thread first.
1196 if (options.client_type == blink::WebServiceWorkerClientTypeWindow ||
1197 options.client_type == blink::WebServiceWorkerClientTypeAll) {
1198 GetWindowClients(request_id, options);
1199 return;
1200 }
1201
1202 GetNonWindowClients(request_id, options, &clients);
1203 OnGetClientsFinished(request_id, &clients);
1204 } 1120 }
1205 1121
1206 void ServiceWorkerVersion::OnGetClientsFinished(int request_id, 1122 void ServiceWorkerVersion::OnGetClientsFinished(int request_id,
1207 ServiceWorkerClients* clients) { 1123 ServiceWorkerClients* clients) {
1208 DCHECK_CURRENTLY_ON(BrowserThread::IO); 1124 DCHECK_CURRENTLY_ON(BrowserThread::IO);
1209 TRACE_EVENT_ASYNC_END1("ServiceWorker", "ServiceWorkerVersion::OnGetClients", 1125 TRACE_EVENT_ASYNC_END1("ServiceWorker", "ServiceWorkerVersion::OnGetClients",
1210 request_id, "The number of clients", clients->size()); 1126 request_id, "The number of clients", clients->size());
1211 1127
1212 // When Clients.matchAll() is called on the script evaluation phase, the 1128 // When Clients.matchAll() is called on the script evaluation phase, the
1213 // running status can be STARTING here. 1129 // running status can be STARTING here.
1214 if (running_status() != STARTING && running_status() != RUNNING) 1130 if (running_status() != STARTING && running_status() != RUNNING)
1215 return; 1131 return;
1216 1132
1217 // Sort clients so that the most recently active tab is in the front.
1218 std::sort(clients->begin(), clients->end(), ServiceWorkerClientInfoSortMRU());
1219 embedded_worker_->SendMessage( 1133 embedded_worker_->SendMessage(
1220 ServiceWorkerMsg_DidGetClients(request_id, *clients)); 1134 ServiceWorkerMsg_DidGetClients(request_id, *clients));
1221 } 1135 }
1222 1136
1223 void ServiceWorkerVersion::OnActivateEventFinished( 1137 void ServiceWorkerVersion::OnActivateEventFinished(
1224 int request_id, 1138 int request_id,
1225 blink::WebServiceWorkerEventResult result) { 1139 blink::WebServiceWorkerEventResult result) {
1226 DCHECK(ACTIVATING == status() || 1140 DCHECK(ACTIVATING == status() ||
1227 REDUNDANT == status()) << status(); 1141 REDUNDANT == status()) << status();
1228 TRACE_EVENT0("ServiceWorker", 1142 TRACE_EVENT0("ServiceWorker",
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after
1424 // possible to receive such requests since the renderer-side checks are 1338 // possible to receive such requests since the renderer-side checks are
1425 // slightly different. For example, the view-source scheme will not be 1339 // slightly different. For example, the view-source scheme will not be
1426 // filtered out by Blink. 1340 // filtered out by Blink.
1427 if (!ChildProcessSecurityPolicyImpl::GetInstance()->CanRequestURL( 1341 if (!ChildProcessSecurityPolicyImpl::GetInstance()->CanRequestURL(
1428 embedded_worker_->process_id(), url)) { 1342 embedded_worker_->process_id(), url)) {
1429 embedded_worker_->SendMessage(ServiceWorkerMsg_OpenWindowError( 1343 embedded_worker_->SendMessage(ServiceWorkerMsg_OpenWindowError(
1430 request_id, url.spec() + " cannot be opened.")); 1344 request_id, url.spec() + " cannot be opened."));
1431 return; 1345 return;
1432 } 1346 }
1433 1347
1434 service_worker_client_navigation_utils::OpenWindow( 1348 service_worker_client_utils::OpenWindow(
1435 url, script_url_, embedded_worker_->process_id(), context_, 1349 url, script_url_, embedded_worker_->process_id(), context_,
1436 base::Bind(&ServiceWorkerVersion::OnOpenWindowFinished, 1350 base::Bind(&ServiceWorkerVersion::OnOpenWindowFinished,
1437 weak_factory_.GetWeakPtr(), request_id)); 1351 weak_factory_.GetWeakPtr(), request_id));
1438 } 1352 }
1439 1353
1440 void ServiceWorkerVersion::OnOpenWindowFinished( 1354 void ServiceWorkerVersion::OnOpenWindowFinished(
1441 int request_id, 1355 int request_id,
1442 ServiceWorkerStatusCode status, 1356 ServiceWorkerStatusCode status,
1443 const std::string& client_uuid, 1357 const std::string& client_uuid,
1444 const ServiceWorkerClientInfo& client_info) { 1358 const ServiceWorkerClientInfo& client_info) {
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
1595 } 1509 }
1596 1510
1597 ServiceWorkerProviderHost* provider_host = 1511 ServiceWorkerProviderHost* provider_host =
1598 context_->GetProviderHostByClientID(client_uuid); 1512 context_->GetProviderHostByClientID(client_uuid);
1599 if (!provider_host || provider_host->active_version() != this) { 1513 if (!provider_host || provider_host->active_version() != this) {
1600 embedded_worker_->SendMessage( 1514 embedded_worker_->SendMessage(
1601 ServiceWorkerMsg_NavigateClientError(request_id, url)); 1515 ServiceWorkerMsg_NavigateClientError(request_id, url));
1602 return; 1516 return;
1603 } 1517 }
1604 1518
1605 service_worker_client_navigation_utils::NavigateClient( 1519 service_worker_client_utils::NavigateClient(
1606 url, script_url_, provider_host->process_id(), provider_host->frame_id(), 1520 url, script_url_, provider_host->process_id(), provider_host->frame_id(),
1607 context_, base::Bind(&ServiceWorkerVersion::OnNavigateClientFinished, 1521 context_, base::Bind(&ServiceWorkerVersion::OnNavigateClientFinished,
1608 weak_factory_.GetWeakPtr(), request_id)); 1522 weak_factory_.GetWeakPtr(), request_id));
1609 } 1523 }
1610 1524
1611 void ServiceWorkerVersion::OnNavigateClientFinished( 1525 void ServiceWorkerVersion::OnNavigateClientFinished(
1612 int request_id, 1526 int request_id,
1613 ServiceWorkerStatusCode status, 1527 ServiceWorkerStatusCode status,
1614 const std::string& client_uuid, 1528 const std::string& client_uuid,
1615 const ServiceWorkerClientInfo& client_info) { 1529 const ServiceWorkerClientInfo& client_info) {
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
1762 if (!timeout_timer_.IsRunning()) 1676 if (!timeout_timer_.IsRunning())
1763 StartTimeoutTimer(); 1677 StartTimeoutTimer();
1764 if (running_status() == STOPPED) { 1678 if (running_status() == STOPPED) {
1765 embedded_worker_->Start( 1679 embedded_worker_->Start(
1766 version_id_, scope_, script_url_, 1680 version_id_, scope_, script_url_,
1767 base::Bind(&ServiceWorkerVersion::OnStartSentAndScriptEvaluated, 1681 base::Bind(&ServiceWorkerVersion::OnStartSentAndScriptEvaluated,
1768 weak_factory_.GetWeakPtr())); 1682 weak_factory_.GetWeakPtr()));
1769 } 1683 }
1770 } 1684 }
1771 1685
1772 void ServiceWorkerVersion::GetWindowClients(
1773 int request_id,
1774 const ServiceWorkerClientQueryOptions& options) {
1775 DCHECK(options.client_type == blink::WebServiceWorkerClientTypeWindow ||
1776 options.client_type == blink::WebServiceWorkerClientTypeAll);
1777
1778 std::vector<base::Tuple<int, int, std::string>> clients_info;
1779 if (!options.include_uncontrolled) {
1780 for (auto& controllee : controllee_map_)
1781 AddWindowClient(controllee.second, &clients_info);
1782 } else if (context_) {
1783 for (auto it =
1784 context_->GetClientProviderHostIterator(script_url_.GetOrigin());
1785 !it->IsAtEnd(); it->Advance()) {
1786 AddWindowClient(it->GetProviderHost(), &clients_info);
1787 }
1788 }
1789
1790 if (clients_info.empty()) {
1791 DidGetWindowClients(request_id, options,
1792 make_scoped_ptr(new ServiceWorkerClients));
1793 return;
1794 }
1795
1796 BrowserThread::PostTask(
1797 BrowserThread::UI, FROM_HERE,
1798 base::Bind(&OnGetWindowClientsFromUI, clients_info, script_url_,
1799 base::Bind(&ServiceWorkerVersion::DidGetWindowClients,
1800 weak_factory_.GetWeakPtr(), request_id, options)));
1801 }
1802
1803 void ServiceWorkerVersion::DidGetWindowClients(
1804 int request_id,
1805 const ServiceWorkerClientQueryOptions& options,
1806 scoped_ptr<ServiceWorkerClients> clients) {
1807 DCHECK_CURRENTLY_ON(BrowserThread::IO);
1808 if (options.client_type == blink::WebServiceWorkerClientTypeAll)
1809 GetNonWindowClients(request_id, options, clients.get());
1810 OnGetClientsFinished(request_id, clients.get());
1811 }
1812
1813 void ServiceWorkerVersion::GetNonWindowClients(
1814 int request_id,
1815 const ServiceWorkerClientQueryOptions& options,
1816 ServiceWorkerClients* clients) {
1817 if (!options.include_uncontrolled) {
1818 for (auto& controllee : controllee_map_) {
1819 AddNonWindowClient(controllee.second, options, clients);
1820 }
1821 } else if (context_) {
1822 for (auto it =
1823 context_->GetClientProviderHostIterator(script_url_.GetOrigin());
1824 !it->IsAtEnd(); it->Advance()) {
1825 AddNonWindowClient(it->GetProviderHost(), options, clients);
1826 }
1827 }
1828 }
1829
1830 void ServiceWorkerVersion::StartTimeoutTimer() { 1686 void ServiceWorkerVersion::StartTimeoutTimer() {
1831 DCHECK(!timeout_timer_.IsRunning()); 1687 DCHECK(!timeout_timer_.IsRunning());
1832 1688
1833 if (embedded_worker_->devtools_attached()) { 1689 if (embedded_worker_->devtools_attached()) {
1834 // Don't record the startup time metric once DevTools is attached. 1690 // Don't record the startup time metric once DevTools is attached.
1835 ClearTick(&start_time_); 1691 ClearTick(&start_time_);
1836 skip_recording_startup_time_ = true; 1692 skip_recording_startup_time_ = true;
1837 } else { 1693 } else {
1838 RestartTick(&start_time_); 1694 RestartTick(&start_time_);
1839 skip_recording_startup_time_ = false; 1695 skip_recording_startup_time_ = false;
(...skipping 437 matching lines...) Expand 10 before | Expand all | Expand 10 after
2277 void ServiceWorkerVersion::OnBeginEvent() { 2133 void ServiceWorkerVersion::OnBeginEvent() {
2278 if (should_exclude_from_uma_ || running_status() != RUNNING || 2134 if (should_exclude_from_uma_ || running_status() != RUNNING ||
2279 idle_time_.is_null()) { 2135 idle_time_.is_null()) {
2280 return; 2136 return;
2281 } 2137 }
2282 ServiceWorkerMetrics::RecordTimeBetweenEvents(base::TimeTicks::Now() - 2138 ServiceWorkerMetrics::RecordTimeBetweenEvents(base::TimeTicks::Now() -
2283 idle_time_); 2139 idle_time_);
2284 } 2140 }
2285 2141
2286 } // namespace content 2142 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/service_worker/service_worker_version.h ('k') | content/content_browser.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698