blob: 1404997505e098132bf374167bfd2de9aebb242c [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"
Nick Carterbf6264a52018-04-06 02:39:3312#include "content/public/browser/site_isolation_policy.h"
[email protected]c08950d22011-10-13 22:20:2913#include "content/public/common/content_switches.h"
[email protected]a1d29162011-10-14 17:14:0314#include "content/public/common/url_constants.h"
initial.commit09911bf2008-07-26 23:55:2915
[email protected]46488322012-10-30 03:22:2016namespace content {
initial.commit09911bf2008-07-26 23:55:2917
Alex Moshchuk8e5c1952019-01-15 03:39:5018// Start the BrowsingInstance ID counter from 1 to avoid a conflict with the
19// invalid BrowsingInstanceId value, which is 0 in its underlying IdType32.
20int BrowsingInstance::next_browsing_instance_id_ = 1;
21
[email protected]46488322012-10-30 03:22:2022BrowsingInstance::BrowsingInstance(BrowserContext* browser_context)
[email protected]d5072a82014-05-15 05:50:1823 : browser_context_(browser_context),
Alex Moshchuk8e5c1952019-01-15 03:39:5024 isolation_context_(
25 BrowsingInstanceId::FromUnsafeValue(next_browsing_instance_id_++)),
Nate Chapin71da03c2019-02-05 01:21:4126 active_contents_count_(0u),
27 default_process_(nullptr) {
Lukasz Anforowicz4726a172018-10-15 21:25:1028 DCHECK(browser_context);
[email protected]dec76e802010-09-23 22:43:5329}
30
Nate Chapin71da03c2019-02-05 01:21:4131void BrowsingInstance::RenderProcessHostDestroyed(RenderProcessHost* host) {
32 DCHECK_EQ(default_process_, host);
33 // Only clear the default process if the RenderProcessHost object goes away,
34 // not if the renderer process goes away while the RenderProcessHost remains.
35 default_process_->RemoveObserver(this);
36 default_process_ = nullptr;
37}
38
39void BrowsingInstance::SetDefaultProcess(RenderProcessHost* default_process) {
40 DCHECK(!default_process_);
41 default_process_ = default_process;
42 default_process_->AddObserver(this);
43}
44
initial.commit09911bf2008-07-26 23:55:2945bool BrowsingInstance::HasSiteInstance(const GURL& url) {
Alex Moshchuk8e5c1952019-01-15 03:39:5046 std::string site =
47 SiteInstanceImpl::GetSiteForURL(browser_context_, isolation_context_, url)
48 .possibly_invalid_spec();
initial.commit09911bf2008-07-26 23:55:2949
[email protected]41fb79a52012-06-29 16:34:3350 return site_instance_map_.find(site) != site_instance_map_.end();
initial.commit09911bf2008-07-26 23:55:2951}
52
dchengbccd6b82016-03-30 16:24:1953scoped_refptr<SiteInstanceImpl> BrowsingInstance::GetSiteInstanceForURL(
54 const GURL& url) {
Alex Moshchuk8e5c1952019-01-15 03:39:5055 std::string site =
56 SiteInstanceImpl::GetSiteForURL(browser_context_, isolation_context_, url)
57 .possibly_invalid_spec();
initial.commit09911bf2008-07-26 23:55:2958
jdoerrie55ec69d2018-10-08 13:34:4659 auto i = site_instance_map_.find(site);
[email protected]41fb79a52012-06-29 16:34:3360 if (i != site_instance_map_.end())
initial.commit09911bf2008-07-26 23:55:2961 return i->second;
[email protected]41fb79a52012-06-29 16:34:3362
initial.commit09911bf2008-07-26 23:55:2963 // No current SiteInstance for this site, so let's create one.
dchengbccd6b82016-03-30 16:24:1964 scoped_refptr<SiteInstanceImpl> instance = new SiteInstanceImpl(this);
initial.commit09911bf2008-07-26 23:55:2965
66 // Set the site of this new SiteInstance, which will register it with us.
67 instance->SetSite(url);
68 return instance;
69}
70
dchengbccd6b82016-03-30 16:24:1971void BrowsingInstance::RegisterSiteInstance(SiteInstanceImpl* site_instance) {
72 DCHECK(site_instance->browsing_instance_.get() == this);
73 DCHECK(site_instance->HasSite());
nickd5bbd0b2016-03-31 19:52:4474
[email protected]77ab17312012-09-28 15:34:5975 std::string site = site_instance->GetSiteURL().possibly_invalid_spec();
initial.commit09911bf2008-07-26 23:55:2976
77 // Only register if we don't have a SiteInstance for this site already.
78 // It's possible to have two SiteInstances point to the same site if two
79 // tabs are navigated there at the same time. (We don't call SetSite or
80 // register them until DidNavigate.) If there is a previously existing
81 // SiteInstance for this site, we just won't register the new one.
jdoerrie55ec69d2018-10-08 13:34:4682 auto i = site_instance_map_.find(site);
[email protected]41fb79a52012-06-29 16:34:3383 if (i == site_instance_map_.end()) {
initial.commit09911bf2008-07-26 23:55:2984 // Not previously registered, so register it.
[email protected]41fb79a52012-06-29 16:34:3385 site_instance_map_[site] = site_instance;
initial.commit09911bf2008-07-26 23:55:2986 }
87}
88
dchengbccd6b82016-03-30 16:24:1989void BrowsingInstance::UnregisterSiteInstance(SiteInstanceImpl* site_instance) {
90 DCHECK(site_instance->browsing_instance_.get() == this);
91 DCHECK(site_instance->HasSite());
[email protected]77ab17312012-09-28 15:34:5992 std::string site = site_instance->GetSiteURL().possibly_invalid_spec();
initial.commit09911bf2008-07-26 23:55:2993
94 // Only unregister the SiteInstance if it is the same one that is registered
95 // for the site. (It might have been an unregistered SiteInstance. See the
96 // comments in RegisterSiteInstance.)
jdoerrie55ec69d2018-10-08 13:34:4697 auto i = site_instance_map_.find(site);
[email protected]41fb79a52012-06-29 16:34:3398 if (i != site_instance_map_.end() && i->second == site_instance) {
initial.commit09911bf2008-07-26 23:55:2999 // Matches, so erase it.
[email protected]41fb79a52012-06-29 16:34:33100 site_instance_map_.erase(i);
initial.commit09911bf2008-07-26 23:55:29101 }
initial.commit09911bf2008-07-26 23:55:29102}
[email protected]dec76e802010-09-23 22:43:53103
Alex Moshchuk8e5c1952019-01-15 03:39:50104// static
105BrowsingInstanceId BrowsingInstance::NextBrowsingInstanceId() {
106 return BrowsingInstanceId::FromUnsafeValue(next_browsing_instance_id_);
107}
108
[email protected]dec76e802010-09-23 22:43:53109BrowsingInstance::~BrowsingInstance() {
110 // We should only be deleted when all of the SiteInstances that refer to
111 // us are gone.
112 DCHECK(site_instance_map_.empty());
[email protected]d5072a82014-05-15 05:50:18113 DCHECK_EQ(0u, active_contents_count_);
Nate Chapin71da03c2019-02-05 01:21:41114 if (default_process_)
115 default_process_->RemoveObserver(this);
[email protected]dec76e802010-09-23 22:43:53116}
[email protected]46488322012-10-30 03:22:20117
118} // namespace content