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