blob: e4c5f4614318a75a99442be589639bdd6030517e [file] [log] [blame]
// Copyright (c) 2011 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_BROWSER_RENDERER_HOST_RENDER_VIEW_HOST_DELEGATE_H_
#define CONTENT_BROWSER_RENDERER_HOST_RENDER_VIEW_HOST_DELEGATE_H_
#pragma once
#include <string>
#include <vector>
#include "base/basictypes.h"
#include "base/process_util.h"
#include "base/ref_counted.h"
#include "base/string16.h"
#include "chrome/common/content_settings_types.h"
#include "chrome/common/dom_storage_common.h"
#include "chrome/common/translate_errors.h"
#include "chrome/common/view_types.h"
#include "chrome/common/window_container_type.h"
#include "ipc/ipc_channel.h"
#include "net/base/load_states.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebDragOperation.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebPopupType.h"
#include "webkit/glue/window_open_disposition.h"
class AutomationResourceRoutingDelegate;
class BackgroundContents;
struct BookmarkNodeData;
class BookmarkNode;
struct ContextMenuParams;
class FilePath;
class GURL;
class ListValue;
struct NativeWebKeyboardEvent;
class NavigationEntry;
class Profile;
struct RendererPreferences;
class RenderProcessHost;
class RenderViewHost;
class ResourceRedirectDetails;
class ResourceRequestDetails;
class SkBitmap;
class SSLClientAuthHandler;
class SSLAddCertHandler;
class TabContents;
struct ThumbnailScore;
struct ViewHostMsg_CreateWindow_Params;
struct ViewHostMsg_DomMessage_Params;
struct ViewHostMsg_FrameNavigate_Params;
struct WebApplicationInfo;
struct WebDropData;
struct WebMenuItem;
class WebKeyboardEvent;
struct WebPreferences;
namespace base {
class WaitableEvent;
}
namespace gfx {
class Point;
class Rect;
class Size;
}
namespace IPC {
class Message;
}
namespace net {
class CookieList;
class CookieOptions;
}
namespace webkit_glue {
struct FormData;
class FormField;
struct PasswordForm;
}
//
// RenderViewHostDelegate
//
// An interface implemented by an object interested in knowing about the state
// of the RenderViewHost.
//
// This interface currently encompasses every type of message that was
// previously being sent by TabContents itself. Some of these notifications
// may not be relevant to all users of RenderViewHost and we should consider
// exposing a more generic Send function on RenderViewHost and a response
// listener here to serve that need.
//
class RenderViewHostDelegate : public IPC::Channel::Listener {
public:
// View ----------------------------------------------------------------------
// Functions that can be routed directly to a view-specific class.
class View {
public:
// The page is trying to open a new page (e.g. a popup window). The window
// should be created associated with the given route, but it should not be
// shown yet. That should happen in response to ShowCreatedWindow.
// |params.window_container_type| describes the type of RenderViewHost
// container that is requested -- in particular, the window.open call may
// have specified 'background' and 'persistent' in the feature string.
//
// The passed |params.frame_name| parameter is the name parameter that was
// passed to window.open(), and will be empty if none was passed.
//
// Note: this is not called "CreateWindow" because that will clash with
// the Windows function which is actually a #define.
//
// NOTE: this takes ownership of @modal_dialog_event
virtual void CreateNewWindow(
int route_id,
const ViewHostMsg_CreateWindow_Params& params) = 0;
// The page is trying to open a new widget (e.g. a select popup). The
// widget should be created associated with the given route, but it should
// not be shown yet. That should happen in response to ShowCreatedWidget.
// |popup_type| indicates if the widget is a popup and what kind of popup it
// is (select, autofill...).
virtual void CreateNewWidget(int route_id,
WebKit::WebPopupType popup_type) = 0;
// Creates a full screen RenderWidget. Similar to above.
virtual void CreateNewFullscreenWidget(int route_id) = 0;
// Show a previously created page with the specified disposition and bounds.
// The window is identified by the route_id passed to CreateNewWindow.
//
// Note: this is not called "ShowWindow" because that will clash with
// the Windows function which is actually a #define.
virtual void ShowCreatedWindow(int route_id,
WindowOpenDisposition disposition,
const gfx::Rect& initial_pos,
bool user_gesture) = 0;
// Show the newly created widget with the specified bounds.
// The widget is identified by the route_id passed to CreateNewWidget.
virtual void ShowCreatedWidget(int route_id,
const gfx::Rect& initial_pos) = 0;
// Show the newly created full screen widget. Similar to above.
virtual void ShowCreatedFullscreenWidget(int route_id) = 0;
// A context menu should be shown, to be built using the context information
// provided in the supplied params.
virtual void ShowContextMenu(const ContextMenuParams& params) = 0;
// Shows a popup menu with the specified items.
// This method should call RenderViewHost::DidSelectPopupMenuItemAt() or
// RenderViewHost::DidCancelPopupMenu() ased on the user action.
virtual void ShowPopupMenu(const gfx::Rect& bounds,
int item_height,
double item_font_size,
int selected_item,
const std::vector<WebMenuItem>& items,
bool right_aligned) = 0;
// The user started dragging content of the specified type within the
// RenderView. Contextual information about the dragged content is supplied
// by WebDropData.
virtual void StartDragging(const WebDropData& drop_data,
WebKit::WebDragOperationsMask allowed_ops,
const SkBitmap& image,
const gfx::Point& image_offset) = 0;
// The page wants to update the mouse cursor during a drag & drop operation.
// |operation| describes the current operation (none, move, copy, link.)
virtual void UpdateDragCursor(WebKit::WebDragOperation operation) = 0;
// Notification that view for this delegate got the focus.
virtual void GotFocus() = 0;
// Callback to inform the browser that the page is returning the focus to
// the browser's chrome. If reverse is true, it means the focus was
// retrieved by doing a Shift-Tab.
virtual void TakeFocus(bool reverse) = 0;
// Notification that the view has lost capture.
virtual void LostCapture() = 0;
// The page wants the hosting window to activate/deactivate itself (it
// called the JavaScript window.focus()/blur() method).
virtual void Activate() = 0;
virtual void Deactivate() = 0;
// Callback to give the browser a chance to handle the specified keyboard
// event before sending it to the renderer.
// Returns true if the |event| was handled. Otherwise, if the |event| would
// be handled in HandleKeyboardEvent() method as a normal keyboard shortcut,
// |*is_keyboard_shortcut| should be set to true.
virtual bool PreHandleKeyboardEvent(const NativeWebKeyboardEvent& event,
bool* is_keyboard_shortcut) = 0;
// Callback to inform the browser that the renderer did not process the
// specified events. This gives an opportunity to the browser to process the
// event (used for keyboard shortcuts).
virtual void HandleKeyboardEvent(const NativeWebKeyboardEvent& event) = 0;
// Notifications about mouse events in this view. This is useful for
// implementing global 'on hover' features external to the view.
virtual void HandleMouseMove() = 0;
virtual void HandleMouseDown() = 0;
virtual void HandleMouseLeave() = 0;
virtual void HandleMouseUp() = 0;
virtual void HandleMouseActivate() = 0;
// The contents' preferred size changed.
virtual void UpdatePreferredSize(const gfx::Size& pref_size) = 0;
protected:
virtual ~View() {}
};
// RendererManagerment -------------------------------------------------------
// Functions for managing switching of Renderers. For TabContents, this is
// implemented by the RenderViewHostManager
class RendererManagement {
public:
// Notification whether we should close the page, after an explicit call to
// AttemptToClosePage. This is called before a cross-site request or before
// a tab/window is closed (as indicated by the first parameter) to allow the
// appropriate renderer to approve or deny the request. |proceed| indicates
// whether the user chose to proceed.
virtual void ShouldClosePage(bool for_cross_site_transition,
bool proceed) = 0;
// Called by ResourceDispatcherHost when a response for a pending cross-site
// request is received. The ResourceDispatcherHost will pause the response
// until the onunload handler of the previous renderer is run.
virtual void OnCrossSiteResponse(int new_render_process_host_id,
int new_request_id) = 0;
// Called the ResourceDispatcherHost's associate CrossSiteRequestHandler
// when a cross-site navigation has been canceled.
virtual void OnCrossSiteNavigationCanceled() = 0;
protected:
virtual ~RendererManagement() {}
};
// ContentSettings------------------------------------------------------------
// Interface for content settings related events.
class ContentSettings {
public:
// Called when content in the current page was blocked due to the user's
// content settings.
virtual void OnContentBlocked(ContentSettingsType type,
const std::string& resource_identifier) = 0;
// Called when cookies for the given URL were read either from within the
// current page or while loading it. |blocked_by_policy| should be true, if
// reading cookies was blocked due to the user's content settings. In that
// case, this function should invoke OnContentBlocked.
virtual void OnCookiesRead(
const GURL& url,
const net::CookieList& cookie_list,
bool blocked_by_policy) = 0;
// Called when a specific cookie in the current page was changed.
// |blocked_by_policy| should be true, if the cookie was blocked due to the
// user's content settings. In that case, this function should invoke
// OnContentBlocked.
virtual void OnCookieChanged(const GURL& url,
const std::string& cookie_line,
const net::CookieOptions& options,
bool blocked_by_policy) = 0;
// Called when a specific indexed db factory in the current page was
// accessed. If access was blocked due to the user's content settings,
// |blocked_by_policy| should be true, and this function should invoke
// OnContentBlocked.
virtual void OnIndexedDBAccessed(const GURL& url,
const string16& description,
bool blocked_by_policy) = 0;
// Called when a specific local storage area in the current page was
// accessed. If access was blocked due to the user's content settings,
// |blocked_by_policy| should be true, and this function should invoke
// OnContentBlocked.
virtual void OnLocalStorageAccessed(const GURL& url,
DOMStorageType storage_type,
bool blocked_by_policy) = 0;
// Called when a specific Web database in the current page was accessed. If
// access was blocked due to the user's content settings,
// |blocked_by_policy| should eb true, and this function should invoke
// OnContentBlocked.
virtual void OnWebDatabaseAccessed(const GURL& url,
const string16& name,
const string16& display_name,
unsigned long estimated_size,
bool blocked_by_policy) = 0;
// Called when a specific appcache in the current page was accessed. If
// access was blocked due to the user's content settings,
// |blocked_by_policy| should eb true, and this function should invoke
// OnContentBlocked.
virtual void OnAppCacheAccessed(const GURL& manifest_url,
bool blocked_by_policy) = 0;
// Called when geolocation permission was set in a frame on the current
// page.
virtual void OnGeolocationPermissionSet(const GURL& requesting_frame,
bool allowed) = 0;
protected:
virtual ~ContentSettings() {}
};
// BookmarkDrag --------------------------------------------------------------
// Interface for forwarding bookmark drag and drop to extenstions.
class BookmarkDrag {
public:
virtual void OnDragEnter(const BookmarkNodeData& data) = 0;
virtual void OnDragOver(const BookmarkNodeData& data) = 0;
virtual void OnDragLeave(const BookmarkNodeData& data) = 0;
virtual void OnDrop(const BookmarkNodeData& data) = 0;
protected:
virtual ~BookmarkDrag() {}
};
// SSL -----------------------------------------------------------------------
// Interface for UI and other RenderViewHost-specific interactions with SSL.
class SSL {
public:
// Displays a dialog to select client certificates from |request_info|,
// returning them to |handler|.
virtual void ShowClientCertificateRequestDialog(
scoped_refptr<SSLClientAuthHandler> handler) = 0;
// Called when |handler| encounters an error in verifying a
// received client certificate. Note that, because CAs often will
// not send us intermediate certificates, the verification we can
// do is minimal: we verify the certificate is parseable, that we
// have the corresponding private key, and that the certificate
// has not expired.
virtual void OnVerifyClientCertificateError(
scoped_refptr<SSLAddCertHandler> handler, int error_code) = 0;
// Called when |handler| requests the user's confirmation in adding a
// client certificate.
virtual void AskToAddClientCertificate(
scoped_refptr<SSLAddCertHandler> handler) = 0;
// Called when |handler| successfully adds a client certificate.
virtual void OnAddClientCertificateSuccess(
scoped_refptr<SSLAddCertHandler> handler) = 0;
// Called when |handler| encounters an error adding a client certificate.
virtual void OnAddClientCertificateError(
scoped_refptr<SSLAddCertHandler> handler, int error_code) = 0;
// Called when |handler| has completed, so the delegate may release any
// state accumulated.
virtual void OnAddClientCertificateFinished(
scoped_refptr<SSLAddCertHandler> handler) = 0;
protected:
virtual ~SSL() {}
};
// ---------------------------------------------------------------------------
// Returns the current delegate associated with a feature. May return NULL if
// there is no corresponding delegate.
virtual View* GetViewDelegate();
virtual RendererManagement* GetRendererManagementDelegate();
virtual ContentSettings* GetContentSettingsDelegate();
virtual BookmarkDrag* GetBookmarkDragDelegate();
virtual SSL* GetSSLDelegate();
// Return the delegate for registering RenderViewHosts for automation resource
// routing.
virtual AutomationResourceRoutingDelegate*
GetAutomationResourceRoutingDelegate();
// IPC::Channel::Listener implementation.
// This is used to give the delegate a chance to filter IPC messages.
virtual bool OnMessageReceived(const IPC::Message& message);
// Gets the URL that is currently being displayed, if there is one.
virtual const GURL& GetURL() const;
// Return this object cast to a TabContents, if it is one. If the object is
// not a TabContents, returns NULL. DEPRECATED: Be sure to include brettw and
// jam as reviewers before you use this method.
virtual TabContents* GetAsTabContents();
// Return this object cast to a BackgroundContents, if it is one. If the
// object is not a BackgroundContents, returns NULL.
virtual BackgroundContents* GetAsBackgroundContents();
// Return id number of browser window which this object is attached to. If no
// browser window is attached to, just return -1.
virtual int GetBrowserWindowID() const = 0;
// Return type of RenderView which is attached with this object.
virtual ViewType::Type GetRenderViewType() const = 0;
// The RenderView is being constructed (message sent to the renderer process
// to construct a RenderView). Now is a good time to send other setup events
// to the RenderView. This precedes any other commands to the RenderView.
virtual void RenderViewCreated(RenderViewHost* render_view_host) {}
// The RenderView has been constructed.
virtual void RenderViewReady(RenderViewHost* render_view_host) {}
// The RenderView died somehow (crashed or was killed by the user).
virtual void RenderViewGone(RenderViewHost* render_view_host,
base::TerminationStatus status,
int error_code) {}
// The RenderView is going to be deleted. This is called when each
// RenderView is going to be destroyed
virtual void RenderViewDeleted(RenderViewHost* render_view_host) {}
// The RenderView was navigated to a different page.
virtual void DidNavigate(RenderViewHost* render_view_host,
const ViewHostMsg_FrameNavigate_Params& params) {}
// The state for the page changed and should be updated.
virtual void UpdateState(RenderViewHost* render_view_host,
int32 page_id,
const std::string& state) {}
// The page's title was changed and should be updated.
virtual void UpdateTitle(RenderViewHost* render_view_host,
int32 page_id,
const std::wstring& title) {}
// The page's encoding was changed and should be updated.
virtual void UpdateEncoding(RenderViewHost* render_view_host,
const std::string& encoding) {}
// The destination URL has changed should be updated
virtual void UpdateTargetURL(int32 page_id, const GURL& url) {}
// The thumbnail representation of the page changed and should be updated.
virtual void UpdateThumbnail(const GURL& url,
const SkBitmap& bitmap,
const ThumbnailScore& score) {}
// Inspector setting was changed and should be persisted.
virtual void UpdateInspectorSetting(const std::string& key,
const std::string& value) = 0;
virtual void ClearInspectorSettings() = 0;
// The page is trying to close the RenderView's representation in the client.
virtual void Close(RenderViewHost* render_view_host) {}
// The page is trying to move the RenderView's representation in the client.
virtual void RequestMove(const gfx::Rect& new_bounds) {}
// The RenderView began loading a new page. This corresponds to WebKit's
// notion of the throbber starting.
virtual void DidStartLoading() {}
// The RenderView stopped loading a page. This corresponds to WebKit's
// notion of the throbber stopping.
virtual void DidStopLoading() {}
// The RenderView made progress loading a page's top frame.
// |progress| is a value between 0 (nothing loaded) to 1.0 (top frame
// entirely loaded).
virtual void DidChangeLoadProgress(double progress) {}
// The RenderView's main frame document element is ready. This happens when
// the document has finished parsing.
virtual void DocumentAvailableInMainFrame(RenderViewHost* render_view_host) {}
// The onload handler in the RenderView's main frame has completed.
virtual void DocumentOnLoadCompletedInMainFrame(
RenderViewHost* render_view_host,
int32 page_id) {}
// The page wants to open a URL with the specified disposition.
virtual void RequestOpenURL(const GURL& url,
const GURL& referrer,
WindowOpenDisposition disposition) {}
// A DOM automation operation completed. The result of the operation is
// expressed in a json string.
virtual void DomOperationResponse(const std::string& json_string,
int automation_id) {}
// A message was sent from HTML-based UI.
// By default we ignore such messages.
virtual void ProcessWebUIMessage(
const ViewHostMsg_DomMessage_Params& params) {}
// A message for external host. By default we ignore such messages.
// |receiver| can be a receiving script and |message| is any
// arbitrary string that makes sense to the receiver.
virtual void ProcessExternalHostMessage(const std::string& message,
const std::string& origin,
const std::string& target) {}
// A javascript message, confirmation or prompt should be shown.
virtual void RunJavaScriptMessage(const std::wstring& message,
const std::wstring& default_prompt,
const GURL& frame_url,
const int flags,
IPC::Message* reply_msg,
bool* did_suppress_message) {}
virtual void RunBeforeUnloadConfirm(const std::wstring& message,
IPC::Message* reply_msg) {}
virtual void ShowModalHTMLDialog(const GURL& url, int width, int height,
const std::string& json_arguments,
IPC::Message* reply_msg) {}
// |url| is assigned to a server that can provide alternate error pages. If
// the returned URL is empty, the default error page built into WebKit will
// be used.
virtual GURL GetAlternateErrorPageURL() const;
// Return a dummy RendererPreferences object that will be used by the renderer
// associated with the owning RenderViewHost.
virtual RendererPreferences GetRendererPrefs(Profile* profile) const = 0;
// Returns a WebPreferences object that will be used by the renderer
// associated with the owning render view host.
virtual WebPreferences GetWebkitPrefs();
// Notification the user has made a gesture while focus was on the
// page. This is used to avoid uninitiated user downloads (aka carpet
// bombing), see DownloadRequestLimiter for details.
virtual void OnUserGesture() {}
// Notification from the renderer host that blocked UI event occurred.
// This happens when there are tab-modal dialogs. In this case, the
// notification is needed to let us draw attention to the dialog (i.e.
// refocus on the modal dialog, flash title etc).
virtual void OnIgnoredUIEvent() {}
// Notification that the renderer has become unresponsive. The
// delegate can use this notification to show a warning to the user.
virtual void RendererUnresponsive(RenderViewHost* render_view_host,
bool is_during_unload) {}
// Notification that a previously unresponsive renderer has become
// responsive again. The delegate can use this notification to end the
// warning shown to the user.
virtual void RendererResponsive(RenderViewHost* render_view_host) {}
// Notification that the RenderViewHost's load state changed.
virtual void LoadStateChanged(const GURL& url, net::LoadState load_state,
uint64 upload_position, uint64 upload_size) {}
// Returns true if this view is used to host an external tab container.
virtual bool IsExternalTabContainer() const;
// The RenderView has inserted one css file into page.
virtual void DidInsertCSS() {}
// A different node in the page got focused.
virtual void FocusedNodeChanged(bool is_editable_node) {}
// Updates the minimum and maximum zoom percentages.
virtual void UpdateZoomLimits(int minimum_percent,
int maximum_percent,
bool remember) {}
// Notification that a worker process has crashed.
void WorkerCrashed() {}
protected:
virtual ~RenderViewHostDelegate() {}
};
#endif // CONTENT_BROWSER_RENDERER_HOST_RENDER_VIEW_HOST_DELEGATE_H_