web_ui.h revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
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_PUBLIC_BROWSER_WEB_UI_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CONTENT_PUBLIC_BROWSER_WEB_UI_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include <vector>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/strings/string16.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/content_export.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/page_transition_types.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GURL;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ListValue;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Value;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebContents;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebUIController;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebUIMessageHandler;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A WebUI sets up the datasources and message handlers for a given HTML-based
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// UI.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CONTENT_EXPORT WebUI {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // An opaque identifier used to identify a WebUI. This can only be compared to
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // kNoWebUI or other WebUI types. See GetWebUIType.
358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  typedef void* TypeID;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A special WebUI type that signifies that a given page would not use the
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Web UI system.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const TypeID kNoWebUI;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns JavaScript code that, when executed, calls the function specified
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // by |function_name| with the arguments specified in |arg_list|.
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static base::string16 GetJavascriptCall(
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& function_name,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::vector<const base::Value*>& arg_list);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~WebUI() {}
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual WebContents* GetWebContents() const = 0;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual WebUIController* GetController() const = 0;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetController(WebUIController* controller) = 0;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the device scale factor of the monitor that the renderer is on.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Whenever possible, WebUI should push resources with this scale factor to
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Javascript.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual float GetDeviceScaleFactor() const = 0;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets a custom tab title provided by the Web UI. If there is no title
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // override, the string will be empty which should trigger the default title
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // behavior for the tab.
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual const base::string16& GetOverriddenTitle() const = 0;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OverrideTitle(const base::string16& title) = 0;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the transition type that should be used for link clicks on this
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Web UI. This will default to LINK but may be overridden.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ui::PageTransition GetLinkTransitionType() const = 0;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetLinkTransitionType(ui::PageTransition type) = 0;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Allows a controller to override the BindingsPolicy that should be enabled
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // for this page.
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int GetBindings() const = 0;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetBindings(int bindings) = 0;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overrides which frame gets JavaScript messages; this is useful if this
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // WebUI is embedded in a page. If no override is set, the main frame will
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // receive the JavaScript messages.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OverrideJavaScriptFrame(const std::string& frame_name) = 0;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Takes ownership of |handler|, which will be destroyed when the WebUI is.
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void AddMessageHandler(WebUIMessageHandler* handler) = 0;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used by WebUIMessageHandlers. If the given message is already registered,
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the call has no effect unless |register_callback_overwrites_| is set to
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // true.
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef base::Callback<void(const base::ListValue*)> MessageCallback;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void RegisterMessageCallback(const std::string& message,
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       const MessageCallback& callback) = 0;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is only needed if an embedder overrides handling of a WebUIMessage and
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // then later wants to undo that, or to route it to a different WebUI object.
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ProcessWebUIMessage(const GURL& source_url,
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const std::string& message,
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const base::ListValue& args) = 0;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Call a Javascript function by sending its name and arguments down to
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the renderer.  This is asynchronous; there's no way to get the result
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // of the call, and should be thought of more like sending a message to
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the page.
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // All function names in WebUI must consist of only ASCII characters.
101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // There are variants for calls with more arguments.
102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void CallJavascriptFunction(const std::string& function_name) = 0;
103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void CallJavascriptFunction(const std::string& function_name,
104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                      const base::Value& arg) = 0;
105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void CallJavascriptFunction(const std::string& function_name,
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const base::Value& arg1,
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const base::Value& arg2) = 0;
108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void CallJavascriptFunction(const std::string& function_name,
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const base::Value& arg1,
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const base::Value& arg2,
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const base::Value& arg3) = 0;
112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void CallJavascriptFunction(const std::string& function_name,
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const base::Value& arg1,
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const base::Value& arg2,
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const base::Value& arg3,
116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                      const base::Value& arg4) = 0;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void CallJavascriptFunction(
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& function_name,
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::vector<const base::Value*>& args) = 0;
120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif  // CONTENT_PUBLIC_BROWSER_WEB_UI_H_
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)