web_ui.h revision a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7
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"
127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/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|.
44a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  static base::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)  // Gets a custom tab title provided by the Web UI. If there is no title
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // override, the string will be empty which should trigger the default title
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // behavior for the tab.
63a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual const base::string16& GetOverriddenTitle() const = 0;
64a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void OverrideTitle(const base::string16& title) = 0;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the transition type that should be used for link clicks on this
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Web UI. This will default to LINK but may be overridden.
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual PageTransition GetLinkTransitionType() const = 0;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetLinkTransitionType(PageTransition type) = 0;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Allows a controller to override the BindingsPolicy that should be enabled
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // for this page.
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int GetBindings() const = 0;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetBindings(int bindings) = 0;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the path for the iframe if this WebUI is embedded in a page.
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetFrameXPath(const std::string& xpath) = 0;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Takes ownership of |handler|, which will be destroyed when the WebUI is.
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void AddMessageHandler(WebUIMessageHandler* handler) = 0;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used by WebUIMessageHandlers. If the given message is already registered,
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the call has no effect unless |register_callback_overwrites_| is set to
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // true.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef base::Callback<void(const base::ListValue*)> MessageCallback;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void RegisterMessageCallback(const std::string& message,
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       const MessageCallback& callback) = 0;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is only needed if an embedder overrides handling of a WebUIMessage and
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // then later wants to undo that, or to route it to a different WebUI object.
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ProcessWebUIMessage(const GURL& source_url,
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const std::string& message,
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const base::ListValue& args) = 0;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Call a Javascript function by sending its name and arguments down to
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the renderer.  This is asynchronous; there's no way to get the result
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // of the call, and should be thought of more like sending a message to
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the page.
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // All function names in WebUI must consist of only ASCII characters.
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There are variants for calls with more arguments.
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void CallJavascriptFunction(const std::string& function_name) = 0;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void CallJavascriptFunction(const std::string& function_name,
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const base::Value& arg) = 0;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void CallJavascriptFunction(const std::string& function_name,
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const base::Value& arg1,
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const base::Value& arg2) = 0;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void CallJavascriptFunction(const std::string& function_name,
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const base::Value& arg1,
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const base::Value& arg2,
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const base::Value& arg3) = 0;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void CallJavascriptFunction(const std::string& function_name,
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const base::Value& arg1,
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const base::Value& arg2,
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const base::Value& arg3,
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const base::Value& arg4) = 0;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void CallJavascriptFunction(
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& function_name,
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::vector<const base::Value*>& args) = 0;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CONTENT_PUBLIC_BROWSER_WEB_UI_H_
124