[email protected] | 1ae93fb1 | 2013-06-14 03:38:56 | [diff] [blame] | 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 |
| 3 | // found in the LICENSE file. |
| 4 | |
| 5 | #include "chrome/browser/site_details.h" |
| 6 | |
asvitkine | aa06031 | 2016-09-01 22:44:13 | [diff] [blame] | 7 | #include "base/metrics/histogram_macros.h" |
[email protected] | 1ae93fb1 | 2013-06-14 03:38:56 | [diff] [blame] | 8 | #include "content/public/browser/browser_thread.h" |
nick | b2545f7 | 2015-10-30 20:05:15 | [diff] [blame] | 9 | #include "content/public/browser/render_frame_host.h" |
[email protected] | 1ae93fb1 | 2013-06-14 03:38:56 | [diff] [blame] | 10 | #include "content/public/browser/render_process_host.h" |
brettw | 00899e6 | 2016-11-12 02:10:17 | [diff] [blame] | 11 | #include "extensions/features/features.h" |
nick | abbb4dcb | 2015-12-03 20:38:34 | [diff] [blame] | 12 | #include "url/origin.h" |
nick | cc0d914 | 2015-10-14 16:27:10 | [diff] [blame] | 13 | |
brettw | 00899e6 | 2016-11-12 02:10:17 | [diff] [blame] | 14 | #if BUILDFLAG(ENABLE_EXTENSIONS) |
nick | cc0d914 | 2015-10-14 16:27:10 | [diff] [blame] | 15 | #include "extensions/browser/extension_registry.h" |
nick | 37dfd9de | 2015-09-14 19:54:03 | [diff] [blame] | 16 | #include "extensions/common/constants.h" |
nick | cc0d914 | 2015-10-14 16:27:10 | [diff] [blame] | 17 | #include "extensions/common/extension.h" |
| 18 | #endif |
[email protected] | 1ae93fb1 | 2013-06-14 03:38:56 | [diff] [blame] | 19 | |
nick | b2545f7 | 2015-10-30 20:05:15 | [diff] [blame] | 20 | using content::BrowserContext; |
[email protected] | 1ae93fb1 | 2013-06-14 03:38:56 | [diff] [blame] | 21 | using content::BrowserThread; |
nick | b2545f7 | 2015-10-30 20:05:15 | [diff] [blame] | 22 | using content::RenderFrameHost; |
[email protected] | 1ae93fb1 | 2013-06-14 03:38:56 | [diff] [blame] | 23 | using content::RenderProcessHost; |
| 24 | using content::SiteInstance; |
| 25 | using content::WebContents; |
| 26 | |
nick | 37dfd9de | 2015-09-14 19:54:03 | [diff] [blame] | 27 | namespace { |
| 28 | |
nick | b2545f7 | 2015-10-30 20:05:15 | [diff] [blame] | 29 | bool ShouldIsolate(BrowserContext* browser_context, |
dcheng | afb53e2 | 2016-02-04 08:11:08 | [diff] [blame] | 30 | const IsolationScenario& scenario, |
nick | cc0d914 | 2015-10-14 16:27:10 | [diff] [blame] | 31 | const GURL& site) { |
dcheng | afb53e2 | 2016-02-04 08:11:08 | [diff] [blame] | 32 | switch (scenario.policy) { |
nick | b2545f7 | 2015-10-30 20:05:15 | [diff] [blame] | 33 | case ISOLATE_NOTHING: |
| 34 | return false; |
nick | 37dfd9de | 2015-09-14 19:54:03 | [diff] [blame] | 35 | case ISOLATE_ALL_SITES: |
| 36 | return true; |
| 37 | case ISOLATE_HTTPS_SITES: |
| 38 | // Note: For estimation purposes "isolate https sites" is really |
| 39 | // implemented as "isolate non-http sites". This means that, for example, |
| 40 | // the New Tab Page gets counted as two processes under this policy, and |
| 41 | // extensions are isolated as well. |
| 42 | return !site.SchemeIs(url::kHttpScheme); |
nick | cc0d914 | 2015-10-14 16:27:10 | [diff] [blame] | 43 | case ISOLATE_EXTENSIONS: { |
brettw | 00899e6 | 2016-11-12 02:10:17 | [diff] [blame] | 44 | #if !BUILDFLAG(ENABLE_EXTENSIONS) |
nick | cc0d914 | 2015-10-14 16:27:10 | [diff] [blame] | 45 | return false; |
| 46 | #else |
| 47 | if (!site.SchemeIs(extensions::kExtensionScheme)) |
| 48 | return false; |
| 49 | extensions::ExtensionRegistry* registry = |
| 50 | extensions::ExtensionRegistry::Get(browser_context); |
| 51 | const extensions::Extension* extension = |
| 52 | registry->enabled_extensions().GetExtensionOrAppByURL(site); |
| 53 | return extension && !extension->is_hosted_app(); |
| 54 | #endif |
| 55 | } |
nick | 37dfd9de | 2015-09-14 19:54:03 | [diff] [blame] | 56 | } |
| 57 | NOTREACHED(); |
| 58 | return true; |
| 59 | } |
| 60 | |
nasko | 5027371 | 2015-12-03 16:03:50 | [diff] [blame] | 61 | content::SiteInstance* DeterminePrimarySiteInstance( |
nick | 6c28ecc9 | 2016-02-09 21:30:12 | [diff] [blame] | 62 | content::SiteInstance* site_instance, |
nasko | 5027371 | 2015-12-03 16:03:50 | [diff] [blame] | 63 | SiteData* site_data) { |
| 64 | // Find the BrowsingInstance this WebContents belongs to by iterating over |
| 65 | // the "primary" SiteInstances of each BrowsingInstance we've seen so far. |
nick | 6c28ecc9 | 2016-02-09 21:30:12 | [diff] [blame] | 66 | for (auto& entry : site_data->browsing_instances) { |
| 67 | BrowsingInstanceInfo* browsing_instance = &entry.second; |
| 68 | content::SiteInstance* primary_for_browsing_instance = entry.first; |
| 69 | |
| 70 | if (site_instance->IsRelatedSiteInstance(primary_for_browsing_instance)) { |
| 71 | browsing_instance->site_instances.insert(site_instance); |
| 72 | return primary_for_browsing_instance; |
nasko | 5027371 | 2015-12-03 16:03:50 | [diff] [blame] | 73 | } |
| 74 | } |
| 75 | |
| 76 | // Add |instance| as the "primary" SiteInstance of a new BrowsingInstance. |
nick | 6c28ecc9 | 2016-02-09 21:30:12 | [diff] [blame] | 77 | BrowsingInstanceInfo* browsing_instance = |
| 78 | &site_data->browsing_instances[site_instance]; |
| 79 | browsing_instance->site_instances.insert(site_instance); |
nasko | 5027371 | 2015-12-03 16:03:50 | [diff] [blame] | 80 | |
nick | 6c28ecc9 | 2016-02-09 21:30:12 | [diff] [blame] | 81 | return site_instance; |
nasko | 5027371 | 2015-12-03 16:03:50 | [diff] [blame] | 82 | } |
| 83 | |
nick | 37dfd9de | 2015-09-14 19:54:03 | [diff] [blame] | 84 | } // namespace |
| 85 | |
nick | 6c28ecc9 | 2016-02-09 21:30:12 | [diff] [blame] | 86 | ScenarioBrowsingInstanceInfo::ScenarioBrowsingInstanceInfo() {} |
| 87 | |
vmpstr | b8aacbe | 2016-02-26 02:00:48 | [diff] [blame] | 88 | ScenarioBrowsingInstanceInfo::ScenarioBrowsingInstanceInfo( |
| 89 | const ScenarioBrowsingInstanceInfo& other) = default; |
| 90 | |
nick | 6c28ecc9 | 2016-02-09 21:30:12 | [diff] [blame] | 91 | ScenarioBrowsingInstanceInfo::~ScenarioBrowsingInstanceInfo() {} |
| 92 | |
| 93 | BrowsingInstanceInfo::BrowsingInstanceInfo() {} |
| 94 | |
vmpstr | b8aacbe | 2016-02-26 02:00:48 | [diff] [blame] | 95 | BrowsingInstanceInfo::BrowsingInstanceInfo(const BrowsingInstanceInfo& other) = |
| 96 | default; |
| 97 | |
nick | 6c28ecc9 | 2016-02-09 21:30:12 | [diff] [blame] | 98 | BrowsingInstanceInfo::~BrowsingInstanceInfo() {} |
| 99 | |
nick | de8b027 | 2016-02-11 04:29:25 | [diff] [blame] | 100 | IsolationScenario::IsolationScenario() {} |
nick | 37dfd9de | 2015-09-14 19:54:03 | [diff] [blame] | 101 | |
vmpstr | b8aacbe | 2016-02-26 02:00:48 | [diff] [blame] | 102 | IsolationScenario::IsolationScenario(const IsolationScenario& other) = default; |
| 103 | |
nick | 37dfd9de | 2015-09-14 19:54:03 | [diff] [blame] | 104 | IsolationScenario::~IsolationScenario() {} |
| 105 | |
nick | de8b027 | 2016-02-11 04:29:25 | [diff] [blame] | 106 | SiteData::SiteData() { |
nick | b2545f7 | 2015-10-30 20:05:15 | [diff] [blame] | 107 | for (int i = 0; i <= ISOLATION_SCENARIO_LAST; i++) |
| 108 | scenarios[i].policy = static_cast<IsolationScenarioType>(i); |
nick | 37dfd9de | 2015-09-14 19:54:03 | [diff] [blame] | 109 | } |
[email protected] | 1ae93fb1 | 2013-06-14 03:38:56 | [diff] [blame] | 110 | |
vmpstr | b8aacbe | 2016-02-26 02:00:48 | [diff] [blame] | 111 | SiteData::SiteData(const SiteData& other) = default; |
| 112 | |
[email protected] | 1ae93fb1 | 2013-06-14 03:38:56 | [diff] [blame] | 113 | SiteData::~SiteData() {} |
| 114 | |
| 115 | SiteDetails::SiteDetails() {} |
| 116 | |
| 117 | SiteDetails::~SiteDetails() {} |
| 118 | |
| 119 | void SiteDetails::CollectSiteInfo(WebContents* contents, |
| 120 | SiteData* site_data) { |
thestig | 00844cea | 2015-09-08 21:44:52 | [diff] [blame] | 121 | DCHECK_CURRENTLY_ON(BrowserThread::UI); |
nick | de8b027 | 2016-02-11 04:29:25 | [diff] [blame] | 122 | BrowserContext* context = contents->GetBrowserContext(); |
| 123 | |
| 124 | // The primary should be the same for the whole tab. |
nasko | 5027371 | 2015-12-03 16:03:50 | [diff] [blame] | 125 | SiteInstance* primary = |
| 126 | DeterminePrimarySiteInstance(contents->GetSiteInstance(), site_data); |
nick | de8b027 | 2016-02-11 04:29:25 | [diff] [blame] | 127 | BrowsingInstanceInfo* browsing_instance = |
| 128 | &site_data->browsing_instances[primary]; |
| 129 | |
| 130 | for (RenderFrameHost* frame : contents->GetAllFrames()) { |
| 131 | // Ensure that we add the frame's SiteInstance to |site_instances|. |
| 132 | DCHECK(frame->GetSiteInstance()->IsRelatedSiteInstance(primary)); |
| 133 | browsing_instance->site_instances.insert(frame->GetSiteInstance()); |
| 134 | browsing_instance->proxy_count += frame->GetProxyCount(); |
| 135 | |
| 136 | if (frame->GetParent()) { |
| 137 | if (frame->GetSiteInstance() != frame->GetParent()->GetSiteInstance()) |
| 138 | site_data->out_of_process_frames++; |
| 139 | } |
| 140 | } |
[email protected] | 1ae93fb1 | 2013-06-14 03:38:56 | [diff] [blame] | 141 | |
| 142 | // Now keep track of how many sites we have in this BrowsingInstance (and |
| 143 | // overall), including sites in iframes. |
nick | b2545f7 | 2015-10-30 20:05:15 | [diff] [blame] | 144 | for (IsolationScenario& scenario : site_data->scenarios) { |
dcheng | afb53e2 | 2016-02-04 08:11:08 | [diff] [blame] | 145 | std::map<RenderFrameHost*, GURL> frame_urls; |
| 146 | for (RenderFrameHost* frame : contents->GetAllFrames()) { |
| 147 | // Determine the site from the frame's origin, with a fallback to the |
| 148 | // frame's URL. In cases like <iframe sandbox>, we can wind up with an |
| 149 | // http URL but a unique origin. The origin of the resource will still |
| 150 | // determine process placement. |
| 151 | url::Origin origin = frame->GetLastCommittedOrigin(); |
| 152 | GURL site = SiteInstance::GetSiteForURL( |
csharrison | aec2c54 | 2016-10-12 19:40:36 | [diff] [blame] | 153 | context, |
| 154 | origin.unique() ? frame->GetLastCommittedURL() : origin.GetURL()); |
dcheng | afb53e2 | 2016-02-04 08:11:08 | [diff] [blame] | 155 | |
| 156 | bool should_isolate = ShouldIsolate(context, scenario, site); |
| 157 | |
| 158 | // Treat a subframe as part of its parent site if neither needs isolation. |
| 159 | if (!should_isolate && frame->GetParent()) { |
| 160 | GURL parent_site = frame_urls[frame->GetParent()]; |
| 161 | if (!ShouldIsolate(context, scenario, parent_site)) |
| 162 | site = parent_site; |
| 163 | } |
| 164 | |
| 165 | bool process_per_site = |
| 166 | site.is_valid() && |
| 167 | RenderProcessHost::ShouldUseProcessPerSite(context, site); |
| 168 | |
| 169 | // If we don't need a dedicated process, and aren't living in a process- |
| 170 | // per-site process, we are nothing special: collapse our URL to a dummy |
| 171 | // site. |
| 172 | if (!process_per_site && !should_isolate) |
| 173 | site = GURL("http://"); |
| 174 | |
| 175 | // We model process-per-site by only inserting those sites into the first |
| 176 | // browsing instance in which they appear. |
nick | 6c28ecc9 | 2016-02-09 21:30:12 | [diff] [blame] | 177 | if (scenario.all_sites.insert(site).second || !process_per_site) |
| 178 | scenario.browsing_instances[primary->GetId()].sites.insert(site); |
dcheng | afb53e2 | 2016-02-04 08:11:08 | [diff] [blame] | 179 | |
| 180 | // Record our result in |frame_urls| for use by children. |
| 181 | frame_urls[frame] = site; |
| 182 | } |
[email protected] | 1ae93fb1 | 2013-06-14 03:38:56 | [diff] [blame] | 183 | } |
nasko | aab1a44 | 2015-11-19 02:10:36 | [diff] [blame] | 184 | |
[email protected] | 1ae93fb1 | 2013-06-14 03:38:56 | [diff] [blame] | 185 | } |
| 186 | |
| 187 | void SiteDetails::UpdateHistograms( |
| 188 | const BrowserContextSiteDataMap& site_data_map, |
| 189 | int all_renderer_process_count, |
| 190 | int non_renderer_process_count) { |
| 191 | // Reports a set of site-based process metrics to UMA. |
| 192 | int process_limit = RenderProcessHost::GetMaxRendererProcessCount(); |
| 193 | |
nasko | aab1a44 | 2015-11-19 02:10:36 | [diff] [blame] | 194 | // Sum the number of sites and SiteInstances in each BrowserContext and |
| 195 | // the total number of out-of-process iframes. |
nick | 37dfd9de | 2015-09-14 19:54:03 | [diff] [blame] | 196 | int num_sites[ISOLATION_SCENARIO_LAST + 1] = {}; |
| 197 | int num_isolated_site_instances[ISOLATION_SCENARIO_LAST + 1] = {}; |
[email protected] | 1ae93fb1 | 2013-06-14 03:38:56 | [diff] [blame] | 198 | int num_browsing_instances = 0; |
nasko | aab1a44 | 2015-11-19 02:10:36 | [diff] [blame] | 199 | int num_oopifs = 0; |
nick | de8b027 | 2016-02-11 04:29:25 | [diff] [blame] | 200 | int num_proxies = 0; |
nick | 6c28ecc9 | 2016-02-09 21:30:12 | [diff] [blame] | 201 | for (auto& site_data_map_entry : site_data_map) { |
| 202 | const SiteData& site_data = site_data_map_entry.second; |
| 203 | for (const IsolationScenario& scenario : site_data.scenarios) { |
| 204 | num_sites[scenario.policy] += scenario.all_sites.size(); |
| 205 | for (auto& entry : scenario.browsing_instances) { |
| 206 | const ScenarioBrowsingInstanceInfo& scenario_browsing_instance_info = |
| 207 | entry.second; |
nick | 37dfd9de | 2015-09-14 19:54:03 | [diff] [blame] | 208 | num_isolated_site_instances[scenario.policy] += |
nick | 6c28ecc9 | 2016-02-09 21:30:12 | [diff] [blame] | 209 | scenario_browsing_instance_info.sites.size(); |
nick | 37dfd9de | 2015-09-14 19:54:03 | [diff] [blame] | 210 | } |
[email protected] | 1ae93fb1 | 2013-06-14 03:38:56 | [diff] [blame] | 211 | } |
nick | 6c28ecc9 | 2016-02-09 21:30:12 | [diff] [blame] | 212 | for (const auto& entry : site_data.browsing_instances) { |
| 213 | const BrowsingInstanceInfo& browsing_instance_info = entry.second; |
nasko | 5027371 | 2015-12-03 16:03:50 | [diff] [blame] | 214 | UMA_HISTOGRAM_COUNTS_100("SiteIsolation.SiteInstancesPerBrowsingInstance", |
nick | 6c28ecc9 | 2016-02-09 21:30:12 | [diff] [blame] | 215 | browsing_instance_info.site_instances.size()); |
nick | de8b027 | 2016-02-11 04:29:25 | [diff] [blame] | 216 | UMA_HISTOGRAM_COUNTS_10000("SiteIsolation.ProxyCountPerBrowsingInstance", |
| 217 | browsing_instance_info.proxy_count); |
| 218 | num_proxies += browsing_instance_info.proxy_count; |
nasko | 5027371 | 2015-12-03 16:03:50 | [diff] [blame] | 219 | } |
nick | 6c28ecc9 | 2016-02-09 21:30:12 | [diff] [blame] | 220 | num_browsing_instances += site_data.browsing_instances.size(); |
| 221 | num_oopifs += site_data.out_of_process_frames; |
[email protected] | 1ae93fb1 | 2013-06-14 03:38:56 | [diff] [blame] | 222 | } |
| 223 | |
nick | 37dfd9de | 2015-09-14 19:54:03 | [diff] [blame] | 224 | // Predict the number of processes needed when isolating all sites, when |
| 225 | // isolating only HTTPS sites, and when isolating extensions. |
| 226 | int process_count_lower_bound[ISOLATION_SCENARIO_LAST + 1]; |
| 227 | int process_count_upper_bound[ISOLATION_SCENARIO_LAST + 1]; |
| 228 | int process_count_estimate[ISOLATION_SCENARIO_LAST + 1]; |
| 229 | for (int policy = 0; policy <= ISOLATION_SCENARIO_LAST; policy++) { |
| 230 | process_count_lower_bound[policy] = num_sites[policy]; |
| 231 | process_count_upper_bound[policy] = num_sites[policy] + process_limit - 1; |
| 232 | process_count_estimate[policy] = std::min( |
| 233 | num_isolated_site_instances[policy], process_count_upper_bound[policy]); |
| 234 | } |
[email protected] | 1ae93fb1 | 2013-06-14 03:38:56 | [diff] [blame] | 235 | |
| 236 | // Just renderer process count: |
| 237 | UMA_HISTOGRAM_COUNTS_100("SiteIsolation.CurrentRendererProcessCount", |
| 238 | all_renderer_process_count); |
| 239 | UMA_HISTOGRAM_COUNTS_100( |
| 240 | "SiteIsolation.BrowsingInstanceCount", |
| 241 | num_browsing_instances); |
nick | de8b027 | 2016-02-11 04:29:25 | [diff] [blame] | 242 | UMA_HISTOGRAM_COUNTS_10000("SiteIsolation.ProxyCount", num_proxies); |
nasko | aab1a44 | 2015-11-19 02:10:36 | [diff] [blame] | 243 | UMA_HISTOGRAM_COUNTS_100("SiteIsolation.OutOfProcessIframes", num_oopifs); |
nick | b2545f7 | 2015-10-30 20:05:15 | [diff] [blame] | 244 | |
| 245 | // ISOLATE_NOTHING metrics. |
| 246 | UMA_HISTOGRAM_COUNTS_100("SiteIsolation.IsolateNothingProcessCountNoLimit", |
| 247 | num_isolated_site_instances[ISOLATE_NOTHING]); |
| 248 | UMA_HISTOGRAM_COUNTS_100("SiteIsolation.IsolateNothingProcessCountLowerBound", |
| 249 | process_count_lower_bound[ISOLATE_NOTHING]); |
| 250 | UMA_HISTOGRAM_COUNTS_100("SiteIsolation.IsolateNothingProcessCountEstimate", |
| 251 | process_count_estimate[ISOLATE_NOTHING]); |
| 252 | UMA_HISTOGRAM_COUNTS_100( |
| 253 | "SiteIsolation.IsolateNothingTotalProcessCountEstimate", |
| 254 | process_count_estimate[ISOLATE_NOTHING] + non_renderer_process_count); |
| 255 | |
| 256 | // ISOLATE_ALL_SITES metrics. |
nick | 37dfd9de | 2015-09-14 19:54:03 | [diff] [blame] | 257 | UMA_HISTOGRAM_COUNTS_100("SiteIsolation.IsolateAllSitesProcessCountNoLimit", |
| 258 | num_isolated_site_instances[ISOLATE_ALL_SITES]); |
[email protected] | 1ae93fb1 | 2013-06-14 03:38:56 | [diff] [blame] | 259 | UMA_HISTOGRAM_COUNTS_100( |
| 260 | "SiteIsolation.IsolateAllSitesProcessCountLowerBound", |
nick | 37dfd9de | 2015-09-14 19:54:03 | [diff] [blame] | 261 | process_count_lower_bound[ISOLATE_ALL_SITES]); |
| 262 | UMA_HISTOGRAM_COUNTS_100("SiteIsolation.IsolateAllSitesProcessCountEstimate", |
| 263 | process_count_estimate[ISOLATE_ALL_SITES]); |
nick | b2545f7 | 2015-10-30 20:05:15 | [diff] [blame] | 264 | UMA_HISTOGRAM_COUNTS_100( |
| 265 | "SiteIsolation.IsolateAllSitesTotalProcessCountEstimate", |
| 266 | process_count_estimate[ISOLATE_ALL_SITES] + non_renderer_process_count); |
nick | 37dfd9de | 2015-09-14 19:54:03 | [diff] [blame] | 267 | |
nick | b2545f7 | 2015-10-30 20:05:15 | [diff] [blame] | 268 | // ISOLATE_HTTPS_SITES metrics. |
nick | 37dfd9de | 2015-09-14 19:54:03 | [diff] [blame] | 269 | UMA_HISTOGRAM_COUNTS_100("SiteIsolation.IsolateHttpsSitesProcessCountNoLimit", |
| 270 | num_isolated_site_instances[ISOLATE_HTTPS_SITES]); |
[email protected] | 1ae93fb1 | 2013-06-14 03:38:56 | [diff] [blame] | 271 | UMA_HISTOGRAM_COUNTS_100( |
| 272 | "SiteIsolation.IsolateHttpsSitesProcessCountLowerBound", |
nick | 37dfd9de | 2015-09-14 19:54:03 | [diff] [blame] | 273 | process_count_lower_bound[ISOLATE_HTTPS_SITES]); |
[email protected] | 1ae93fb1 | 2013-06-14 03:38:56 | [diff] [blame] | 274 | UMA_HISTOGRAM_COUNTS_100( |
| 275 | "SiteIsolation.IsolateHttpsSitesProcessCountEstimate", |
nick | 37dfd9de | 2015-09-14 19:54:03 | [diff] [blame] | 276 | process_count_estimate[ISOLATE_HTTPS_SITES]); |
nick | b2545f7 | 2015-10-30 20:05:15 | [diff] [blame] | 277 | UMA_HISTOGRAM_COUNTS_100( |
| 278 | "SiteIsolation.IsolateHttpsSitesTotalProcessCountEstimate", |
| 279 | process_count_estimate[ISOLATE_HTTPS_SITES] + non_renderer_process_count); |
nick | 37dfd9de | 2015-09-14 19:54:03 | [diff] [blame] | 280 | |
nick | b2545f7 | 2015-10-30 20:05:15 | [diff] [blame] | 281 | // ISOLATE_EXTENSIONS metrics. |
nick | 37dfd9de | 2015-09-14 19:54:03 | [diff] [blame] | 282 | UMA_HISTOGRAM_COUNTS_100("SiteIsolation.IsolateExtensionsProcessCountNoLimit", |
| 283 | num_isolated_site_instances[ISOLATE_EXTENSIONS]); |
| 284 | UMA_HISTOGRAM_COUNTS_100( |
| 285 | "SiteIsolation.IsolateExtensionsProcessCountLowerBound", |
| 286 | process_count_lower_bound[ISOLATE_EXTENSIONS]); |
| 287 | UMA_HISTOGRAM_COUNTS_100( |
| 288 | "SiteIsolation.IsolateExtensionsProcessCountEstimate", |
| 289 | process_count_estimate[ISOLATE_EXTENSIONS]); |
nick | 37dfd9de | 2015-09-14 19:54:03 | [diff] [blame] | 290 | UMA_HISTOGRAM_COUNTS_100( |
| 291 | "SiteIsolation.IsolateExtensionsTotalProcessCountEstimate", |
| 292 | process_count_estimate[ISOLATE_EXTENSIONS] + non_renderer_process_count); |
[email protected] | 1ae93fb1 | 2013-06-14 03:38:56 | [diff] [blame] | 293 | } |