• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef CONTENT_BROWSER_SITE_INSTANCE_IMPL_H_
6 #define CONTENT_BROWSER_SITE_INSTANCE_IMPL_H_
7 
8 #include "content/browser/renderer_host/render_process_host_impl.h"
9 #include "content/common/content_export.h"
10 #include "content/public/browser/render_process_host_observer.h"
11 #include "content/public/browser/site_instance.h"
12 #include "url/gurl.h"
13 
14 namespace content {
15 class BrowsingInstance;
16 class RenderProcessHostFactory;
17 
18 class CONTENT_EXPORT SiteInstanceImpl : public SiteInstance,
19                                         public RenderProcessHostObserver {
20  public:
21   // SiteInstance interface overrides.
22   virtual int32 GetId() OVERRIDE;
23   virtual bool HasProcess() const OVERRIDE;
24   virtual RenderProcessHost* GetProcess() OVERRIDE;
25   virtual BrowserContext* GetBrowserContext() const OVERRIDE;
26   virtual const GURL& GetSiteURL() const OVERRIDE;
27   virtual SiteInstance* GetRelatedSiteInstance(const GURL& url) OVERRIDE;
28   virtual bool IsRelatedSiteInstance(const SiteInstance* instance) OVERRIDE;
29   virtual size_t GetRelatedActiveContentsCount() OVERRIDE;
30 
31   // Set the web site that this SiteInstance is rendering pages for.
32   // This includes the scheme and registered domain, but not the port.  If the
33   // URL does not have a valid registered domain, then the full hostname is
34   // stored.
35   void SetSite(const GURL& url);
36   bool HasSite() const;
37 
38   // Returns whether there is currently a related SiteInstance (registered with
39   // BrowsingInstance) for the site of the given url.  If so, we should try to
40   // avoid dedicating an unused SiteInstance to it (e.g., in a new tab).
41   bool HasRelatedSiteInstance(const GURL& url);
42 
43   // Returns whether this SiteInstance has a process that is the wrong type for
44   // the given URL.  If so, the browser should force a process swap when
45   // navigating to the URL.
46   bool HasWrongProcessForURL(const GURL& url);
47 
48   // Increase the number of active views in this SiteInstance. This is
49   // increased when a view is created, or a currently swapped out view
50   // is swapped in.
increment_active_view_count()51   void increment_active_view_count() { active_view_count_++; }
52 
53   // Decrease the number of active views in this SiteInstance. This is
54   // decreased when a view is destroyed, or a currently active view is
55   // swapped out.
decrement_active_view_count()56   void decrement_active_view_count() { active_view_count_--; }
57 
58   // Get the number of active views which belong to this
59   // SiteInstance. If there is no active view left in this
60   // SiteInstance, all view in this SiteInstance can be safely
61   // discarded to save memory.
active_view_count()62   size_t active_view_count() { return active_view_count_; }
63 
64   // Increase the number of active WebContentses using this SiteInstance. Note
65   // that, unlike active_view_count, this does not count pending RVHs.
66   void IncrementRelatedActiveContentsCount();
67 
68   // Decrease the number of active WebContentses using this SiteInstance. Note
69   // that, unlike active_view_count, this does not count pending RVHs.
70   void DecrementRelatedActiveContentsCount();
71 
72   // Sets the global factory used to create new RenderProcessHosts.  It may be
73   // NULL, in which case the default BrowserRenderProcessHost will be created
74   // (this is the behavior if you don't call this function).  The factory must
75   // be set back to NULL before it's destroyed; ownership is not transferred.
76   static void set_render_process_host_factory(
77       const RenderProcessHostFactory* rph_factory);
78 
79   // Get the effective URL for the given actual URL.  This allows the
80   // ContentBrowserClient to override the SiteInstance's site for certain URLs.
81   // For example, Chrome uses this to replace hosted app URLs with extension
82   // hosts.
83   // Only public so that we can make a consistent process swap decision in
84   // RenderFrameHostManager.
85   static GURL GetEffectiveURL(BrowserContext* browser_context,
86                               const GURL& url);
87 
88  protected:
89   friend class BrowsingInstance;
90   friend class SiteInstance;
91 
92   // Virtual to allow tests to extend it.
93   virtual ~SiteInstanceImpl();
94 
95   // Create a new SiteInstance.  Protected to give access to BrowsingInstance
96   // and tests; most callers should use Create or GetRelatedSiteInstance
97   // instead.
98   explicit SiteInstanceImpl(BrowsingInstance* browsing_instance);
99 
100  private:
101   // RenderProcessHostObserver implementation.
102   virtual void RenderProcessHostDestroyed(RenderProcessHost* host) OVERRIDE;
103 
104   // Used to restrict a process' origin access rights.
105   void LockToOrigin();
106 
107   // An object used to construct RenderProcessHosts.
108   static const RenderProcessHostFactory* g_render_process_host_factory_;
109 
110   // The next available SiteInstance ID.
111   static int32 next_site_instance_id_;
112 
113   // A unique ID for this SiteInstance.
114   int32 id_;
115 
116   // The number of active views under this SiteInstance.
117   size_t active_view_count_;
118 
119   // BrowsingInstance to which this SiteInstance belongs.
120   scoped_refptr<BrowsingInstance> browsing_instance_;
121 
122   // Current RenderProcessHost that is rendering pages for this SiteInstance.
123   // This pointer will only change once the RenderProcessHost is destructed.  It
124   // will still remain the same even if the process crashes, since in that
125   // scenario the RenderProcessHost remains the same.
126   RenderProcessHost* process_;
127 
128   // The web site that this SiteInstance is rendering pages for.
129   GURL site_;
130 
131   // Whether SetSite has been called.
132   bool has_site_;
133 
134   DISALLOW_COPY_AND_ASSIGN(SiteInstanceImpl);
135 };
136 
137 }  // namespace content
138 
139 #endif  // CONTENT_BROWSER_SITE_INSTANCE_IMPL_H_
140