// 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 #include #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; struct 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& 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 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 handler, int error_code) = 0; // Called when |handler| requests the user's confirmation in adding a // client certificate. virtual void AskToAddClientCertificate( scoped_refptr handler) = 0; // Called when |handler| successfully adds a client certificate. virtual void OnAddClientCertificateSuccess( scoped_refptr handler) = 0; // Called when |handler| encounters an error adding a client certificate. virtual void OnAddClientCertificateError( scoped_refptr handler, int error_code) = 0; // Called when |handler| has completed, so the delegate may release any // state accumulated. virtual void OnAddClientCertificateFinished( scoped_refptr 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) {} // |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_