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_RENDERER_HOST_RENDER_VIEW_HOST_FACTORY_H_
6#define CONTENT_BROWSER_RENDERER_HOST_RENDER_VIEW_HOST_FACTORY_H_
7
8#include "base/basictypes.h"
9#include "content/common/content_export.h"
10
11namespace content {
12class RenderFrameHostDelegate;
13class RenderViewHost;
14class RenderViewHostDelegate;
15class RenderWidgetHostDelegate;
16class SessionStorageNamespace;
17class SiteInstance;
18
19// A factory for creating RenderViewHosts. There is a global factory function
20// that can be installed for the purposes of testing to provide a specialized
21// RenderViewHost class.
22class RenderViewHostFactory {
23 public:
24  // Creates a RenderViewHost using the currently registered factory, or the
25  // default one if no factory is registered. Ownership of the returned
26  // pointer will be passed to the caller.
27  static RenderViewHost* Create(
28      SiteInstance* instance,
29      RenderViewHostDelegate* delegate,
30      RenderWidgetHostDelegate* widget_delegate,
31      int routing_id,
32      int main_frame_routing_id,
33      bool swapped_out,
34      bool hidden);
35
36  // Returns true if there is currently a globally-registered factory.
37  static bool has_factory() {
38    return !!factory_;
39  }
40
41 protected:
42  RenderViewHostFactory() {}
43  virtual ~RenderViewHostFactory() {}
44
45  // You can derive from this class and specify an implementation for this
46  // function to create a different kind of RenderViewHost for testing.
47  virtual RenderViewHost* CreateRenderViewHost(
48      SiteInstance* instance,
49      RenderViewHostDelegate* delegate,
50      RenderWidgetHostDelegate* widget_delegate,
51      int routing_id,
52      int main_frame_routing_id,
53      bool swapped_out) = 0;
54
55  // Registers your factory to be called when new RenderViewHosts are created.
56  // We have only one global factory, so there must be no factory registered
57  // before the call. This class does NOT take ownership of the pointer.
58  CONTENT_EXPORT static void RegisterFactory(RenderViewHostFactory* factory);
59
60  // Unregister the previously registered factory. With no factory registered,
61  // the default RenderViewHosts will be created.
62  CONTENT_EXPORT static void UnregisterFactory();
63
64 private:
65  // The current globally registered factory. This is NULL when we should
66  // create the default RenderViewHosts.
67  CONTENT_EXPORT static RenderViewHostFactory* factory_;
68
69  DISALLOW_COPY_AND_ASSIGN(RenderViewHostFactory);
70};
71
72}  // namespace content
73
74#endif  // CONTENT_BROWSER_RENDERER_HOST_RENDER_VIEW_HOST_FACTORY_H_
75