blob: d3aa7c4a1df2aa575d14c501baa03f586e674084 [file] [log] [blame]
Avi Drissman4e1b7bc32022-09-15 14:03:501// Copyright 2021 The Chromium Authors
Sharon Yang0a9475e2021-10-25 21:58:332// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "content/browser/site_instance_group.h"
6
David Sanders6f0eeb02025-01-30 06:48:507#include "base/auto_reset.h"
David Sandersd4bf5eb2022-03-17 07:12:058#include "base/observer_list.h"
Sharon Yang2f3304a2022-05-13 02:24:259#include "content/browser/renderer_host/render_process_host_impl.h"
10#include "content/browser/site_instance_impl.h"
David Sanders2ee1f3502022-03-16 07:21:1911#include "content/public/browser/render_process_host.h"
Sharon Yanga2fe85e2022-02-09 21:38:2912
Sharon Yang0a9475e2021-10-25 21:58:3313namespace content {
14
15namespace {
16SiteInstanceGroupId::Generator site_instance_group_id_generator;
17} // namespace
18
Sharon Yang73883d32023-03-14 00:16:4519SiteInstanceGroup::SiteInstanceGroup(BrowsingInstance* browsing_instance,
Harkiran Bolaria5c5a97392022-03-10 14:18:5020 RenderProcessHost* process)
21 : id_(site_instance_group_id_generator.GenerateNextId()),
Sharon Yang73883d32023-03-14 00:16:4522 browsing_instance_(browsing_instance),
Sharon Yang2f3304a2022-05-13 02:24:2523 process_(process->GetSafeRef()),
24 agent_scheduling_group_(
25 AgentSchedulingGroupHost::GetOrCreate(*this, *process)
26 ->GetSafeRef()) {
27 process->AddObserver(this);
Sharon Yanga2fe85e2022-02-09 21:38:2928}
Sharon Yang0a9475e2021-10-25 21:58:3329
Sharon Yanga2fe85e2022-02-09 21:38:2930SiteInstanceGroup::~SiteInstanceGroup() {
Sharon Yang485c9582023-07-25 21:39:4631 // Make sure `this` is not getting destructed while observers are still being
32 // notified.
33 CHECK(!is_notifying_observers_);
Sharon Yanga2fe85e2022-02-09 21:38:2934 process_->RemoveObserver(this);
Sharon Yanga2fe85e2022-02-09 21:38:2935}
Sharon Yang0a9475e2021-10-25 21:58:3336
Sharon Yang80d37bb2022-03-10 02:32:1137SiteInstanceGroupId SiteInstanceGroup::GetId() const {
Sharon Yang0a9475e2021-10-25 21:58:3338 return id_;
39}
40
Dave Tapuska80fb72522022-03-18 21:34:2341base::SafeRef<SiteInstanceGroup> SiteInstanceGroup::GetSafeRef() {
42 return weak_ptr_factory_.GetSafeRef();
43}
44
Sharon Yang1a7a63702025-05-23 01:14:5545base::WeakPtr<SiteInstanceGroup> SiteInstanceGroup::GetWeakPtr() {
46 return weak_ptr_factory_.GetWeakPtr();
47}
48
Arthur Sonzogni734cfaf62023-03-20 15:06:1949base::WeakPtr<SiteInstanceGroup>
50SiteInstanceGroup::GetWeakPtrToAllowDangling() {
51 return weak_ptr_factory_.GetWeakPtr();
52}
53
Sharon Yanga2fe85e2022-02-09 21:38:2954void SiteInstanceGroup::AddObserver(Observer* observer) {
55 observers_.AddObserver(observer);
56}
57
58void SiteInstanceGroup::RemoveObserver(Observer* observer) {
59 observers_.RemoveObserver(observer);
60}
61
Sharon Yang2f3304a2022-05-13 02:24:2562void SiteInstanceGroup::AddSiteInstance(SiteInstanceImpl* site_instance) {
Sharon Yangd265b5f2023-07-12 18:10:1663 CHECK(site_instance);
64 CHECK(!site_instances_.contains(site_instance));
Sharon Yang73883d32023-03-14 00:16:4565 CHECK_EQ(browsing_instance_id(), site_instance->GetBrowsingInstanceId());
Sharon Yang2f3304a2022-05-13 02:24:2566 site_instances_.insert(site_instance);
67}
68
69void SiteInstanceGroup::RemoveSiteInstance(SiteInstanceImpl* site_instance) {
70 site_instances_.erase(site_instance);
71 if (site_instances_.empty())
72 process_->Cleanup();
73}
74
Sharon Yanga2fe85e2022-02-09 21:38:2975void SiteInstanceGroup::IncrementActiveFrameCount() {
76 active_frame_count_++;
77}
78
79void SiteInstanceGroup::DecrementActiveFrameCount() {
80 if (--active_frame_count_ == 0) {
Sharon Yang485c9582023-07-25 21:39:4681 base::AutoReset<bool> scope(&is_notifying_observers_, true);
Sharon Yang417a5df2024-04-23 17:57:1582 for (auto& observer : observers_) {
Sharon Yanga2fe85e2022-02-09 21:38:2983 observer.ActiveFrameCountIsZero(this);
Sharon Yang417a5df2024-04-23 17:57:1584 }
Sharon Yanga2fe85e2022-02-09 21:38:2985 }
86}
87
Sharon Yang417a5df2024-04-23 17:57:1588void SiteInstanceGroup::IncrementKeepAliveCount() {
89 keep_alive_count_++;
Alex Moshchukb7f08212024-09-11 22:57:3590 auto* rphi = static_cast<RenderProcessHostImpl*>(process());
91 if (!rphi->AreRefCountsDisabled()) {
92 rphi->IncrementNavigationStateKeepAliveCount();
93 }
Sharon Yang417a5df2024-04-23 17:57:1594}
95
96void SiteInstanceGroup::DecrementKeepAliveCount() {
97 if (--keep_alive_count_ == 0) {
98 base::AutoReset<bool> scope(&is_notifying_observers_, true);
99 for (auto& observer : observers_) {
100 observer.KeepAliveCountIsZero(this);
101 }
102 }
Alex Moshchukb7f08212024-09-11 22:57:35103 auto* rphi = static_cast<RenderProcessHostImpl*>(process());
104 if (!rphi->AreRefCountsDisabled()) {
105 rphi->DecrementNavigationStateKeepAliveCount();
106 }
Sharon Yang417a5df2024-04-23 17:57:15107}
108
Sharon Yangf67d1d72023-02-01 23:39:48109bool SiteInstanceGroup::IsRelatedSiteInstanceGroup(SiteInstanceGroup* group) {
110 return browsing_instance_id() == group->browsing_instance_id();
111}
112
Sharon Yanga2fe85e2022-02-09 21:38:29113void SiteInstanceGroup::RenderProcessHostDestroyed(RenderProcessHost* host) {
Emily Andrewsd15fd762024-12-10 20:41:54114 DCHECK_EQ(process_->GetDeprecatedID(), host->GetDeprecatedID());
Sharon Yanga2fe85e2022-02-09 21:38:29115 process_->RemoveObserver(this);
Sharon Yang2f3304a2022-05-13 02:24:25116
117 // Remove references to `this` from all SiteInstances in this group. That will
118 // cause `this` to be destructed, to enforce the invariant that a
119 // SiteInstanceGroup must have a RenderProcessHost.
Sharon Yange3efbf22023-07-11 17:06:47120 for (auto instance : site_instances_) {
Sharon Yang2f3304a2022-05-13 02:24:25121 instance->ResetSiteInstanceGroup();
Sharon Yange3efbf22023-07-11 17:06:47122 }
Sharon Yanga2fe85e2022-02-09 21:38:29123}
124
125void SiteInstanceGroup::RenderProcessExited(
126 RenderProcessHost* host,
127 const ChildProcessTerminationInfo& info) {
Sharon Yang0618f752023-08-11 00:04:52128 // Increment the refcount of `this` to keep it alive while iterating over the
129 // observer list. That will prevent `this` from getting deleted during
130 // iteration.
131 scoped_refptr<SiteInstanceGroup> self_refcount = base::WrapRefCounted(this);
132 base::AutoReset<bool> scope(&is_notifying_observers_, true);
Sharon Yanga2fe85e2022-02-09 21:38:29133 for (auto& observer : observers_)
134 observer.RenderProcessGone(this, info);
135}
136
Sharon Yang1f99c1f2023-11-28 00:20:37137const StoragePartitionConfig& SiteInstanceGroup::GetStoragePartitionConfig()
138 const {
139 return process()->GetStoragePartition()->GetConfig();
140}
141
Sharon Yang73883d32023-03-14 00:16:45142// static
143SiteInstanceGroup* SiteInstanceGroup::CreateForTesting(
144 BrowserContext* browser_context,
145 RenderProcessHost* process) {
146 return new SiteInstanceGroup(
147 new BrowsingInstance(browser_context,
148 WebExposedIsolationInfo::CreateNonIsolated(),
149 /*is_guest=*/false,
Jason Lin218737052023-11-21 08:11:39150 /*is_fenced=*/false,
Camille Lamyc9351922025-05-01 02:57:44151 /*is_fixed_storage_partition=*/false),
Sharon Yang73883d32023-03-14 00:16:45152 process);
153}
154
155// static
156SiteInstanceGroup* SiteInstanceGroup::CreateForTesting(
157 SiteInstanceGroup* group,
158 RenderProcessHost* process) {
159 return new SiteInstanceGroup(
160 group->browsing_instance_for_testing(), // IN-TEST
161 process);
162}
163
Sharon Yang80d37bb2022-03-10 02:32:11164void SiteInstanceGroup::WriteIntoTrace(
Alexander Timin074cd182022-03-23 18:11:22165 perfetto::TracedProto<TraceProto> proto) const {
Sharon Yang80d37bb2022-03-10 02:32:11166 proto->set_site_instance_group_id(GetId().value());
167 proto->set_active_frame_count(active_frame_count());
Alexander Timin074cd182022-03-23 18:11:22168 proto.Set(TraceProto::kProcess, process());
Sharon Yangefe52632022-03-08 23:06:06169}
170
Sharon Yang0a9475e2021-10-25 21:58:33171} // namespace content