| Index: content/browser/browsing_instance.cc
|
| diff --git a/content/browser/browsing_instance.cc b/content/browser/browsing_instance.cc
|
| index 5dd0ca4191fe832c5d4eea078c9cab946a8d397b..5705dcecd806b3d731c03bfccc38ee4fb37fa96b 100644
|
| --- a/content/browser/browsing_instance.cc
|
| +++ b/content/browser/browsing_instance.cc
|
| @@ -15,16 +15,49 @@
|
|
|
| namespace content {
|
|
|
| +namespace {
|
| +
|
| +using BrowsingInstanceList = std::set<BrowsingInstance*>;
|
| +base::LazyInstance<BrowsingInstanceList>::DestructorAtExit
|
| + g_browsing_instance_list = LAZY_INSTANCE_INITIALIZER;
|
| +
|
| +} // namespace
|
| +
|
| +// static
|
| +scoped_refptr<SiteInstanceImpl> BrowsingInstance::FindSiteInstance(
|
| + BrowserContext* browser_context,
|
| + const GURL& url) {
|
| + for (BrowsingInstance* browsing_instance : g_browsing_instance_list.Get()) {
|
| + if (browsing_instance->browser_context() == browser_context &&
|
| + browsing_instance->HasSiteInstance(url)) {
|
| + return browsing_instance->GetSiteInstanceForURL(url);
|
| + }
|
| + }
|
| + std::string site = SiteInstanceImpl::GetSiteForURL(browser_context, url)
|
| + .possibly_invalid_spec();
|
| + for (BrowsingInstance* browsing_instance : g_browsing_instance_list.Get()) {
|
| + if (browsing_instance->browser_context() != browser_context)
|
| + continue;
|
| + if (browsing_instance->site_to_site_instance_map_.find(site) !=
|
| + browsing_instance->site_to_site_instance_map_.end()) {
|
| + for (SiteInstanceImpl* instance :
|
| + browsing_instance->site_to_site_instance_map_[site]) {
|
| + return instance;
|
| + }
|
| + }
|
| + }
|
| + return nullptr;
|
| +}
|
| +
|
| BrowsingInstance::BrowsingInstance(BrowserContext* browser_context)
|
| - : browser_context_(browser_context),
|
| - active_contents_count_(0u) {
|
| + : browser_context_(browser_context), active_contents_count_(0u) {
|
| + g_browsing_instance_list.Get().insert(this);
|
| }
|
|
|
| bool BrowsingInstance::HasSiteInstance(const GURL& url) {
|
| std::string site =
|
| SiteInstanceImpl::GetSiteForURL(browser_context_, url)
|
| .possibly_invalid_spec();
|
| -
|
| return site_instance_map_.find(site) != site_instance_map_.end();
|
| }
|
|
|
| @@ -102,7 +135,28 @@ void BrowsingInstance::UnregisterSiteInstance(SiteInstanceImpl* site_instance) {
|
| default_subframe_site_instance_ = nullptr;
|
| }
|
|
|
| +void BrowsingInstance::RegisterUsedFor(SiteInstanceImpl* site_instance,
|
| + std::string site) {
|
| + auto instances = site_to_site_instance_map_.find(site);
|
| + if (instances == site_to_site_instance_map_.end())
|
| + site_to_site_instance_map_[site] = std::set<SiteInstanceImpl*>();
|
| + site_to_site_instance_map_[site].insert(site_instance);
|
| +}
|
| +
|
| +void BrowsingInstance::UnregisterUsedFor(SiteInstanceImpl* site_instance,
|
| + const std::set<std::string>& sites) {
|
| + for (const auto& site : sites) {
|
| + if (site_to_site_instance_map_.find(site) !=
|
| + site_to_site_instance_map_.end()) {
|
| + site_to_site_instance_map_[site].erase(site_instance);
|
| + if (site_to_site_instance_map_[site].empty())
|
| + site_to_site_instance_map_.erase(site);
|
| + }
|
| + }
|
| +}
|
| +
|
| BrowsingInstance::~BrowsingInstance() {
|
| + g_browsing_instance_list.Get().erase(this);
|
| // We should only be deleted when all of the SiteInstances that refer to
|
| // us are gone.
|
| DCHECK(site_instance_map_.empty());
|
|
|