15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/browsing_instance.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/site_instance_impl.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_context.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/content_browser_client.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_switches.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/url_constants.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowsingInstance::BrowsingInstance(BrowserContext* browser_context) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : browser_context_(browser_context) { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowsingInstance::HasSiteInstance(const GURL& url) { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string site = 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstanceImpl::GetSiteForURL(browser_context_, url) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .possibly_invalid_spec(); 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return site_instance_map_.find(site) != site_instance_map_.end(); 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SiteInstance* BrowsingInstance::GetSiteInstanceForURL(const GURL& url) { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string site = 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstanceImpl::GetSiteForURL(browser_context_, url) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .possibly_invalid_spec(); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstanceMap::iterator i = site_instance_map_.find(site); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (i != site_instance_map_.end()) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return i->second; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // No current SiteInstance for this site, so let's create one. 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstanceImpl* instance = new SiteInstanceImpl(this); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set the site of this new SiteInstance, which will register it with us. 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance->SetSite(url); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return instance; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingInstance::RegisterSiteInstance(SiteInstance* site_instance) { 48868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(static_cast<SiteInstanceImpl*>(site_instance) 49868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ->browsing_instance_.get() == 50868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) this); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(static_cast<SiteInstanceImpl*>(site_instance)->HasSite()); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string site = site_instance->GetSiteURL().possibly_invalid_spec(); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only register if we don't have a SiteInstance for this site already. 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It's possible to have two SiteInstances point to the same site if two 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // tabs are navigated there at the same time. (We don't call SetSite or 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // register them until DidNavigate.) If there is a previously existing 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SiteInstance for this site, we just won't register the new one. 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstanceMap::iterator i = site_instance_map_.find(site); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (i == site_instance_map_.end()) { 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Not previously registered, so register it. 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) site_instance_map_[site] = site_instance; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowsingInstance::UnregisterSiteInstance(SiteInstance* site_instance) { 67868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(static_cast<SiteInstanceImpl*>(site_instance) 68868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ->browsing_instance_.get() == 69868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) this); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(static_cast<SiteInstanceImpl*>(site_instance)->HasSite()); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string site = site_instance->GetSiteURL().possibly_invalid_spec(); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only unregister the SiteInstance if it is the same one that is registered 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for the site. (It might have been an unregistered SiteInstance. See the 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // comments in RegisterSiteInstance.) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstanceMap::iterator i = site_instance_map_.find(site); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (i != site_instance_map_.end() && i->second == site_instance) { 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Matches, so erase it. 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) site_instance_map_.erase(i); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowsingInstance::~BrowsingInstance() { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We should only be deleted when all of the SiteInstances that refer to 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // us are gone. 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(site_instance_map_.empty()); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 90