web_ui.h revision cedac228d2dd51db4b79ea1e72c7f249408ee061
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)
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.
355821806d5e7f356e8fa4b058a389a808ea183019Torne (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|.
43a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (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)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (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.
57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (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.
62a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual const base::string16& GetOverriddenTitle() const = 0;
63a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (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 PageTransition GetLinkTransitionType() const = 0;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetLinkTransitionType(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)
75effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Overrides which frame gets JavaScript messages; this is useful if this
76effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // WebUI is embedded in a page. If no override is set, the main frame will
77effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // receive the JavaScript messages.
78effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  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.
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There are variants for calls with more arguments.
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void CallJavascriptFunction(const std::string& function_name) = 0;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void CallJavascriptFunction(const std::string& function_name,
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const base::Value& arg) = 0;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (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;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (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;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (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,
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (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;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CONTENT_PUBLIC_BROWSER_WEB_UI_H_
125