Home | History | Annotate | Download | only in browser
      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_PUBLIC_BROWSER_WEB_CONTENTS_DELEGATE_H_
      6 #define CONTENT_PUBLIC_BROWSER_WEB_CONTENTS_DELEGATE_H_
      7 
      8 #include <set>
      9 #include <string>
     10 
     11 #include "base/basictypes.h"
     12 #include "base/callback.h"
     13 #include "base/strings/string16.h"
     14 #include "content/common/content_export.h"
     15 #include "content/public/browser/navigation_type.h"
     16 #include "content/public/common/media_stream_request.h"
     17 #include "content/public/common/page_transition_types.h"
     18 #include "content/public/common/window_container_type.h"
     19 #include "third_party/WebKit/public/web/WebDragOperation.h"
     20 #include "third_party/skia/include/core/SkColor.h"
     21 #include "ui/base/window_open_disposition.h"
     22 #include "ui/gfx/native_widget_types.h"
     23 #include "ui/gfx/rect_f.h"
     24 
     25 class GURL;
     26 
     27 namespace base {
     28 class FilePath;
     29 class ListValue;
     30 }
     31 
     32 namespace content {
     33 class BrowserContext;
     34 class ColorChooser;
     35 class DownloadItem;
     36 class JavaScriptDialogManager;
     37 class PageState;
     38 class RenderViewHost;
     39 class SessionStorageNamespace;
     40 class WebContents;
     41 class WebContentsImpl;
     42 struct ColorSuggestion;
     43 struct ContextMenuParams;
     44 struct DropData;
     45 struct FileChooserParams;
     46 struct NativeWebKeyboardEvent;
     47 struct Referrer;
     48 struct SSLStatus;
     49 }
     50 
     51 namespace gfx {
     52 class Point;
     53 class Rect;
     54 class Size;
     55 }
     56 
     57 namespace blink {
     58 class WebGestureEvent;
     59 class WebLayer;
     60 struct WebWindowFeatures;
     61 }
     62 
     63 namespace content {
     64 
     65 struct OpenURLParams;
     66 
     67 // Objects implement this interface to get notified about changes in the
     68 // WebContents and to provide necessary functionality.
     69 class CONTENT_EXPORT WebContentsDelegate {
     70  public:
     71   WebContentsDelegate();
     72 
     73   // Opens a new URL inside the passed in WebContents (if source is 0 open
     74   // in the current front-most tab), unless |disposition| indicates the url
     75   // should be opened in a new tab or window.
     76   //
     77   // A NULL source indicates the current tab (callers should probably use
     78   // OpenURL() for these cases which does it for you).
     79 
     80   // Returns the WebContents the URL is opened in, or NULL if the URL wasn't
     81   // opened immediately.
     82   virtual WebContents* OpenURLFromTab(WebContents* source,
     83                                       const OpenURLParams& params);
     84 
     85   // Called to inform the delegate that the WebContents's navigation state
     86   // changed. The |changed_flags| indicates the parts of the navigation state
     87   // that have been updated, and is any combination of the
     88   // |WebContents::InvalidateTypes| bits.
     89   virtual void NavigationStateChanged(const WebContents* source,
     90                                       unsigned changed_flags) {}
     91 
     92   // Called to inform the delegate that the WebContent's visible SSL state (as
     93   // defined by SSLStatus) changed.
     94   virtual void VisibleSSLStateChanged(const WebContents* source) {}
     95 
     96   // Creates a new tab with the already-created WebContents 'new_contents'.
     97   // The window for the added contents should be reparented correctly when this
     98   // method returns.  If |disposition| is NEW_POPUP, |initial_pos| should hold
     99   // the initial position. If |was_blocked| is non-NULL, then |*was_blocked|
    100   // will be set to true if the popup gets blocked, and left unchanged
    101   // otherwise.
    102   virtual void AddNewContents(WebContents* source,
    103                               WebContents* new_contents,
    104                               WindowOpenDisposition disposition,
    105                               const gfx::Rect& initial_pos,
    106                               bool user_gesture,
    107                               bool* was_blocked) {}
    108 
    109   // Selects the specified contents, bringing its container to the front.
    110   virtual void ActivateContents(WebContents* contents) {}
    111 
    112   // Deactivates the specified contents by deactivating its container and
    113   // potentialy moving it to the back of the Z order.
    114   virtual void DeactivateContents(WebContents* contents) {}
    115 
    116   // Notifies the delegate that this contents is starting or is done loading
    117   // some resource. The delegate should use this notification to represent
    118   // loading feedback. See WebContents::IsLoading()
    119   // |to_different_document| will be true unless the load is a fragment
    120   // navigation, or triggered by history.pushState/replaceState.
    121   virtual void LoadingStateChanged(WebContents* source,
    122                                    bool to_different_document) {}
    123 
    124   // Notifies the delegate that the page has made some progress loading.
    125   // |progress| is a value between 0.0 (nothing loaded) to 1.0 (page fully
    126   // loaded).
    127   virtual void LoadProgressChanged(WebContents* source,
    128                                    double progress) {}
    129 
    130   // Request the delegate to close this web contents, and do whatever cleanup
    131   // it needs to do.
    132   virtual void CloseContents(WebContents* source) {}
    133 
    134   // Informs the delegate that the underlying RenderViewHost has been swapped
    135   // out so it can perform any cleanup necessary.
    136   virtual void SwappedOut(WebContents* source) {}
    137 
    138   // Request the delegate to move this WebContents to the specified position
    139   // in screen coordinates.
    140   virtual void MoveContents(WebContents* source, const gfx::Rect& pos) {}
    141 
    142   // Called to determine if the WebContents is contained in a popup window
    143   // or a panel window.
    144   virtual bool IsPopupOrPanel(const WebContents* source) const;
    145 
    146   // Notification that the target URL has changed.
    147   virtual void UpdateTargetURL(WebContents* source,
    148                                int32 page_id,
    149                                const GURL& url) {}
    150 
    151   // Notification that there was a mouse event, along with the absolute
    152   // coordinates of the mouse pointer and whether it was a normal motion event
    153   // (otherwise, the pointer left the contents area).
    154   virtual void ContentsMouseEvent(WebContents* source,
    155                                   const gfx::Point& location,
    156                                   bool motion) {}
    157 
    158   // Request the delegate to change the zoom level of the current tab.
    159   virtual void ContentsZoomChange(bool zoom_in) {}
    160 
    161   // Called to determine if the WebContents can be overscrolled with touch/wheel
    162   // gestures.
    163   virtual bool CanOverscrollContent() const;
    164 
    165   // Callback that allows vertical overscroll activies to be communicated to the
    166   // delegate.
    167   virtual void OverscrollUpdate(int delta_y) {}
    168 
    169   // Return the rect where to display the resize corner, if any, otherwise
    170   // an empty rect.
    171   virtual gfx::Rect GetRootWindowResizerRect() const;
    172 
    173   // Invoked prior to showing before unload handler confirmation dialog.
    174   virtual void WillRunBeforeUnloadConfirm() {}
    175 
    176   // Returns true if javascript dialogs and unload alerts are suppressed.
    177   // Default is false.
    178   virtual bool ShouldSuppressDialogs();
    179 
    180   // Returns whether pending NavigationEntries for aborted browser-initiated
    181   // navigations should be preserved (and thus returned from GetVisibleURL).
    182   // Defaults to false.
    183   virtual bool ShouldPreserveAbortedURLs(WebContents* source);
    184 
    185   // Add a message to the console. Returning true indicates that the delegate
    186   // handled the message. If false is returned the default logging mechanism
    187   // will be used for the message.
    188   virtual bool AddMessageToConsole(WebContents* source,
    189                                    int32 level,
    190                                    const base::string16& message,
    191                                    int32 line_no,
    192                                    const base::string16& source_id);
    193 
    194   // Tells us that we've finished firing this tab's beforeunload event.
    195   // The proceed bool tells us whether the user chose to proceed closing the
    196   // tab. Returns true if the tab can continue on firing its unload event.
    197   // If we're closing the entire browser, then we'll want to delay firing
    198   // unload events until all the beforeunload events have fired.
    199   virtual void BeforeUnloadFired(WebContents* tab,
    200                                  bool proceed,
    201                                  bool* proceed_to_fire_unload);
    202 
    203   // Returns true if the location bar should be focused by default rather than
    204   // the page contents. NOTE: this is only used if WebContents can't determine
    205   // for itself whether the location bar should be focused by default. For a
    206   // complete check, you should use WebContents::FocusLocationBarByDefault().
    207   virtual bool ShouldFocusLocationBarByDefault(WebContents* source);
    208 
    209   // Sets focus to the location bar or some other place that is appropriate.
    210   // This is called when the tab wants to encourage user input, like for the
    211   // new tab page.
    212   virtual void SetFocusToLocationBar(bool select_all) {}
    213 
    214   // Returns whether the page should be focused when transitioning from crashed
    215   // to live. Default is true.
    216   virtual bool ShouldFocusPageAfterCrash();
    217 
    218   // This is called when WebKit tells us that it is done tabbing through
    219   // controls on the page. Provides a way for WebContentsDelegates to handle
    220   // this. Returns true if the delegate successfully handled it.
    221   virtual bool TakeFocus(WebContents* source,
    222                          bool reverse);
    223 
    224   // Invoked when the page loses mouse capture.
    225   virtual void LostCapture() {}
    226 
    227   // Notification that |contents| has gained focus.
    228   virtual void WebContentsFocused(WebContents* contents) {}
    229 
    230   // Asks the delegate if the given tab can download.
    231   // Invoking the |callback| synchronously is OK.
    232   virtual void CanDownload(RenderViewHost* render_view_host,
    233                            const GURL& url,
    234                            const std::string& request_method,
    235                            const base::Callback<void(bool)>& callback);
    236 
    237   // Return much extra vertical space should be allotted to the
    238   // render view widget during various animations (e.g. infobar closing).
    239   // This is used to make painting look smoother.
    240   virtual int GetExtraRenderViewHeight() const;
    241 
    242   // Returns true if the context menu operation was handled by the delegate.
    243   virtual bool HandleContextMenu(const content::ContextMenuParams& params);
    244 
    245   // Opens source view for given WebContents that is navigated to the given
    246   // page url.
    247   virtual void ViewSourceForTab(WebContents* source, const GURL& page_url);
    248 
    249   // Opens source view for the given subframe.
    250   virtual void ViewSourceForFrame(WebContents* source,
    251                                   const GURL& url,
    252                                   const PageState& page_state);
    253 
    254   // Allows delegates to handle keyboard events before sending to the renderer.
    255   // Returns true if the |event| was handled. Otherwise, if the |event| would be
    256   // handled in HandleKeyboardEvent() method as a normal keyboard shortcut,
    257   // |*is_keyboard_shortcut| should be set to true.
    258   virtual bool PreHandleKeyboardEvent(WebContents* source,
    259                                       const NativeWebKeyboardEvent& event,
    260                                       bool* is_keyboard_shortcut);
    261 
    262   // Allows delegates to handle unhandled keyboard messages coming back from
    263   // the renderer.
    264   virtual void HandleKeyboardEvent(WebContents* source,
    265                                    const NativeWebKeyboardEvent& event) {}
    266 
    267   virtual void HandleMouseDown() {}
    268   virtual void HandleMouseUp() {}
    269 
    270   // Handles activation resulting from a pointer event (e.g. when mouse is
    271   // pressed, or a touch-gesture begins).
    272   virtual void HandlePointerActivate() {}
    273 
    274   // Allows delegates to handle gesture events before sending to the renderer.
    275   // Returns true if the |event| was handled and thus shouldn't be processed
    276   // by the renderer's event handler. Note that the touch events that create
    277   // the gesture are always passed to the renderer since the gesture is created
    278   // and dispatched after the touches return without being "preventDefault()"ed.
    279   virtual bool PreHandleGestureEvent(
    280       WebContents* source,
    281       const blink::WebGestureEvent& event);
    282 
    283   virtual void HandleGestureBegin() {}
    284   virtual void HandleGestureEnd() {}
    285 
    286   // Called when an external drag event enters the web contents window. Return
    287   // true to allow dragging and dropping on the web contents window or false to
    288   // cancel the operation. This method is used by Chromium Embedded Framework.
    289   virtual bool CanDragEnter(WebContents* source,
    290                             const DropData& data,
    291                             blink::WebDragOperationsMask operations_allowed);
    292 
    293   // Render view drag n drop ended.
    294   virtual void DragEnded() {}
    295 
    296   // Shows the repost form confirmation dialog box.
    297   virtual void ShowRepostFormWarningDialog(WebContents* source) {}
    298 
    299   // Allows delegate to override navigation to the history entries.
    300   // Returns true to allow WebContents to continue with the default processing.
    301   virtual bool OnGoToEntryOffset(int offset);
    302 
    303   // Allows delegate to control whether a WebContents will be created. Returns
    304   // true to allow the creation. Default is to allow it. In cases where the
    305   // delegate handles the creation/navigation itself, it will use |target_url|.
    306   // The embedder has to synchronously adopt |route_id| or else the view will
    307   // be destroyed.
    308   virtual bool ShouldCreateWebContents(
    309       WebContents* web_contents,
    310       int route_id,
    311       WindowContainerType window_container_type,
    312       const base::string16& frame_name,
    313       const GURL& target_url,
    314       const std::string& partition_id,
    315       SessionStorageNamespace* session_storage_namespace);
    316 
    317   // Notifies the delegate about the creation of a new WebContents. This
    318   // typically happens when popups are created.
    319   virtual void WebContentsCreated(WebContents* source_contents,
    320                                   int opener_render_frame_id,
    321                                   const base::string16& frame_name,
    322                                   const GURL& target_url,
    323                                   WebContents* new_contents) {}
    324 
    325   // Notification that the tab is hung.
    326   virtual void RendererUnresponsive(WebContents* source) {}
    327 
    328   // Notification that the tab is no longer hung.
    329   virtual void RendererResponsive(WebContents* source) {}
    330 
    331   // Notification that a worker associated with this tab has crashed.
    332   virtual void WorkerCrashed(WebContents* source) {}
    333 
    334   // Invoked when a main fram navigation occurs.
    335   virtual void DidNavigateMainFramePostCommit(WebContents* source) {}
    336 
    337   // Invoked when navigating to a pending entry. When invoked the
    338   // NavigationController has configured its pending entry, but it has not yet
    339   // been committed.
    340   virtual void DidNavigateToPendingEntry(WebContents* source) {}
    341 
    342   // Returns a pointer to a service to manage JavaScript dialogs. May return
    343   // NULL in which case dialogs aren't shown.
    344   virtual JavaScriptDialogManager* GetJavaScriptDialogManager();
    345 
    346   // Called when color chooser should open. Returns the opened color chooser.
    347   // Returns NULL if we failed to open the color chooser (e.g. when there is a
    348   // ColorChooserDialog already open on Windows). Ownership of the returned
    349   // pointer is transferred to the caller.
    350   virtual ColorChooser* OpenColorChooser(
    351       WebContents* web_contents,
    352       SkColor color,
    353       const std::vector<ColorSuggestion>& suggestions);
    354 
    355   // Called when a file selection is to be done.
    356   virtual void RunFileChooser(WebContents* web_contents,
    357                               const FileChooserParams& params) {}
    358 
    359   // Request to enumerate a directory.  This is equivalent to running the file
    360   // chooser in directory-enumeration mode and having the user select the given
    361   // directory.
    362   virtual void EnumerateDirectory(WebContents* web_contents,
    363                                   int request_id,
    364                                   const base::FilePath& path) {}
    365 
    366   // Returns true if the delegate will embed a WebContents-owned fullscreen
    367   // render widget.  In this case, the delegate may access the widget by calling
    368   // WebContents::GetFullscreenRenderWidgetHostView().  If false is returned,
    369   // WebContents will be responsible for showing the fullscreen widget.
    370   virtual bool EmbedsFullscreenWidget() const;
    371 
    372   // Called when the renderer puts a tab into or out of fullscreen mode.
    373   virtual void ToggleFullscreenModeForTab(WebContents* web_contents,
    374                                           bool enter_fullscreen) {}
    375   virtual bool IsFullscreenForTabOrPending(
    376       const WebContents* web_contents) const;
    377 
    378   // Register a new handler for URL requests with the given scheme.
    379   // |user_gesture| is true if the registration is made in the context of a user
    380   // gesture.
    381   virtual void RegisterProtocolHandler(WebContents* web_contents,
    382                                        const std::string& protocol,
    383                                        const GURL& url,
    384                                        bool user_gesture) {}
    385 
    386   // Result of string search in the page. This includes the number of matches
    387   // found and the selection rect (in screen coordinates) for the string found.
    388   // If |final_update| is false, it indicates that more results follow.
    389   virtual void FindReply(WebContents* web_contents,
    390                          int request_id,
    391                          int number_of_matches,
    392                          const gfx::Rect& selection_rect,
    393                          int active_match_ordinal,
    394                          bool final_update) {}
    395 
    396 #if defined(OS_ANDROID)
    397   // Provides the rects of the current find-in-page matches.
    398   // Sent as a reply to RequestFindMatchRects.
    399   virtual void FindMatchRectsReply(WebContents* web_contents,
    400                                    int version,
    401                                    const std::vector<gfx::RectF>& rects,
    402                                    const gfx::RectF& active_rect) {}
    403 #endif
    404 
    405   // Invoked when the preferred size of the contents has been changed.
    406   virtual void UpdatePreferredSize(WebContents* web_contents,
    407                                    const gfx::Size& pref_size) {}
    408 
    409   // Invoked when the contents auto-resized and the container should match it.
    410   virtual void ResizeDueToAutoResize(WebContents* web_contents,
    411                                      const gfx::Size& new_size) {}
    412 
    413   // Notification message from HTML UI.
    414   virtual void WebUISend(WebContents* web_contents,
    415                          const GURL& source_url,
    416                          const std::string& name,
    417                          const base::ListValue& args) {}
    418 
    419   // Requests to lock the mouse. Once the request is approved or rejected,
    420   // GotResponseToLockMouseRequest() will be called on the requesting tab
    421   // contents.
    422   virtual void RequestToLockMouse(WebContents* web_contents,
    423                                   bool user_gesture,
    424                                   bool last_unlocked_by_target) {}
    425 
    426   // Notification that the page has lost the mouse lock.
    427   virtual void LostMouseLock() {}
    428 
    429   // Asks permission to use the camera and/or microphone. If permission is
    430   // granted, a call should be made to |callback| with the devices. If the
    431   // request is denied, a call should be made to |callback| with an empty list
    432   // of devices. |request| has the details of the request (e.g. which of audio
    433   // and/or video devices are requested, and lists of available devices).
    434   virtual void RequestMediaAccessPermission(
    435       WebContents* web_contents,
    436       const MediaStreamRequest& request,
    437       const MediaResponseCallback& callback);
    438 
    439   // Requests permission to access the PPAPI broker. The delegate should return
    440   // true and call the passed in |callback| with the result, or return false
    441   // to indicate that it does not support asking for permission.
    442   virtual bool RequestPpapiBrokerPermission(
    443       WebContents* web_contents,
    444       const GURL& url,
    445       const base::FilePath& plugin_path,
    446       const base::Callback<void(bool)>& callback);
    447 
    448   // Returns the size for the new render view created for the pending entry in
    449   // |web_contents|; if there's no size, returns an empty size.
    450   // This is optional for implementations of WebContentsDelegate; if the
    451   // delegate doesn't provide a size, the current WebContentsView's size will be
    452   // used.
    453   virtual gfx::Size GetSizeForNewRenderView(WebContents* web_contents) const;
    454 
    455   // Notification that validation of a form displayed by the |web_contents|
    456   // has failed. There can only be one message per |web_contents| at a time.
    457   virtual void ShowValidationMessage(WebContents* web_contents,
    458                                      const gfx::Rect& anchor_in_root_view,
    459                                      const base::string16& main_text,
    460                                      const base::string16& sub_text) {}
    461 
    462   // Notification that the delegate should hide any showing form validation
    463   // message.
    464   virtual void HideValidationMessage(WebContents* web_contents) {}
    465 
    466   // Notification that the form element that triggered the validation failure
    467   // has moved.
    468   virtual void MoveValidationMessage(WebContents* web_contents,
    469                                      const gfx::Rect& anchor_in_root_view) {}
    470 
    471   // Returns true if the WebContents is never visible.
    472   virtual bool IsNeverVisible(WebContents* web_contents);
    473 
    474  protected:
    475   virtual ~WebContentsDelegate();
    476 
    477  private:
    478   friend class WebContentsImpl;
    479 
    480   // Called when |this| becomes the WebContentsDelegate for |source|.
    481   void Attach(WebContents* source);
    482 
    483   // Called when |this| is no longer the WebContentsDelegate for |source|.
    484   void Detach(WebContents* source);
    485 
    486   // The WebContents that this is currently a delegate for.
    487   std::set<WebContents*> attached_contents_;
    488 };
    489 
    490 }  // namespace content
    491 
    492 #endif  // CONTENT_PUBLIC_BROWSER_WEB_CONTENTS_DELEGATE_H_
    493