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
14namespace content {
15class BrowsingInstance;
16class RenderProcessHostFactory;
17
18class 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.
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.
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.
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