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_WEBUI_WEB_UI_IMPL_H_
6#define CONTENT_BROWSER_WEBUI_WEB_UI_IMPL_H_
7
8#include <map>
9#include <set>
10
11#include "base/compiler_specific.h"
12#include "base/memory/scoped_vector.h"
13#include "base/memory/weak_ptr.h"
14#include "content/public/browser/web_ui.h"
15#include "ipc/ipc_listener.h"
16
17namespace content {
18class RenderFrameHost;
19class RenderViewHost;
20
21class CONTENT_EXPORT WebUIImpl : public WebUI,
22                                 public IPC::Listener,
23                                 public base::SupportsWeakPtr<WebUIImpl> {
24 public:
25  explicit WebUIImpl(WebContents* contents);
26  virtual ~WebUIImpl();
27
28  // Called by WebContentsImpl when the RenderView is first created. This is
29  // *not* called for every page load because in some cases
30  // RenderFrameHostManager will reuse RenderView instances.
31  void RenderViewCreated(RenderViewHost* render_view_host);
32
33  // WebUI implementation:
34  virtual WebContents* GetWebContents() const OVERRIDE;
35  virtual WebUIController* GetController() const OVERRIDE;
36  virtual void SetController(WebUIController* controller) OVERRIDE;
37  virtual float GetDeviceScaleFactor() const OVERRIDE;
38  virtual const base::string16& GetOverriddenTitle() const OVERRIDE;
39  virtual void OverrideTitle(const base::string16& title) OVERRIDE;
40  virtual ui::PageTransition GetLinkTransitionType() const OVERRIDE;
41  virtual void SetLinkTransitionType(ui::PageTransition type) OVERRIDE;
42  virtual int GetBindings() const OVERRIDE;
43  virtual void SetBindings(int bindings) OVERRIDE;
44  virtual void OverrideJavaScriptFrame(const std::string& frame_name) OVERRIDE;
45  virtual void AddMessageHandler(WebUIMessageHandler* handler) OVERRIDE;
46  typedef base::Callback<void(const base::ListValue*)> MessageCallback;
47  virtual void RegisterMessageCallback(
48      const std::string& message,
49      const MessageCallback& callback) OVERRIDE;
50  virtual void ProcessWebUIMessage(const GURL& source_url,
51                                   const std::string& message,
52                                   const base::ListValue& args) OVERRIDE;
53  virtual void CallJavascriptFunction(
54      const std::string& function_name) OVERRIDE;
55  virtual void CallJavascriptFunction(const std::string& function_name,
56                                      const base::Value& arg) OVERRIDE;
57  virtual void CallJavascriptFunction(const std::string& function_name,
58                                      const base::Value& arg1,
59                                      const base::Value& arg2) OVERRIDE;
60  virtual void CallJavascriptFunction(const std::string& function_name,
61                                      const base::Value& arg1,
62                                      const base::Value& arg2,
63                                      const base::Value& arg3) OVERRIDE;
64  virtual void CallJavascriptFunction(const std::string& function_name,
65                                      const base::Value& arg1,
66                                      const base::Value& arg2,
67                                      const base::Value& arg3,
68                                      const base::Value& arg4) OVERRIDE;
69  virtual void CallJavascriptFunction(
70      const std::string& function_name,
71      const std::vector<const base::Value*>& args) OVERRIDE;
72
73  // IPC::Listener implementation:
74  virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
75
76 private:
77  // IPC message handling.
78  void OnWebUISend(const GURL& source_url,
79                   const std::string& message,
80                   const base::ListValue& args);
81
82  // Execute a string of raw JavaScript on the page.
83  void ExecuteJavascript(const base::string16& javascript);
84
85  // Finds the frame in which to execute JavaScript (the one specified by
86  // OverrideJavaScriptFrame). May return NULL if no frame of the specified name
87  // exists in the page.
88  RenderFrameHost* TargetFrame();
89
90  // A helper function for TargetFrame; adds a frame to the specified set if its
91  // name matches frame_name_.
92  void AddToSetIfFrameNameMatches(std::set<RenderFrameHost*>* frame_set,
93                                  RenderFrameHost* host);
94
95  // A map of message name -> message handling callback.
96  typedef std::map<std::string, MessageCallback> MessageCallbackMap;
97  MessageCallbackMap message_callbacks_;
98
99  // Options that may be overridden by individual Web UI implementations. The
100  // bool options default to false. See the public getters for more information.
101  base::string16 overridden_title_;  // Defaults to empty string.
102  ui::PageTransition link_transition_type_;  // Defaults to LINK.
103  int bindings_;  // The bindings from BindingsPolicy that should be enabled for
104                  // this page.
105
106  // The WebUIMessageHandlers we own.
107  ScopedVector<WebUIMessageHandler> handlers_;
108
109  // Non-owning pointer to the WebContents this WebUI is associated with.
110  WebContents* web_contents_;
111
112  // The name of the iframe this WebUI is embedded in (empty if not explicitly
113  // overridden with OverrideJavaScriptFrame).
114  std::string frame_name_;
115
116  scoped_ptr<WebUIController> controller_;
117
118  DISALLOW_COPY_AND_ASSIGN(WebUIImpl);
119};
120
121}  // namespace content
122
123#endif  // CONTENT_BROWSER_WEBUI_WEB_UI_IMPL_H_
124