// Copyright 2012 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CONTENT_BROWSER_BROWSING_INSTANCE_H_ #define CONTENT_BROWSER_BROWSING_INSTANCE_H_ #include <stddef.h> #include <optional> #include "base/check_op.h" #include "base/gtest_prod_util.h" #include "base/lazy_instance.h" #include "base/memory/raw_ptr.h" #include "base/memory/ref_counted.h" #include "content/browser/isolation_context.h" #include "content/browser/security/coop/coop_related_group.h" #include "content/browser/site_instance_group_manager.h" #include "content/browser/web_exposed_isolation_info.h" #include "content/common/content_export.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/render_process_host_observer.h" #include "content/public/browser/storage_partition_config.h" #include "url/origin.h" class GURL; namespace content { class SiteInfo; class SiteInstanceGroup; class SiteInstanceImpl; struct UrlInfo; /////////////////////////////////////////////////////////////////////////////// // // BrowsingInstance class // // A browsing instance corresponds to the notion of a "unit of related browsing // contexts" in the HTML 5 spec. Intuitively, it represents a collection of // tabs and frames that can have script connections to each other. In that // sense, it reflects the user interface, and not the contents of the tabs and // frames. // // We further subdivide a BrowsingInstance into SiteInstances, which represent // the documents within each BrowsingInstance that are from the same site and // thus can have script access to each other. Different SiteInstances can // safely run in different processes, because their documents cannot access // each other's contents (due to the same origin policy). // // It is important to only have one SiteInstance per site within a given // BrowsingInstance. This is because any two documents from the same site // might be able to script each other if they are in the same BrowsingInstance. // Thus, they must be rendered in the same process. // // A BrowsingInstance is live as long as any SiteInstance has a reference to // it, and thus as long as any SiteInstanceGroup within it exists. A // SiteInstance is live as long as any NavigationEntry or RenderFrameHost have // references to it. Because both classes are RefCounted, they do not need to // be manually deleted. // // BrowsingInstance has no public members, as it is designed to be // visible only from the SiteInstance and CoopRelatedGroup classes. To get a new // SiteInstance that is part of the same BrowsingInstance, use // SiteInstance::GetRelatedSiteInstance. Because of this, BrowsingInstances and // SiteInstances are tested together in site_instance_unittest.cc. // // Note that a browsing instance in the browser is independently tracked in // the renderer inside blink::Page::RelatedPages() method (in theory the browser // and renderer should always stay in sync). // /////////////////////////////////////////////////////////////////////////////// class CONTENT_EXPORT BrowsingInstance final : public base::RefCounted<BrowsingInstance> { … }; } // namespace content #endif // CONTENT_BROWSER_BROWSING_INSTANCE_H_