blob: 1d5f8953769f92efbc770b3ca88331235d4d8002 [file] [log] [blame]
[email protected]72daaa92012-01-18 13:39:021// Copyright (c) 2012 The Chromium Authors. All rights reserved.
license.botbf09a502008-08-24 00:55:552// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
initial.commit09911bf2008-07-26 23:55:294
[email protected]df8e899b2011-02-22 22:58:225#include "content/browser/browsing_instance.h"
initial.commit09911bf2008-07-26 23:55:296
7#include "base/command_line.h"
[email protected]dec76e802010-09-23 22:43:538#include "base/logging.h"
[email protected]b6583592012-01-25 19:52:339#include "content/browser/site_instance_impl.h"
[email protected]ccb797302011-12-15 16:55:1110#include "content/public/browser/browser_context.h"
[email protected]87f3c082011-10-19 18:07:4411#include "content/public/browser/content_browser_client.h"
[email protected]c08950d22011-10-13 22:20:2912#include "content/public/common/content_switches.h"
[email protected]a1d29162011-10-14 17:14:0313#include "content/public/common/url_constants.h"
initial.commit09911bf2008-07-26 23:55:2914
[email protected]46488322012-10-30 03:22:2015namespace content {
initial.commit09911bf2008-07-26 23:55:2916
[email protected]46488322012-10-30 03:22:2017BrowsingInstance::BrowsingInstance(BrowserContext* browser_context)
[email protected]d5072a82014-05-15 05:50:1818 : browser_context_(browser_context),
19 active_contents_count_(0u) {
[email protected]dec76e802010-09-23 22:43:5320}
21
initial.commit09911bf2008-07-26 23:55:2922bool BrowsingInstance::HasSiteInstance(const GURL& url) {
[email protected]3a8eecb2010-04-22 23:56:3023 std::string site =
[email protected]b6583592012-01-25 19:52:3324 SiteInstanceImpl::GetSiteForURL(browser_context_, url)
[email protected]3d7474ff2011-07-27 17:47:3725 .possibly_invalid_spec();
initial.commit09911bf2008-07-26 23:55:2926
[email protected]41fb79a52012-06-29 16:34:3327 return site_instance_map_.find(site) != site_instance_map_.end();
initial.commit09911bf2008-07-26 23:55:2928}
29
30SiteInstance* BrowsingInstance::GetSiteInstanceForURL(const GURL& url) {
[email protected]3a8eecb2010-04-22 23:56:3031 std::string site =
[email protected]b6583592012-01-25 19:52:3332 SiteInstanceImpl::GetSiteForURL(browser_context_, url)
[email protected]3d7474ff2011-07-27 17:47:3733 .possibly_invalid_spec();
initial.commit09911bf2008-07-26 23:55:2934
[email protected]41fb79a52012-06-29 16:34:3335 SiteInstanceMap::iterator i = site_instance_map_.find(site);
36 if (i != site_instance_map_.end())
initial.commit09911bf2008-07-26 23:55:2937 return i->second;
[email protected]41fb79a52012-06-29 16:34:3338
initial.commit09911bf2008-07-26 23:55:2939
40 // No current SiteInstance for this site, so let's create one.
[email protected]b6583592012-01-25 19:52:3341 SiteInstanceImpl* instance = new SiteInstanceImpl(this);
initial.commit09911bf2008-07-26 23:55:2942
43 // Set the site of this new SiteInstance, which will register it with us.
44 instance->SetSite(url);
45 return instance;
46}
47
48void BrowsingInstance::RegisterSiteInstance(SiteInstance* site_instance) {
[email protected]fc72bb12013-06-02 21:13:4649 DCHECK(static_cast<SiteInstanceImpl*>(site_instance)
50 ->browsing_instance_.get() ==
51 this);
[email protected]b6583592012-01-25 19:52:3352 DCHECK(static_cast<SiteInstanceImpl*>(site_instance)->HasSite());
[email protected]77ab17312012-09-28 15:34:5953 std::string site = site_instance->GetSiteURL().possibly_invalid_spec();
initial.commit09911bf2008-07-26 23:55:2954
55 // Only register if we don't have a SiteInstance for this site already.
56 // It's possible to have two SiteInstances point to the same site if two
57 // tabs are navigated there at the same time. (We don't call SetSite or
58 // register them until DidNavigate.) If there is a previously existing
59 // SiteInstance for this site, we just won't register the new one.
[email protected]41fb79a52012-06-29 16:34:3360 SiteInstanceMap::iterator i = site_instance_map_.find(site);
61 if (i == site_instance_map_.end()) {
initial.commit09911bf2008-07-26 23:55:2962 // Not previously registered, so register it.
[email protected]41fb79a52012-06-29 16:34:3363 site_instance_map_[site] = site_instance;
initial.commit09911bf2008-07-26 23:55:2964 }
65}
66
67void BrowsingInstance::UnregisterSiteInstance(SiteInstance* site_instance) {
[email protected]fc72bb12013-06-02 21:13:4668 DCHECK(static_cast<SiteInstanceImpl*>(site_instance)
69 ->browsing_instance_.get() ==
70 this);
[email protected]b6583592012-01-25 19:52:3371 DCHECK(static_cast<SiteInstanceImpl*>(site_instance)->HasSite());
[email protected]77ab17312012-09-28 15:34:5972 std::string site = site_instance->GetSiteURL().possibly_invalid_spec();
initial.commit09911bf2008-07-26 23:55:2973
74 // Only unregister the SiteInstance if it is the same one that is registered
75 // for the site. (It might have been an unregistered SiteInstance. See the
76 // comments in RegisterSiteInstance.)
[email protected]41fb79a52012-06-29 16:34:3377 SiteInstanceMap::iterator i = site_instance_map_.find(site);
78 if (i != site_instance_map_.end() && i->second == site_instance) {
initial.commit09911bf2008-07-26 23:55:2979 // Matches, so erase it.
[email protected]41fb79a52012-06-29 16:34:3380 site_instance_map_.erase(i);
initial.commit09911bf2008-07-26 23:55:2981 }
initial.commit09911bf2008-07-26 23:55:2982}
[email protected]dec76e802010-09-23 22:43:5383
84BrowsingInstance::~BrowsingInstance() {
85 // We should only be deleted when all of the SiteInstances that refer to
86 // us are gone.
87 DCHECK(site_instance_map_.empty());
[email protected]d5072a82014-05-15 05:50:1888 DCHECK_EQ(0u, active_contents_count_);
[email protected]dec76e802010-09-23 22:43:5389}
[email protected]46488322012-10-30 03:22:2090
91} // namespace content