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)#ifndef CONTENT_BROWSER_BROWSING_INSTANCE_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CONTENT_BROWSER_BROWSING_INSTANCE_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 87d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/containers/hash_tables.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/lazy_instance.h" 10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/logging.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/content_export.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_context.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GURL; 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SiteInstance; 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SiteInstanceImpl; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// BrowsingInstance class 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A browsing instance corresponds to the notion of a "unit of related browsing 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// contexts" in the HTML 5 spec. Intuitively, it represents a collection of 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// tabs and frames that can have script connections to each other. In that 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// sense, it reflects the user interface, and not the contents of the tabs and 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// frames. 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We further subdivide a BrowsingInstance into SiteInstances, which represent 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the documents within each BrowsingInstance that are from the same site and 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// thus can have script access to each other. Different SiteInstances can 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// safely run in different processes, because their documents cannot access 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// each other's contents (due to the same origin policy). 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// It is important to only have one SiteInstance per site within a given 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// BrowsingInstance. This is because any two documents from the same site 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// might be able to script each other if they are in the same BrowsingInstance. 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Thus, they must be rendered in the same process. 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A BrowsingInstance is live as long as any SiteInstance has a reference to 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// it. A SiteInstance is live as long as any NavigationEntry or RenderViewHost 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// have references to it. Because both classes are RefCounted, they do not 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// need to be manually deleted. 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// BrowsingInstance has no public members, as it is designed to be 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// visible only from the SiteInstance class. To get a new 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SiteInstance that is part of the same BrowsingInstance, use 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SiteInstance::GetRelatedSiteInstance. Because of this, 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// BrowsingInstances and SiteInstances are tested together in 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// site_instance_unittest.cc. 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CONTENT_EXPORT BrowsingInstance 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public base::RefCounted<BrowsingInstance> { 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a new BrowsingInstance. 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit BrowsingInstance(BrowserContext* context); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get the browser context to which this BrowsingInstance belongs. 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserContext* browser_context() const { return browser_context_; } 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns whether this BrowsingInstance has registered a SiteInstance for 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the site of the given URL. 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool HasSiteInstance(const GURL& url); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get the SiteInstance responsible for rendering the given URL. Should 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // create a new one if necessary, but should not create more than one 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SiteInstance per site. 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstance* GetSiteInstanceForURL(const GURL& url); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adds the given SiteInstance to our map, to ensure that we do not create 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // another SiteInstance for the same site. 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RegisterSiteInstance(SiteInstance* site_instance); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Removes the given SiteInstance from our map, after all references to it 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // have been deleted. This means it is safe to create a new SiteInstance 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // if the user later visits a page from this site, within this 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BrowsingInstance. 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UnregisterSiteInstance(SiteInstance* site_instance); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Tracks the number of WebContents currently in this BrowsingInstance. 84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) size_t active_contents_count() const { return active_contents_count_; } 85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void increment_active_contents_count() { active_contents_count_++; } 86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void decrement_active_contents_count() { 87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK_LT(0u, active_contents_count_); 88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) active_contents_count_--; 89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class SiteInstanceImpl; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class SiteInstance; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class base::RefCounted<BrowsingInstance>; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Virtual to allow tests to extend it. 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~BrowsingInstance(); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Map of site to SiteInstance, to ensure we only have one SiteInstance per 101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // site. 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef base::hash_map<std::string, SiteInstance*> SiteInstanceMap; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Common browser context to which all SiteInstances in this BrowsingInstance 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // must belong. 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserContext* const browser_context_; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Map of site to SiteInstance, to ensure we only have one SiteInstance per 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // site. The site string should be the possibly_invalid_spec() of a GURL 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // obtained with SiteInstanceImpl::GetSiteForURL. Note that this map may not 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // contain every active SiteInstance, because a race exists where two 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SiteInstances can be assigned to the same site. This is ok in rare cases. 113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // It also does not contain SiteInstances which have not yet been assigned a 114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // site, such as about:blank. See NavigatorImpl::ShouldAssignSiteForURL. 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteInstanceMap site_instance_map_; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Number of WebContentses currently using this BrowsingInstance. 118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) size_t active_contents_count_; 119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(BrowsingInstance); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CONTENT_BROWSER_BROWSING_INSTANCE_H_ 126