Home | History | Annotate | Download | only in renderer_host
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CONTENT_BROWSER_RENDERER_HOST_RENDER_VIEW_HOST_DELEGATE_H_
      6 #define CONTENT_BROWSER_RENDERER_HOST_RENDER_VIEW_HOST_DELEGATE_H_
      7 
      8 #include <string>
      9 
     10 #include "base/basictypes.h"
     11 #include "base/callback.h"
     12 #include "base/i18n/rtl.h"
     13 #include "base/process/kill.h"
     14 #include "base/strings/string16.h"
     15 #include "content/common/content_export.h"
     16 #include "content/public/common/javascript_message_type.h"
     17 #include "content/public/common/media_stream_request.h"
     18 #include "content/public/common/page_transition_types.h"
     19 #include "net/base/load_states.h"
     20 #include "third_party/WebKit/public/web/WebPopupType.h"
     21 #include "ui/base/window_open_disposition.h"
     22 
     23 class GURL;
     24 class SkBitmap;
     25 class WebKeyboardEvent;
     26 struct ViewHostMsg_CreateWindow_Params;
     27 struct ViewHostMsg_DidFailProvisionalLoadWithError_Params;
     28 struct ViewHostMsg_FrameNavigate_Params;
     29 struct ViewMsg_PostMessage_Params;
     30 struct WebPreferences;
     31 
     32 namespace base {
     33 class ListValue;
     34 class TimeTicks;
     35 }
     36 
     37 namespace IPC {
     38 class Message;
     39 }
     40 
     41 namespace gfx {
     42 class Point;
     43 class Rect;
     44 class Size;
     45 }
     46 
     47 namespace content {
     48 
     49 class BrowserContext;
     50 class FrameTree;
     51 class PageState;
     52 class RenderViewHost;
     53 class RenderViewHostDelegateView;
     54 class SessionStorageNamespace;
     55 class SiteInstance;
     56 class WebContents;
     57 class WebContentsImpl;
     58 struct ContextMenuParams;
     59 struct FileChooserParams;
     60 struct GlobalRequestID;
     61 struct NativeWebKeyboardEvent;
     62 struct Referrer;
     63 struct RendererPreferences;
     64 struct ResourceRedirectDetails;
     65 struct ResourceRequestDetails;
     66 
     67 //
     68 // RenderViewHostDelegate
     69 //
     70 //  An interface implemented by an object interested in knowing about the state
     71 //  of the RenderViewHost.
     72 //
     73 //  This interface currently encompasses every type of message that was
     74 //  previously being sent by WebContents itself. Some of these notifications
     75 //  may not be relevant to all users of RenderViewHost and we should consider
     76 //  exposing a more generic Send function on RenderViewHost and a response
     77 //  listener here to serve that need.
     78 class CONTENT_EXPORT RenderViewHostDelegate {
     79  public:
     80   // RendererManagerment -------------------------------------------------------
     81   // Functions for managing switching of Renderers. For WebContents, this is
     82   // implemented by the RenderFrameHostManager.
     83 
     84   class CONTENT_EXPORT RendererManagement {
     85    public:
     86     // Notification whether we should close the page, after an explicit call to
     87     // AttemptToClosePage.  This is called before a cross-site request or before
     88     // a tab/window is closed (as indicated by the first parameter) to allow the
     89     // appropriate renderer to approve or deny the request.  |proceed| indicates
     90     // whether the user chose to proceed.  |proceed_time| is the time when the
     91     // request was allowed to proceed.
     92     virtual void ShouldClosePage(
     93         bool for_cross_site_transition,
     94         bool proceed,
     95         const base::TimeTicks& proceed_time) = 0;
     96 
     97     // The |pending_render_view_host| is ready to commit a page.  The delegate
     98     // should ensure that the old RenderViewHost runs its unload handler first
     99     // and determine whether a RenderViewHost transfer is needed.
    100     virtual void OnCrossSiteResponse(
    101         RenderViewHost* pending_render_view_host,
    102         const GlobalRequestID& global_request_id,
    103         bool is_transfer,
    104         const std::vector<GURL>& transfer_url_chain,
    105         const Referrer& referrer,
    106         PageTransition page_transition,
    107         int64 frame_id,
    108         bool should_replace_current_entry) = 0;
    109 
    110    protected:
    111     virtual ~RendererManagement() {}
    112   };
    113 
    114   // ---------------------------------------------------------------------------
    115 
    116   // Returns the current delegate associated with a feature. May return NULL if
    117   // there is no corresponding delegate.
    118   virtual RenderViewHostDelegateView* GetDelegateView();
    119   virtual RendererManagement* GetRendererManagementDelegate();
    120 
    121   // This is used to give the delegate a chance to filter IPC messages.
    122   virtual bool OnMessageReceived(RenderViewHost* render_view_host,
    123                                  const IPC::Message& message);
    124 
    125   // Gets the URL that is currently being displayed, if there is one.
    126   virtual const GURL& GetURL() const;
    127 
    128   // Return this object cast to a WebContents, if it is one. If the object is
    129   // not a WebContents, returns NULL. DEPRECATED: Be sure to include brettw or
    130   // jam as reviewers before you use this method. http://crbug.com/82582
    131   virtual WebContents* GetAsWebContents();
    132 
    133   // Return the rect where to display the resize corner, if any, otherwise
    134   // an empty rect.
    135   virtual gfx::Rect GetRootWindowResizerRect() const = 0;
    136 
    137   // The RenderView is being constructed (message sent to the renderer process
    138   // to construct a RenderView).  Now is a good time to send other setup events
    139   // to the RenderView.  This precedes any other commands to the RenderView.
    140   virtual void RenderViewCreated(RenderViewHost* render_view_host) {}
    141 
    142   // The RenderView has been constructed.
    143   virtual void RenderViewReady(RenderViewHost* render_view_host) {}
    144 
    145   // The RenderView died somehow (crashed or was killed by the user).
    146   virtual void RenderViewTerminated(RenderViewHost* render_view_host,
    147                                     base::TerminationStatus status,
    148                                     int error_code) {}
    149 
    150   // The RenderView is going to be deleted. This is called when each
    151   // RenderView is going to be destroyed
    152   virtual void RenderViewDeleted(RenderViewHost* render_view_host) {}
    153 
    154   // The RenderView processed a redirect during a provisional load.
    155   //
    156   // TODO(creis): Remove this method and have the pre-rendering code listen to
    157   // WebContentsObserver::DidGetRedirectForResourceRequest instead.
    158   // See http://crbug.com/78512.
    159   virtual void DidRedirectProvisionalLoad(
    160       RenderViewHost* render_view_host,
    161       int32 page_id,
    162       const GURL& source_url,
    163       const GURL& target_url) {}
    164 
    165   // A provisional load in the RenderView failed.
    166   virtual void DidFailProvisionalLoadWithError(
    167       RenderViewHost* render_view_host,
    168       const ViewHostMsg_DidFailProvisionalLoadWithError_Params& params) {}
    169 
    170   // A response has been received for a resource request.
    171   virtual void DidGetResourceResponseStart(
    172       const ResourceRequestDetails& details) {}
    173 
    174   // A redirect was received while requesting a resource.
    175   virtual void DidGetRedirectForResourceRequest(
    176       const ResourceRedirectDetails& details) {}
    177 
    178   // The RenderView was navigated to a different page.
    179   virtual void DidNavigate(RenderViewHost* render_view_host,
    180                            const ViewHostMsg_FrameNavigate_Params& params) {}
    181 
    182   // The state for the page changed and should be updated.
    183   virtual void UpdateState(RenderViewHost* render_view_host,
    184                            int32 page_id,
    185                            const PageState& state) {}
    186 
    187   // The page's title was changed and should be updated.
    188   virtual void UpdateTitle(RenderViewHost* render_view_host,
    189                            int32 page_id,
    190                            const base::string16& title,
    191                            base::i18n::TextDirection title_direction) {}
    192 
    193   // The page's encoding was changed and should be updated.
    194   virtual void UpdateEncoding(RenderViewHost* render_view_host,
    195                               const std::string& encoding) {}
    196 
    197   // The destination URL has changed should be updated
    198   virtual void UpdateTargetURL(int32 page_id, const GURL& url) {}
    199 
    200   // The page is trying to close the RenderView's representation in the client.
    201   virtual void Close(RenderViewHost* render_view_host) {}
    202 
    203   // The RenderViewHost has been swapped out.
    204   virtual void SwappedOut(RenderViewHost* render_view_host) {}
    205 
    206   // The page is trying to move the RenderView's representation in the client.
    207   virtual void RequestMove(const gfx::Rect& new_bounds) {}
    208 
    209   // The RenderView began loading a new page. This corresponds to WebKit's
    210   // notion of the throbber starting.
    211   virtual void DidStartLoading(RenderViewHost* render_view_host) {}
    212 
    213   // The RenderView stopped loading a page. This corresponds to WebKit's
    214   // notion of the throbber stopping.
    215   virtual void DidStopLoading(RenderViewHost* render_view_host) {}
    216 
    217   // The pending page load was canceled.
    218   virtual void DidCancelLoading() {}
    219 
    220   // The RenderView made progress loading a page's top frame.
    221   // |progress| is a value between 0 (nothing loaded) to 1.0 (top frame
    222   // entirely loaded).
    223   virtual void DidChangeLoadProgress(double progress) {}
    224 
    225   // The RenderView set its opener to null, disowning it for the lifetime of
    226   // the window.
    227   virtual void DidDisownOpener(RenderViewHost* rvh) {}
    228 
    229   // Another page accessed the initial empty document of this RenderView,
    230   // which means it is no longer safe to display a pending URL without
    231   // risking a URL spoof.
    232   virtual void DidAccessInitialDocument() {}
    233 
    234   // The RenderView's main frame document element is ready. This happens when
    235   // the document has finished parsing.
    236   virtual void DocumentAvailableInMainFrame(RenderViewHost* render_view_host) {}
    237 
    238   // The onload handler in the RenderView's main frame has completed.
    239   virtual void DocumentOnLoadCompletedInMainFrame(
    240       RenderViewHost* render_view_host,
    241       int32 page_id) {}
    242 
    243   // The page wants to open a URL with the specified disposition.
    244   virtual void RequestOpenURL(RenderViewHost* rvh,
    245                               const GURL& url,
    246                               const Referrer& referrer,
    247                               WindowOpenDisposition disposition,
    248                               int64 source_frame_id,
    249                               bool is_redirect,
    250                               bool user_gesture) {}
    251 
    252   // The page wants to transfer the request to a new renderer.
    253   // |redirect_chain| contains any redirect URLs (excluding |url|) that happened
    254   // before the transfer.
    255   virtual void RequestTransferURL(
    256       const GURL& url,
    257       const std::vector<GURL>& redirect_chain,
    258       const Referrer& referrer,
    259       PageTransition page_transition,
    260       WindowOpenDisposition disposition,
    261       int64 source_frame_id,
    262       const GlobalRequestID& old_request_id,
    263       bool is_redirect,
    264       bool user_gesture) {}
    265 
    266   // The page wants to close the active view in this tab.
    267   virtual void RouteCloseEvent(RenderViewHost* rvh) {}
    268 
    269   // The page wants to post a message to the active view in this tab.
    270   virtual void RouteMessageEvent(
    271       RenderViewHost* rvh,
    272       const ViewMsg_PostMessage_Params& params) {}
    273 
    274   // A javascript message, confirmation or prompt should be shown.
    275   virtual void RunJavaScriptMessage(RenderViewHost* rvh,
    276                                     const base::string16& message,
    277                                     const base::string16& default_prompt,
    278                                     const GURL& frame_url,
    279                                     JavaScriptMessageType type,
    280                                     IPC::Message* reply_msg,
    281                                     bool* did_suppress_message) {}
    282 
    283   virtual void RunBeforeUnloadConfirm(RenderViewHost* rvh,
    284                                       const base::string16& message,
    285                                       bool is_reload,
    286                                       IPC::Message* reply_msg) {}
    287 
    288   // A message was added to to the console.
    289   virtual bool AddMessageToConsole(int32 level,
    290                                    const base::string16& message,
    291                                    int32 line_no,
    292                                    const base::string16& source_id);
    293 
    294   // Return a dummy RendererPreferences object that will be used by the renderer
    295   // associated with the owning RenderViewHost.
    296   virtual RendererPreferences GetRendererPrefs(
    297       BrowserContext* browser_context) const = 0;
    298 
    299   // Returns a WebPreferences object that will be used by the renderer
    300   // associated with the owning render view host.
    301   virtual WebPreferences GetWebkitPrefs();
    302 
    303   // Notification the user has made a gesture while focus was on the
    304   // page. This is used to avoid uninitiated user downloads (aka carpet
    305   // bombing), see DownloadRequestLimiter for details.
    306   virtual void OnUserGesture() {}
    307 
    308   // Notification from the renderer host that blocked UI event occurred.
    309   // This happens when there are tab-modal dialogs. In this case, the
    310   // notification is needed to let us draw attention to the dialog (i.e.
    311   // refocus on the modal dialog, flash title etc).
    312   virtual void OnIgnoredUIEvent() {}
    313 
    314   // Notification that the renderer has become unresponsive. The
    315   // delegate can use this notification to show a warning to the user.
    316   virtual void RendererUnresponsive(RenderViewHost* render_view_host,
    317                                     bool is_during_before_unload,
    318                                     bool is_during_unload) {}
    319 
    320   // Notification that a previously unresponsive renderer has become
    321   // responsive again. The delegate can use this notification to end the
    322   // warning shown to the user.
    323   virtual void RendererResponsive(RenderViewHost* render_view_host) {}
    324 
    325   // Notification that the RenderViewHost's load state changed.
    326   virtual void LoadStateChanged(const GURL& url,
    327                                 const net::LoadStateWithParam& load_state,
    328                                 uint64 upload_position,
    329                                 uint64 upload_size) {}
    330 
    331   // Notification that a worker process has crashed.
    332   virtual void WorkerCrashed() {}
    333 
    334   // The page wants the hosting window to activate/deactivate itself (it
    335   // called the JavaScript window.focus()/blur() method).
    336   virtual void Activate() {}
    337   virtual void Deactivate() {}
    338 
    339   // Notification that the view has lost capture.
    340   virtual void LostCapture() {}
    341 
    342   // Notifications about mouse events in this view.  This is useful for
    343   // implementing global 'on hover' features external to the view.
    344   virtual void HandleMouseMove() {}
    345   virtual void HandleMouseDown() {}
    346   virtual void HandleMouseLeave() {}
    347   virtual void HandleMouseUp() {}
    348   virtual void HandlePointerActivate() {}
    349   virtual void HandleGestureBegin() {}
    350   virtual void HandleGestureEnd() {}
    351 
    352   // Called when a file selection is to be done.
    353   virtual void RunFileChooser(
    354       RenderViewHost* render_view_host,
    355       const FileChooserParams& params) {}
    356 
    357   // Notification that the page wants to go into or out of fullscreen mode.
    358   virtual void ToggleFullscreenMode(bool enter_fullscreen) {}
    359   virtual bool IsFullscreenForCurrentTab() const;
    360 
    361   // The contents' preferred size changed.
    362   virtual void UpdatePreferredSize(const gfx::Size& pref_size) {}
    363 
    364   // The contents auto-resized and the container should match it.
    365   virtual void ResizeDueToAutoResize(const gfx::Size& new_size) {}
    366 
    367   // Requests to lock the mouse. Once the request is approved or rejected,
    368   // GotResponseToLockMouseRequest() will be called on the requesting render
    369   // view host.
    370   virtual void RequestToLockMouse(bool user_gesture,
    371                                   bool last_unlocked_by_target) {}
    372 
    373   // Notification that the view has lost the mouse lock.
    374   virtual void LostMouseLock() {}
    375 
    376   // The page is trying to open a new page (e.g. a popup window). The window
    377   // should be created associated with the given |route_id| in process
    378   // |render_process_id|, but it should not be shown yet. That should happen in
    379   // response to ShowCreatedWindow.
    380   // |params.window_container_type| describes the type of RenderViewHost
    381   // container that is requested -- in particular, the window.open call may
    382   // have specified 'background' and 'persistent' in the feature string.
    383   //
    384   // The passed |params.frame_name| parameter is the name parameter that was
    385   // passed to window.open(), and will be empty if none was passed.
    386   //
    387   // Note: this is not called "CreateWindow" because that will clash with
    388   // the Windows function which is actually a #define.
    389   virtual void CreateNewWindow(
    390       int render_process_id,
    391       int route_id,
    392       int main_frame_route_id,
    393       const ViewHostMsg_CreateWindow_Params& params,
    394       SessionStorageNamespace* session_storage_namespace) {}
    395 
    396   // The page is trying to open a new widget (e.g. a select popup). The
    397   // widget should be created associated with the given |route_id| in the
    398   // process |render_process_id|, but it should not be shown yet. That should
    399   // happen in response to ShowCreatedWidget.
    400   // |popup_type| indicates if the widget is a popup and what kind of popup it
    401   // is (select, autofill...).
    402   virtual void CreateNewWidget(int render_process_id,
    403                                int route_id,
    404                                blink::WebPopupType popup_type) {}
    405 
    406   // Creates a full screen RenderWidget. Similar to above.
    407   virtual void CreateNewFullscreenWidget(int render_process_id, int route_id) {}
    408 
    409   // Show a previously created page with the specified disposition and bounds.
    410   // The window is identified by the route_id passed to CreateNewWindow.
    411   //
    412   // Note: this is not called "ShowWindow" because that will clash with
    413   // the Windows function which is actually a #define.
    414   virtual void ShowCreatedWindow(int route_id,
    415                                  WindowOpenDisposition disposition,
    416                                  const gfx::Rect& initial_pos,
    417                                  bool user_gesture) {}
    418 
    419   // Show the newly created widget with the specified bounds.
    420   // The widget is identified by the route_id passed to CreateNewWidget.
    421   virtual void ShowCreatedWidget(int route_id,
    422                                  const gfx::Rect& initial_pos) {}
    423 
    424   // Show the newly created full screen widget. Similar to above.
    425   virtual void ShowCreatedFullscreenWidget(int route_id) {}
    426 
    427   // A context menu should be shown, to be built using the context information
    428   // provided in the supplied params.
    429   virtual void ShowContextMenu(const ContextMenuParams& params) {}
    430 
    431   // The render view has requested access to media devices listed in
    432   // |request|, and the client should grant or deny that permission by
    433   // calling |callback|.
    434   virtual void RequestMediaAccessPermission(
    435       const MediaStreamRequest& request,
    436       const MediaResponseCallback& callback) {}
    437 
    438   // Returns the SessionStorageNamespace the render view should use. Might
    439   // create the SessionStorageNamespace on the fly.
    440   virtual SessionStorageNamespace* GetSessionStorageNamespace(
    441       SiteInstance* instance);
    442 
    443   // Returns the FrameTree the render view should use. Guaranteed to be constant
    444   // for the lifetime of the render view.
    445   //
    446   // TODO(ajwong): Remove once the main frame RenderFrameHost is no longer
    447   // created by the RenderViewHost.
    448   virtual FrameTree* GetFrameTree();
    449 
    450  protected:
    451   virtual ~RenderViewHostDelegate() {}
    452 };
    453 
    454 }  // namespace content
    455 
    456 #endif  // CONTENT_BROWSER_RENDERER_HOST_RENDER_VIEW_HOST_DELEGATE_H_
    457