web_ui.h revision 5821806d5e7f356e8fa4b058a389a808ea183019
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)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (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/string16.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/content_export.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/page_transition_types.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/layout.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GURL;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ListValue;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Value;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebContents;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebUIController;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebUIMessageHandler;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A WebUI sets up the datasources and message handlers for a given HTML-based
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// UI.
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CONTENT_EXPORT WebUI {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // An opaque identifier used to identify a WebUI. This can only be compared to
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // kNoWebUI or other WebUI types. See GetWebUIType.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef void* TypeID;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A special WebUI type that signifies that a given page would not use the
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Web UI system.
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const TypeID kNoWebUI;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns JavaScript code that, when executed, calls the function specified
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // by |function_name| with the arguments specified in |arg_list|.
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static string16 GetJavascriptCall(
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& function_name,
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::vector<const base::Value*>& arg_list);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~WebUI() {}
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual WebContents* GetWebContents() const = 0;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual WebUIController* GetController() const = 0;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetController(WebUIController* controller) = 0;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the device scale factor of the monitor that the renderer is on.
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Whenever possible, WebUI should push resources with this scale factor to
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Javascript.
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ui::ScaleFactor GetDeviceScaleFactor() const = 0;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the favicon should be hidden for the current tab.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool ShouldHideFavicon() const = 0;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void HideFavicon() = 0;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the location bar should be focused by default rather than
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the page contents. Some pages will want to use this to encourage the user
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to type in the URL bar.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool ShouldFocusLocationBarByDefault() const = 0;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void FocusLocationBarByDefault() = 0;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the page's URL should be hidden. Some Web UI pages
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // like the new tab page will want to hide it.
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool ShouldHideURL() const = 0;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void HideURL() = 0;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets a custom tab title provided by the Web UI. If there is no title
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // override, the string will be empty which should trigger the default title
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // behavior for the tab.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual const string16& GetOverriddenTitle() const = 0;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OverrideTitle(const string16& title) = 0;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the transition type that should be used for link clicks on this
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Web UI. This will default to LINK but may be overridden.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual PageTransition GetLinkTransitionType() const = 0;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetLinkTransitionType(PageTransition type) = 0;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Allows a controller to override the BindingsPolicy that should be enabled
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // for this page.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int GetBindings() const = 0;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetBindings(int bindings) = 0;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the path for the iframe if this WebUI is embedded in a page.
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetFrameXPath(const std::string& xpath) = 0;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Takes ownership of |handler|, which will be destroyed when the WebUI is.
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void AddMessageHandler(WebUIMessageHandler* handler) = 0;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used by WebUIMessageHandlers. If the given message is already registered,
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the call has no effect unless |register_callback_overwrites_| is set to
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // true.
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef base::Callback<void(const base::ListValue*)> MessageCallback;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void RegisterMessageCallback(const std::string& message,
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       const MessageCallback& callback) = 0;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is only needed if an embedder overrides handling of a WebUIMessage and
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // then later wants to undo that, or to route it to a different WebUI object.
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ProcessWebUIMessage(const GURL& source_url,
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const std::string& message,
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const base::ListValue& args) = 0;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Call a Javascript function by sending its name and arguments down to
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the renderer.  This is asynchronous; there's no way to get the result
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // of the call, and should be thought of more like sending a message to
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the page.
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // All function names in WebUI must consist of only ASCII characters.
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There are variants for calls with more arguments.
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void CallJavascriptFunction(const std::string& function_name) = 0;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void CallJavascriptFunction(const std::string& function_name,
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const base::Value& arg) = 0;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void CallJavascriptFunction(const std::string& function_name,
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const base::Value& arg1,
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const base::Value& arg2) = 0;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void CallJavascriptFunction(const std::string& function_name,
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const base::Value& arg1,
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const base::Value& arg2,
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const base::Value& arg3) = 0;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void CallJavascriptFunction(const std::string& function_name,
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const base::Value& arg1,
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const base::Value& arg2,
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const base::Value& arg3,
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const base::Value& arg4) = 0;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void CallJavascriptFunction(
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& function_name,
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::vector<const base::Value*>& args) = 0;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CONTENT_PUBLIC_BROWSER_WEB_UI_H_
139