// Copyright (c) 2012 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 CONTENT_PUBLIC_BROWSER_RENDER_VIEW_HOST_H_
#define CONTENT_PUBLIC_BROWSER_RENDER_VIEW_HOST_H_
#include <list>
#include "base/callback_forward.h"
#include "content/common/content_export.h"
#include "content/public/browser/render_widget_host.h"
#include "content/public/common/file_chooser_params.h"
#include "content/public/common/page_zoom.h"
#include "content/public/common/stop_find_action.h"
#include "third_party/WebKit/public/web/WebDragOperation.h"
class GURL;
struct WebPreferences;
namespace gfx {
class Point;
}
namespace base {
class FilePath;
class Value;
}
namespace media {
class AudioOutputController;
}
namespace ui {
struct SelectedFileInfo;
}
namespace blink {
struct WebFindOptions;
struct WebMediaPlayerAction;
struct WebPluginAction;
}
namespace content {
class ChildProcessSecurityPolicy;
class RenderProcessHost;
class RenderViewHostDelegate;
class SessionStorageNamespace;
class SiteInstance;
struct CustomContextMenuContext;
struct DropData;
// A RenderViewHost is responsible for creating and talking to a RenderView
// object in a child process. It exposes a high level API to users, for things
// like loading pages, adjusting the display and other browser functionality,
// which it translates into IPC messages sent over the IPC channel with the
// RenderView. It responds to all IPC messages sent by that RenderView and
// cracks them, calling a delegate object back with higher level types where
// possible.
//
// The intent of this interface is to provide a view-agnostic communication
// conduit with a renderer. This is so we can build HTML views not only as
// WebContents (see WebContents for an example) but also as views, etc.
class CONTENT_EXPORT RenderViewHost : virtual public RenderWidgetHost {
public:
// Returns the RenderViewHost given its ID and the ID of its render process.
// Returns NULL if the IDs do not correspond to a live RenderViewHost.
static RenderViewHost* FromID(int render_process_id, int render_view_id);
// Downcasts from a RenderWidgetHost to a RenderViewHost. Required
// because RenderWidgetHost is a virtual base class.
static RenderViewHost* From(RenderWidgetHost* rwh);
// Checks that the given renderer can request |url|, if not it sets it to
// about:blank.
// |empty_allowed| must be set to false for navigations for security reasons.
static void FilterURL(const RenderProcessHost* process,
bool empty_allowed,
GURL* url);
virtual ~RenderViewHost() {}
// Tell the render view to enable a set of javascript bindings. The argument
// should be a combination of values from BindingsPolicy.
virtual void AllowBindings(int binding_flags) = 0;
// Tells the renderer to clear the focused node (if any).
virtual void ClearFocusedNode() = 0;
// Causes the renderer to close the current page, including running its
// onunload event handler. A ClosePage_ACK message will be sent to the
// ResourceDispatcherHost when it is finished.
virtual void ClosePage() = 0;
// Copies the image at location x, y to the clipboard (if there indeed is an
// image at that location).
virtual void CopyImageAt(int x, int y) = 0;
// Notifies the renderer about the result of a desktop notification.
virtual void DesktopNotificationPermissionRequestDone(
int callback_context) = 0;
virtual void DesktopNotificationPostDisplay(int callback_context) = 0;
virtual void DesktopNotificationPostError(int notification_id,
const base::string16& message) = 0;
virtual void DesktopNotificationPostClose(int notification_id,
bool by_user) = 0;
virtual void DesktopNotificationPostClick(int notification_id) = 0;
// Notifies the listener that a directory enumeration is complete.
virtual void DirectoryEnumerationFinished(
int request_id,
const std::vector<base::FilePath>& files) = 0;
// Tells the renderer not to add scrollbars with height and width below a
// threshold.
virtual void DisableScrollbarsForThreshold(const gfx::Size& size) = 0;
// Notifies the renderer that a a drag operation that it started has ended,
// either in a drop or by being cancelled.
virtual void DragSourceEndedAt(
int client_x, int client_y, int screen_x, int screen_y,
blink::WebDragOperation operation) = 0;
// Notifies the renderer that a drag and drop operation is in progress, with
// droppable items positioned over the renderer's view.
virtual void DragSourceMovedTo(
int client_x, int client_y, int screen_x, int screen_y) = 0;
// Notifies the renderer that we're done with the drag and drop operation.
// This allows the renderer to reset some state.
virtual void DragSourceSystemDragEnded() = 0;
// D&d drop target messages that get sent to WebKit.
virtual void DragTargetDragEnter(
const DropData& drop_data,
const gfx::Point& client_pt,
const gfx::Point& screen_pt,
blink::WebDragOperationsMask operations_allowed,
int key_modifiers) = 0;
virtual void DragTargetDragOver(
const gfx::Point& client_pt,
const gfx::Point& screen_pt,
blink::WebDragOperationsMask operations_allowed,
int key_modifiers) = 0;
virtual void DragTargetDragLeave() = 0;
virtual void DragTargetDrop(const gfx::Point& client_pt,
const gfx::Point& screen_pt,
int key_modifiers) = 0;
// Instructs the RenderView to automatically resize and send back updates
// for the new size.
virtual void EnableAutoResize(const gfx::Size& min_size,
const gfx::Size& max_size) = 0;
// Turns off auto-resize and gives a new size that the view should be.
virtual void DisableAutoResize(const gfx::Size& new_size) = 0;
// Instructs the RenderView to send back updates to the preferred size.
virtual void EnablePreferredSizeMode() = 0;
// Executes custom context menu action that was provided from WebKit.
virtual void ExecuteCustomContextMenuCommand(
int action, const CustomContextMenuContext& context) = 0;
// Tells the renderer to perform the given action on the media player
// located at the given point.
virtual void ExecuteMediaPlayerActionAtLocation(
const gfx::Point& location,
const blink::WebMediaPlayerAction& action) = 0;
// Runs some javascript within the context of a frame in the page.
virtual void ExecuteJavascriptInWebFrame(const base::string16& frame_xpath,
const base::string16& jscript) = 0;
// Runs some javascript within the context of a frame in the page. The result
// is sent back via the provided callback.
typedef base::Callback<void(const base::Value*)> JavascriptResultCallback;
virtual void ExecuteJavascriptInWebFrameCallbackResult(
const base::string16& frame_xpath,
const base::string16& jscript,
const JavascriptResultCallback& callback) = 0;
// Tells the renderer to perform the given action on the plugin located at
// the given point.
virtual void ExecutePluginActionAtLocation(
const gfx::Point& location, const blink::WebPluginAction& action) = 0;
// Asks the renderer to exit fullscreen
virtual void ExitFullscreen() = 0;
// Finds text on a page.
virtual void Find(int request_id, const base::string16& search_text,
const blink::WebFindOptions& options) = 0;
// Notifies the renderer that the user has closed the FindInPage window
// (and what action to take regarding the selection).
virtual void StopFinding(StopFindAction action) = 0;
// Causes the renderer to invoke the onbeforeunload event handler. The
// result will be returned via ViewMsg_ShouldClose. See also ClosePage and
// SwapOut, which fire the PageUnload event.
//
// Set bool for_cross_site_transition when this close is just for the current
// RenderView in the case of a cross-site transition. False means we're
// closing the entire tab.
virtual void FirePageBeforeUnload(bool for_cross_site_transition) = 0;
// Notifies the Listener that one or more files have been chosen by the user
// from a file chooser dialog for the form. |permissions| is the file
// selection mode in which the chooser dialog was created.
virtual void FilesSelectedInChooser(
const std::vector<ui::SelectedFileInfo>& files,
FileChooserParams::Mode permissions) = 0;
virtual RenderViewHostDelegate* GetDelegate() const = 0;
// Returns a bitwise OR of bindings types that have been enabled for this
// RenderView. See BindingsPolicy for details.
virtual int GetEnabledBindings() const = 0;
virtual SiteInstance* GetSiteInstance() const = 0;
// Requests the renderer to evaluate an xpath to a frame and insert css
// into that frame's document.
virtual void InsertCSS(const base::string16& frame_xpath,
const std::string& css) = 0;
// Returns true if the RenderView is active and has not crashed. Virtual
// because it is overridden by TestRenderViewHost.
virtual bool IsRenderViewLive() const = 0;
// Returns true if the RenderView is responsible for displaying a subframe
// in a different process from its parent page.
virtual bool IsSubframe() const = 0;
// Let the renderer know that the menu has been closed.
virtual void NotifyContextMenuClosed(
const CustomContextMenuContext& context) = 0;
// Notification that a move or resize renderer's containing window has
// started.
virtual void NotifyMoveOrResizeStarted() = 0;
// Reloads the current focused frame.
virtual void ReloadFrame() = 0;
// Sets the alternate error page URL (link doctor) for the renderer process.
virtual void SetAltErrorPageURL(const GURL& url) = 0;
// Sets a property with the given name and value on the Web UI binding object.
// Must call AllowWebUIBindings() on this renderer first.
virtual void SetWebUIProperty(const std::string& name,
const std::string& value) = 0;
// Changes the zoom level for the current main frame.
virtual void Zoom(PageZoom zoom) = 0;
// Send the renderer process the current preferences supplied by the
// RenderViewHostDelegate.
virtual void SyncRendererPrefs() = 0;
virtual void ToggleSpeechInput() = 0;
// Returns the current WebKit preferences.
virtual WebPreferences GetWebkitPreferences() = 0;
// Passes a list of Webkit preferences to the renderer.
virtual void UpdateWebkitPreferences(const WebPreferences& prefs) = 0;
// Informs the renderer process of a change in timezone.
virtual void NotifyTimezoneChange() = 0;
// Retrieves the list of AudioOutputController objects associated
// with this object and passes it to the callback you specify, on
// the same thread on which you called the method.
typedef std::list<scoped_refptr<media::AudioOutputController> >
AudioOutputControllerList;
typedef base::Callback<void(const AudioOutputControllerList&)>
GetAudioOutputControllersCallback;
virtual void GetAudioOutputControllers(
const GetAudioOutputControllersCallback& callback) const = 0;
#if defined(OS_ANDROID)
// Selects and zooms to the find result nearest to the point (x,y)
// defined in find-in-page coordinates.
virtual void ActivateNearestFindResult(int request_id, float x, float y) = 0;
// Asks the renderer to send the rects of the current find matches.
virtual void RequestFindMatchRects(int current_version) = 0;
// Disables fullscreen media playback for encrypted video.
virtual void DisableFullscreenEncryptedMediaPlayback() = 0;
#endif
private:
// This interface should only be implemented inside content.
friend class RenderViewHostImpl;
RenderViewHost() {}
};
} // namespace content
#endif // CONTENT_PUBLIC_BROWSER_RENDER_VIEW_HOST_H_