Index: chrome/browser/site_details.cc |
diff --git a/chrome/browser/site_details.cc b/chrome/browser/site_details.cc |
index bf9d9478200dd518a863c3300248ff3232bb2eee..a5daea38f447e0472950f01f16b0ad676e7f0960 100644 |
--- a/chrome/browser/site_details.cc |
+++ b/chrome/browser/site_details.cc |
@@ -6,6 +6,7 @@ |
#include "base/metrics/histogram.h" |
#include "content/public/browser/browser_thread.h" |
+#include "content/public/browser/render_frame_host.h" |
#include "content/public/browser/render_process_host.h" |
#if defined(ENABLE_EXTENSIONS) |
@@ -14,17 +15,21 @@ |
#include "extensions/common/extension.h" |
#endif |
+using content::BrowserContext; |
using content::BrowserThread; |
+using content::RenderFrameHost; |
using content::RenderProcessHost; |
using content::SiteInstance; |
using content::WebContents; |
namespace { |
-bool ShouldIsolate(content::BrowserContext* browser_context, |
- IsolationScenarioType policy, |
+bool ShouldIsolate(BrowserContext* browser_context, |
+ const IsolationScenario* scenario, |
const GURL& site) { |
- switch (policy) { |
+ switch (scenario->policy) { |
+ case ISOLATE_NOTHING: |
+ return false; |
case ISOLATE_ALL_SITES: |
return true; |
case ISOLATE_HTTPS_SITES: |
@@ -51,26 +56,64 @@ bool ShouldIsolate(content::BrowserContext* browser_context, |
return true; |
} |
+// Walk the frame tree and update |scenario|'s data for the given frame. Memoize |
+// each frame's computed URL in |frame_urls| so it can be reused when visiting |
+// its children. |
+void CollectForScenario(std::map<RenderFrameHost*, GURL>* frame_urls, |
+ SiteInstance* primary, |
+ IsolationScenario* scenario, |
+ RenderFrameHost* frame) { |
+ BrowserContext* context = primary->GetBrowserContext(); |
+ |
+ GURL url = frame->GetLastCommittedURL(); |
+ |
+ // Treat about:blank url specially: use the URL on the SiteInstance if it is |
+ // assigned. The rest of this computation must not depend on the |
+ // SiteInstance's URL, since its value reflects the current process model, and |
+ // this computation is simulating other process models. |
+ if (url == GURL(url::kAboutBlankURL) && |
+ !frame->GetSiteInstance()->GetSiteURL().is_empty()) { |
+ url = frame->GetSiteInstance()->GetSiteURL(); |
+ } |
+ |
+ GURL site = SiteInstance::GetSiteForURL(context, url); |
+ bool should_isolate = ShouldIsolate(context, scenario, site); |
+ |
+ // Treat a subframe as part of its parent site if neither needs isolation. |
+ if (!should_isolate && frame->GetParent()) { |
+ GURL parent_site = (*frame_urls)[frame->GetParent()]; |
+ if (!ShouldIsolate(context, scenario, parent_site)) |
+ site = parent_site; |
+ } |
+ |
+ bool process_per_site = |
+ site.is_valid() && |
+ RenderProcessHost::ShouldUseProcessPerSite(context, site); |
+ |
+ // If we don't need a dedicated process, and aren't living in a process- |
+ // per-site process, we are nothing special: collapse our URL to a dummy |
+ // site. |
+ if (!process_per_site && !should_isolate) |
+ site = GURL("http://"); |
+ |
+ // We model process-per-site by only inserting those sites into the first |
+ // browsing instance in which they appear. |
+ if (scenario->sites.insert(site).second || !process_per_site) |
+ scenario->browsing_instance_site_map[primary->GetId()].insert(site); |
+ |
+ // Record our result in |frame_urls| for use by children. |
+ (*frame_urls)[frame] = site; |
+} |
+ |
} // namespace |
IsolationScenario::IsolationScenario() : policy(ISOLATE_ALL_SITES) {} |
IsolationScenario::~IsolationScenario() {} |
-void IsolationScenario::CollectSiteInfoForScenario(SiteInstance* primary, |
- const GURL& site) { |
- const GURL& isolated = |
- ShouldIsolate(primary->GetBrowserContext(), policy, site) |
- ? site |
- : GURL("http://"); |
- sites.insert(isolated); |
- browsing_instance_site_map[primary->GetId()].insert(isolated); |
-} |
- |
SiteData::SiteData() { |
- scenarios[ISOLATE_ALL_SITES].policy = ISOLATE_ALL_SITES; |
- scenarios[ISOLATE_HTTPS_SITES].policy = ISOLATE_HTTPS_SITES; |
- scenarios[ISOLATE_EXTENSIONS].policy = ISOLATE_EXTENSIONS; |
+ for (int i = 0; i <= ISOLATION_SCENARIO_LAST; i++) |
+ scenarios[i].policy = static_cast<IsolationScenarioType>(i); |
} |
SiteData::~SiteData() {} |
@@ -82,8 +125,6 @@ SiteDetails::~SiteDetails() {} |
void SiteDetails::CollectSiteInfo(WebContents* contents, |
SiteData* site_data) { |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
- content::BrowserContext* browser_context = contents->GetBrowserContext(); |
- |
// Find the BrowsingInstance this WebContents belongs to by iterating over |
// the "primary" SiteInstances of each BrowsingInstance we've seen so far. |
SiteInstance* instance = contents->GetSiteInstance(); |
@@ -102,19 +143,11 @@ void SiteDetails::CollectSiteInfo(WebContents* contents, |
// Now keep track of how many sites we have in this BrowsingInstance (and |
// overall), including sites in iframes. |
- for (const GURL& site : contents->GetSitesInTab()) { |
- // Make sure we don't overcount process-per-site sites, like the NTP or |
- // extensions, by skipping over them if they're already logged for |
- // ISOLATE_ALL_SITES. |
- if (RenderProcessHost::ShouldUseProcessPerSite(browser_context, site) && |
- site_data->scenarios[ISOLATE_ALL_SITES].sites.find(site) != |
- site_data->scenarios[ISOLATE_ALL_SITES].sites.end()) { |
- continue; |
- } |
- |
- for (IsolationScenario& scenario : site_data->scenarios) { |
- scenario.CollectSiteInfoForScenario(primary, site); |
- } |
+ for (IsolationScenario& scenario : site_data->scenarios) { |
+ std::map<RenderFrameHost*, GURL> memo; |
+ contents->ForEachFrame( |
+ base::Bind(&CollectForScenario, base::Unretained(&memo), |
+ base::Unretained(primary), base::Unretained(&scenario))); |
} |
} |
@@ -160,6 +193,19 @@ void SiteDetails::UpdateHistograms( |
UMA_HISTOGRAM_COUNTS_100( |
"SiteIsolation.BrowsingInstanceCount", |
num_browsing_instances); |
+ |
+ // ISOLATE_NOTHING metrics. |
+ UMA_HISTOGRAM_COUNTS_100("SiteIsolation.IsolateNothingProcessCountNoLimit", |
+ num_isolated_site_instances[ISOLATE_NOTHING]); |
+ UMA_HISTOGRAM_COUNTS_100("SiteIsolation.IsolateNothingProcessCountLowerBound", |
+ process_count_lower_bound[ISOLATE_NOTHING]); |
+ UMA_HISTOGRAM_COUNTS_100("SiteIsolation.IsolateNothingProcessCountEstimate", |
+ process_count_estimate[ISOLATE_NOTHING]); |
+ UMA_HISTOGRAM_COUNTS_100( |
+ "SiteIsolation.IsolateNothingTotalProcessCountEstimate", |
+ process_count_estimate[ISOLATE_NOTHING] + non_renderer_process_count); |
+ |
+ // ISOLATE_ALL_SITES metrics. |
UMA_HISTOGRAM_COUNTS_100("SiteIsolation.IsolateAllSitesProcessCountNoLimit", |
num_isolated_site_instances[ISOLATE_ALL_SITES]); |
UMA_HISTOGRAM_COUNTS_100( |
@@ -167,7 +213,11 @@ void SiteDetails::UpdateHistograms( |
process_count_lower_bound[ISOLATE_ALL_SITES]); |
UMA_HISTOGRAM_COUNTS_100("SiteIsolation.IsolateAllSitesProcessCountEstimate", |
process_count_estimate[ISOLATE_ALL_SITES]); |
+ UMA_HISTOGRAM_COUNTS_100( |
+ "SiteIsolation.IsolateAllSitesTotalProcessCountEstimate", |
+ process_count_estimate[ISOLATE_ALL_SITES] + non_renderer_process_count); |
+ // ISOLATE_HTTPS_SITES metrics. |
UMA_HISTOGRAM_COUNTS_100("SiteIsolation.IsolateHttpsSitesProcessCountNoLimit", |
num_isolated_site_instances[ISOLATE_HTTPS_SITES]); |
UMA_HISTOGRAM_COUNTS_100( |
@@ -176,7 +226,11 @@ void SiteDetails::UpdateHistograms( |
UMA_HISTOGRAM_COUNTS_100( |
"SiteIsolation.IsolateHttpsSitesProcessCountEstimate", |
process_count_estimate[ISOLATE_HTTPS_SITES]); |
+ UMA_HISTOGRAM_COUNTS_100( |
+ "SiteIsolation.IsolateHttpsSitesTotalProcessCountEstimate", |
+ process_count_estimate[ISOLATE_HTTPS_SITES] + non_renderer_process_count); |
+ // ISOLATE_EXTENSIONS metrics. |
UMA_HISTOGRAM_COUNTS_100("SiteIsolation.IsolateExtensionsProcessCountNoLimit", |
num_isolated_site_instances[ISOLATE_EXTENSIONS]); |
UMA_HISTOGRAM_COUNTS_100( |
@@ -185,14 +239,6 @@ void SiteDetails::UpdateHistograms( |
UMA_HISTOGRAM_COUNTS_100( |
"SiteIsolation.IsolateExtensionsProcessCountEstimate", |
process_count_estimate[ISOLATE_EXTENSIONS]); |
- |
- // Total process count: |
- UMA_HISTOGRAM_COUNTS_100( |
- "SiteIsolation.IsolateAllSitesTotalProcessCountEstimate", |
- process_count_estimate[ISOLATE_ALL_SITES] + non_renderer_process_count); |
- UMA_HISTOGRAM_COUNTS_100( |
- "SiteIsolation.IsolateHttpsSitesTotalProcessCountEstimate", |
- process_count_estimate[ISOLATE_HTTPS_SITES] + non_renderer_process_count); |
UMA_HISTOGRAM_COUNTS_100( |
"SiteIsolation.IsolateExtensionsTotalProcessCountEstimate", |
process_count_estimate[ISOLATE_EXTENSIONS] + non_renderer_process_count); |