| Index: chrome/browser/site_details.cc
|
| diff --git a/chrome/browser/site_details.cc b/chrome/browser/site_details.cc
|
| index b38c389d48a8e4ba1d3d3250f95511803f2d728f..4a4f3ae155dd4b378cc2732ff3a1a9106a3fe692 100644
|
| --- a/chrome/browser/site_details.cc
|
| +++ b/chrome/browser/site_details.cc
|
| @@ -105,11 +105,32 @@ void CollectForScenario(std::map<RenderFrameHost*, GURL>* frame_urls,
|
| (*frame_urls)[frame] = site;
|
| }
|
|
|
| +content::SiteInstance* DeterminePrimarySiteInstance(
|
| + content::SiteInstance* instance,
|
| + SiteData* site_data) {
|
| + // Find the BrowsingInstance this WebContents belongs to by iterating over
|
| + // the "primary" SiteInstances of each BrowsingInstance we've seen so far.
|
| + for (auto& existing_site_instance : site_data->instances) {
|
| + if (instance->IsRelatedSiteInstance(existing_site_instance.first)) {
|
| + existing_site_instance.second.insert(instance);
|
| + return existing_site_instance.first;
|
| + }
|
| + }
|
| +
|
| + // Add |instance| as the "primary" SiteInstance of a new BrowsingInstance.
|
| + site_data->instances[instance].clear();
|
| + site_data->instances[instance].insert(instance);
|
| +
|
| + return instance;
|
| +}
|
| +
|
| void CollectCurrentSnapshot(SiteData* site_data, RenderFrameHost* frame) {
|
| if (frame->GetParent()) {
|
| if (frame->GetSiteInstance() != frame->GetParent()->GetSiteInstance())
|
| site_data->out_of_process_frames++;
|
| }
|
| +
|
| + DeterminePrimarySiteInstance(frame->GetSiteInstance(), site_data);
|
| }
|
|
|
| } // namespace
|
| @@ -132,21 +153,8 @@ SiteDetails::~SiteDetails() {}
|
| void SiteDetails::CollectSiteInfo(WebContents* contents,
|
| SiteData* site_data) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| - // 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();
|
| - SiteInstance* primary = NULL;
|
| - for (SiteInstance* already_collected_instance : site_data->instances) {
|
| - if (instance->IsRelatedSiteInstance(already_collected_instance)) {
|
| - primary = already_collected_instance;
|
| - break;
|
| - }
|
| - }
|
| - if (!primary) {
|
| - // Remember this as the "primary" SiteInstance of a new BrowsingInstance.
|
| - primary = instance;
|
| - site_data->instances.push_back(instance);
|
| - }
|
| + SiteInstance* primary =
|
| + DeterminePrimarySiteInstance(contents->GetSiteInstance(), site_data);
|
|
|
| // Now keep track of how many sites we have in this BrowsingInstance (and
|
| // overall), including sites in iframes.
|
| @@ -185,6 +193,10 @@ void SiteDetails::UpdateHistograms(
|
| }
|
| num_browsing_instances += i->second.scenarios[ISOLATE_ALL_SITES]
|
| .browsing_instance_site_map.size();
|
| + for (const auto& site_instance : i->second.instances) {
|
| + UMA_HISTOGRAM_COUNTS_100("SiteIsolation.SiteInstancesPerBrowsingInstance",
|
| + site_instance.second.size());
|
| + }
|
| num_oopifs += i->second.out_of_process_frames;
|
| }
|
|
|
|
|