blob: b1e22c7fa8949eebcbd1043d37a625479d1e8b45 [file] [log] [blame]
// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_DOM_UI_DOM_UI_H_
#define CHROME_BROWSER_DOM_UI_DOM_UI_H_
#include <map>
#include <string>
#include <vector>
#include "base/callback.h"
#include "base/string16.h"
#include "chrome/common/page_transition_types.h"
class DictionaryValue;
class DOMMessageHandler;
class GURL;
class ListValue;
class Profile;
class RenderViewHost;
class Value;
class TabContents;
class ThemeProvider;
// A DOMUI sets up the datasources and message handlers for a given HTML-based
// UI. It is contained by a DOMUIManager.
class DOMUI {
public:
explicit DOMUI(TabContents* contents);
virtual ~DOMUI();
// Called by RenderViewHost when the RenderView is first created. This is
// *not* called for every page load because in some cases
// RenderViewHostManager will reuse RenderView instances. In those cases,
// RenderViewReused will be called instead.
virtual void RenderViewCreated(RenderViewHost* render_view_host) {}
// Called by RenderViewHostManager when a RenderView is reused to display a
// page.
virtual void RenderViewReused(RenderViewHost* render_view_host) {}
// Called from TabContents.
virtual void ProcessDOMUIMessage(const std::string& message,
const ListValue* content,
const GURL& source_url,
int request_id,
bool has_callback);
// Used by DOMMessageHandlers.
typedef Callback1<const Value*>::Type MessageCallback;
void RegisterMessageCallback(const std::string& message,
MessageCallback* callback);
// Returns true if the favicon should be hidden for the current tab.
bool hide_favicon() const {
return hide_favicon_;
}
// Returns true if the bookmark bar should be forced to being visible,
// overriding the user's preference.
bool force_bookmark_bar_visible() const {
return force_bookmark_bar_visible_;
}
// Returns true if the extension shelf should be forced to being visible
// (if it contains any items), overriding the user's preference.
bool force_extension_shelf_visible() const {
return force_extension_shelf_visible_;
}
// Returns true if the location bar should be focused by default rather than
// the page contents. Some pages will want to use this to encourage the user
// to type in the URL bar.
bool focus_location_bar_by_default() const {
return focus_location_bar_by_default_;
}
// Returns true if the page's URL should be hidden. Some DOM UI pages
// like the new tab page will want to hide it.
bool should_hide_url() const {
return should_hide_url_;
}
// Gets a custom tab title provided by the DOM UI. If there is no title
// override, the string will be empty which should trigger the default title
// behavior for the tab.
const string16& overridden_title() const {
return overridden_title_;
}
// Returns the transition type that should be used for link clicks on this
// DOM UI. This will default to LINK but may be overridden.
PageTransition::Type link_transition_type() const {
return link_transition_type_;
}
int bindings() const {
return bindings_;
}
// Call a Javascript function by sending its name and arguments down to
// the renderer. This is asynchronous; there's no way to get the result
// of the call, and should be thought of more like sending a message to
// the page.
// There are two function variants for one-arg and two-arg calls.
void CallJavascriptFunction(const std::wstring& function_name);
void CallJavascriptFunction(const std::wstring& function_name,
const Value& arg);
void CallJavascriptFunction(const std::wstring& function_name,
const Value& arg1,
const Value& arg2);
ThemeProvider* GetThemeProvider() const;
TabContents* tab_contents() const { return tab_contents_; }
Profile* GetProfile();
protected:
void AddMessageHandler(DOMMessageHandler* handler);
// Options that may be overridden by individual DOM UI implementations. The
// bool options default to false. See the public getters for more information.
bool hide_favicon_;
bool force_bookmark_bar_visible_;
bool force_extension_shelf_visible_;
bool focus_location_bar_by_default_;
bool should_hide_url_;
string16 overridden_title_; // Defaults to empty string.
PageTransition::Type link_transition_type_; // Defaults to LINK.
int bindings_; // The bindings from BindingsPolicy that should be enabled for
// this page.
private:
// Execute a string of raw Javascript on the page.
void ExecuteJavascript(const std::wstring& javascript);
// Non-owning pointer to the TabContents this DOMUI is associated with.
TabContents* tab_contents_;
// The DOMMessageHandlers we own.
std::vector<DOMMessageHandler*> handlers_;
// A map of message name -> message handling callback.
typedef std::map<std::string, MessageCallback*> MessageCallbackMap;
MessageCallbackMap message_callbacks_;
DISALLOW_COPY_AND_ASSIGN(DOMUI);
};
// Messages sent from the DOM are forwarded via the DOMUI to handler
// classes. These objects are owned by DOMUI and destroyed when the
// host is destroyed.
class DOMMessageHandler {
public:
DOMMessageHandler() : dom_ui_(NULL) {}
virtual ~DOMMessageHandler() {}
// Attaches |this| to |dom_ui| in order to handle messages from it. Declared
// virtual so that subclasses can do special init work as soon as the dom_ui
// is provided. Returns |this| for convenience.
virtual DOMMessageHandler* Attach(DOMUI* dom_ui);
protected:
// Adds "url" and "title" keys on incoming dictionary, setting title
// as the url as a fallback on empty title.
static void SetURLAndTitle(DictionaryValue* dictionary,
string16 title,
const GURL& gurl);
// This is where subclasses specify which messages they'd like to handle.
virtual void RegisterMessages() = 0;
// Extract an integer value from a Value.
bool ExtractIntegerValue(const Value* value, int* out_int);
// Extract a string value from a Value.
std::wstring ExtractStringValue(const Value* value);
DOMUI* dom_ui_;
private:
DISALLOW_COPY_AND_ASSIGN(DOMMessageHandler);
};
#endif // CHROME_BROWSER_DOM_UI_DOM_UI_H_