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_H_
6#define CONTENT_PUBLIC_BROWSER_WEB_CONTENTS_H_
7
8#include <set>
9
10#include "base/basictypes.h"
11#include "base/callback_forward.h"
12#include "base/files/file_path.h"
13#include "base/process/kill.h"
14#include "base/strings/string16.h"
15#include "base/supports_user_data.h"
16#include "content/common/content_export.h"
17#include "content/public/browser/navigation_controller.h"
18#include "content/public/browser/page_navigator.h"
19#include "content/public/browser/save_page_type.h"
20#include "content/public/browser/web_ui.h"
21#include "content/public/common/stop_find_action.h"
22#include "ipc/ipc_sender.h"
23#include "third_party/skia/include/core/SkColor.h"
24#include "ui/base/window_open_disposition.h"
25#include "ui/gfx/native_widget_types.h"
26#include "ui/gfx/rect.h"
27
28#if defined(OS_ANDROID)
29#include "base/android/scoped_java_ref.h"
30#endif
31
32namespace base {
33class DictionaryValue;
34class TimeTicks;
35}
36
37namespace blink {
38struct WebFindOptions;
39}
40
41namespace net {
42struct LoadStateWithParam;
43}
44
45namespace content {
46
47class BrowserContext;
48class InterstitialPage;
49class PageState;
50class RenderFrameHost;
51class RenderProcessHost;
52class RenderViewHost;
53class RenderWidgetHostView;
54class SiteInstance;
55class WebContentsDelegate;
56struct CustomContextMenuContext;
57struct DropData;
58struct RendererPreferences;
59
60// WebContents is the core class in content/. A WebContents renders web content
61// (usually HTML) in a rectangular area.
62//
63// Instantiating one is simple:
64//   scoped_ptr<content::WebContents> web_contents(
65//       content::WebContents::Create(
66//           content::WebContents::CreateParams(browser_context)));
67//   gfx::NativeView view = web_contents->GetNativeView();
68//   // |view| is an HWND, NSView*, GtkWidget*, etc.; insert it into the view
69//   // hierarchy wherever it needs to go.
70//
71// That's it; go to your kitchen, grab a scone, and chill. WebContents will do
72// all the multi-process stuff behind the scenes. More details are at
73// http://www.chromium.org/developers/design-documents/multi-process-architecture .
74//
75// Each WebContents has exactly one NavigationController; each
76// NavigationController belongs to one WebContents. The NavigationController can
77// be obtained from GetController(), and is used to load URLs into the
78// WebContents, navigate it backwards/forwards, etc. See navigation_controller.h
79// for more details.
80class WebContents : public PageNavigator,
81                    public IPC::Sender,
82                    public base::SupportsUserData {
83 public:
84  struct CONTENT_EXPORT CreateParams {
85    explicit CreateParams(BrowserContext* context);
86    ~CreateParams();
87    CreateParams(BrowserContext* context, SiteInstance* site);
88
89    BrowserContext* browser_context;
90
91    // Specifying a SiteInstance here is optional.  It can be set to avoid an
92    // extra process swap if the first navigation is expected to require a
93    // privileged process.
94    SiteInstance* site_instance;
95
96    // The opener WebContents is the WebContents that initiated this request,
97    // if any.
98    WebContents* opener;
99
100    // If the opener is suppressed, then the new WebContents doesn't hold a
101    // reference to its opener.
102    bool opener_suppressed;
103    int routing_id;
104    int main_frame_routing_id;
105
106    // Initial size of the new WebContent's view. Can be (0, 0) if not needed.
107    gfx::Size initial_size;
108
109    // True if the contents should be initially hidden.
110    bool initially_hidden;
111
112    // If this instance ID is non-zero then it indicates that this WebContents
113    // should behave as a guest.
114    int guest_instance_id;
115
116    // TODO(fsamuel): This is temporary. Remove this once all guests are created
117    // from the content embedder.
118    scoped_ptr<base::DictionaryValue> guest_extra_params;
119
120    // Used to specify the location context which display the new view should
121    // belong. This can be NULL if not needed.
122    gfx::NativeView context;
123  };
124
125  // Creates a new WebContents.
126  CONTENT_EXPORT static WebContents* Create(const CreateParams& params);
127
128  // Similar to Create() above but should be used when you need to prepopulate
129  // the SessionStorageNamespaceMap of the WebContents. This can happen if
130  // you duplicate a WebContents, try to reconstitute it from a saved state,
131  // or when you create a new WebContents based on another one (eg., when
132  // servicing a window.open() call).
133  //
134  // You do not want to call this. If you think you do, make sure you completely
135  // understand when SessionStorageNamespace objects should be cloned, why
136  // they should not be shared by multiple WebContents, and what bad things
137  // can happen if you share the object.
138  CONTENT_EXPORT static WebContents* CreateWithSessionStorage(
139      const CreateParams& params,
140      const SessionStorageNamespaceMap& session_storage_namespace_map);
141
142  // Returns a WebContents that wraps the RenderViewHost, or NULL if the
143  // render view host's delegate isn't a WebContents.
144  CONTENT_EXPORT static WebContents* FromRenderViewHost(
145      const RenderViewHost* rvh);
146
147  CONTENT_EXPORT static WebContents* FromRenderFrameHost(RenderFrameHost* rfh);
148
149  virtual ~WebContents() {}
150
151  // Intrinsic tab state -------------------------------------------------------
152
153  // Gets/Sets the delegate.
154  virtual WebContentsDelegate* GetDelegate() = 0;
155  virtual void SetDelegate(WebContentsDelegate* delegate) = 0;
156
157  // Gets the controller for this WebContents.
158  virtual NavigationController& GetController() = 0;
159  virtual const NavigationController& GetController() const = 0;
160
161  // Returns the user browser context associated with this WebContents (via the
162  // NavigationController).
163  virtual content::BrowserContext* GetBrowserContext() const = 0;
164
165  // Gets the URL that is currently being displayed, if there is one.
166  // This method is deprecated. DO NOT USE! Pick either |GetVisibleURL| or
167  // |GetLastCommittedURL| as appropriate.
168  virtual const GURL& GetURL() const = 0;
169
170  // Gets the URL currently being displayed in the URL bar, if there is one.
171  // This URL might be a pending navigation that hasn't committed yet, so it is
172  // not guaranteed to match the current page in this WebContents. A typical
173  // example of this is interstitials, which show the URL of the new/loading
174  // page (active) but the security context is of the old page (last committed).
175  virtual const GURL& GetVisibleURL() const = 0;
176
177  // Gets the last committed URL. It represents the current page that is
178  // displayed in this WebContents. It represents the current security
179  // context.
180  virtual const GURL& GetLastCommittedURL() const = 0;
181
182  // Return the currently active RenderProcessHost and RenderViewHost. Each of
183  // these may change over time.
184  virtual RenderProcessHost* GetRenderProcessHost() const = 0;
185
186  // Returns the main frame for the currently active view.
187  virtual RenderFrameHost* GetMainFrame() = 0;
188
189  // Returns the focused frame for the currently active view.
190  virtual RenderFrameHost* GetFocusedFrame() = 0;
191
192  // Calls |on_frame| for each frame in the currently active view.
193  virtual void ForEachFrame(
194      const base::Callback<void(RenderFrameHost*)>& on_frame) = 0;
195
196  // Sends the given IPC to all frames in the currently active view. This is a
197  // convenience method instead of calling ForEach.
198  virtual void SendToAllFrames(IPC::Message* message) = 0;
199
200  // Gets the current RenderViewHost for this tab.
201  virtual RenderViewHost* GetRenderViewHost() const = 0;
202
203  // Gets the current RenderViewHost's routing id. Returns
204  // MSG_ROUTING_NONE when there is no RenderViewHost.
205  virtual int GetRoutingID() const = 0;
206
207  // Returns the currently active RenderWidgetHostView. This may change over
208  // time and can be NULL (during setup and teardown).
209  virtual RenderWidgetHostView* GetRenderWidgetHostView() const = 0;
210
211  // Returns the currently active fullscreen widget. If there is none, returns
212  // NULL.
213  virtual RenderWidgetHostView* GetFullscreenRenderWidgetHostView() const = 0;
214
215  // Create a WebUI page for the given url. In most cases, this doesn't need to
216  // be called by embedders since content will create its own WebUI objects as
217  // necessary. However if the embedder wants to create its own WebUI object and
218  // keep track of it manually, it can use this.
219  virtual WebUI* CreateWebUI(const GURL& url) = 0;
220
221  // Returns the committed WebUI if one exists, otherwise the pending one.
222  virtual WebUI* GetWebUI() const = 0;
223  virtual WebUI* GetCommittedWebUI() const = 0;
224
225  // Allows overriding the user agent used for NavigationEntries it owns.
226  virtual void SetUserAgentOverride(const std::string& override) = 0;
227  virtual const std::string& GetUserAgentOverride() const = 0;
228
229#if defined(OS_WIN)
230  virtual void SetParentNativeViewAccessible(
231      gfx::NativeViewAccessible accessible_parent) = 0;
232#endif
233
234  // Tab navigation state ------------------------------------------------------
235
236  // Returns the current navigation properties, which if a navigation is
237  // pending may be provisional (e.g., the navigation could result in a
238  // download, in which case the URL would revert to what it was previously).
239  virtual const base::string16& GetTitle() const = 0;
240
241  // The max page ID for any page that the current SiteInstance has loaded in
242  // this WebContents.  Page IDs are specific to a given SiteInstance and
243  // WebContents, corresponding to a specific RenderView in the renderer.
244  // Page IDs increase with each new page that is loaded by a tab.
245  virtual int32 GetMaxPageID() = 0;
246
247  // The max page ID for any page that the given SiteInstance has loaded in
248  // this WebContents.
249  virtual int32 GetMaxPageIDForSiteInstance(SiteInstance* site_instance) = 0;
250
251  // Returns the SiteInstance associated with the current page.
252  virtual SiteInstance* GetSiteInstance() const = 0;
253
254  // Returns the SiteInstance for the pending navigation, if any.  Otherwise
255  // returns the current SiteInstance.
256  virtual SiteInstance* GetPendingSiteInstance() const = 0;
257
258  // Returns whether this WebContents is loading a resource.
259  virtual bool IsLoading() const = 0;
260
261  // Returns whether this WebContents is loading and and the load is to a
262  // different top-level document (rather than being a navigation within the
263  // same document). This being true implies that IsLoading() is also true.
264  virtual bool IsLoadingToDifferentDocument() const = 0;
265
266  // Returns whether this WebContents is waiting for a first-response for the
267  // main resource of the page.
268  virtual bool IsWaitingForResponse() const = 0;
269
270  // Returns the current load state and the URL associated with it.
271  virtual const net::LoadStateWithParam& GetLoadState() const = 0;
272  virtual const base::string16& GetLoadStateHost() const = 0;
273
274  // Returns the upload progress.
275  virtual uint64 GetUploadSize() const = 0;
276  virtual uint64 GetUploadPosition() const = 0;
277
278  // Returns a set of the site URLs currently committed in this tab.
279  virtual std::set<GURL> GetSitesInTab() const = 0;
280
281  // Returns the character encoding of the page.
282  virtual const std::string& GetEncoding() const = 0;
283
284  // True if this is a secure page which displayed insecure content.
285  virtual bool DisplayedInsecureContent() const = 0;
286
287  // Internal state ------------------------------------------------------------
288
289  // Indicates whether the WebContents is being captured (e.g., for screenshots
290  // or mirroring).  Increment calls must be balanced with an equivalent number
291  // of decrement calls.  |capture_size| specifies the capturer's video
292  // resolution, but can be empty to mean "unspecified."  The first screen
293  // capturer that provides a non-empty |capture_size| will override the value
294  // returned by GetPreferredSize() until all captures have ended.
295  virtual void IncrementCapturerCount(const gfx::Size& capture_size) = 0;
296  virtual void DecrementCapturerCount() = 0;
297  virtual int GetCapturerCount() const = 0;
298
299  // Indicates whether this tab should be considered crashed. The setter will
300  // also notify the delegate when the flag is changed.
301  virtual bool IsCrashed() const  = 0;
302  virtual void SetIsCrashed(base::TerminationStatus status, int error_code) = 0;
303
304  virtual base::TerminationStatus GetCrashedStatus() const = 0;
305
306  // Whether the tab is in the process of being destroyed.
307  virtual bool IsBeingDestroyed() const = 0;
308
309  // Convenience method for notifying the delegate of a navigation state
310  // change. See InvalidateType enum.
311  virtual void NotifyNavigationStateChanged(unsigned changed_flags) = 0;
312
313  // Get the last time that the WebContents was made active (either when it was
314  // created or shown with WasShown()).
315  virtual base::TimeTicks GetLastActiveTime() const = 0;
316
317  // Invoked when the WebContents becomes shown/hidden.
318  virtual void WasShown() = 0;
319  virtual void WasHidden() = 0;
320
321  // Returns true if the before unload and unload listeners need to be
322  // fired. The value of this changes over time. For example, if true and the
323  // before unload listener is executed and allows the user to exit, then this
324  // returns false.
325  virtual bool NeedToFireBeforeUnload() = 0;
326
327  // Runs the beforeunload handler for the main frame. See also ClosePage and
328  // SwapOut in RenderViewHost, which run the unload handler.
329  //
330  // |for_cross_site_transition| indicates whether this call is for the current
331  // frame during a cross-process navigation. False means we're closing the
332  // entire tab.
333  //
334  // TODO(creis): We should run the beforeunload handler for every frame that
335  // has one.
336  virtual void DispatchBeforeUnload(bool for_cross_site_transition) = 0;
337
338  // Commands ------------------------------------------------------------------
339
340  // Stop any pending navigation.
341  virtual void Stop() = 0;
342
343  // Creates a new WebContents with the same state as this one. The returned
344  // heap-allocated pointer is owned by the caller.
345  virtual WebContents* Clone() = 0;
346
347  // Reloads the focused frame.
348  virtual void ReloadFocusedFrame(bool ignore_cache) = 0;
349
350  // Editing commands ----------------------------------------------------------
351
352  virtual void Undo() = 0;
353  virtual void Redo() = 0;
354  virtual void Cut() = 0;
355  virtual void Copy() = 0;
356  virtual void CopyToFindPboard() = 0;
357  virtual void Paste() = 0;
358  virtual void PasteAndMatchStyle() = 0;
359  virtual void Delete() = 0;
360  virtual void SelectAll() = 0;
361  virtual void Unselect() = 0;
362
363  // Replaces the currently selected word or a word around the cursor.
364  virtual void Replace(const base::string16& word) = 0;
365
366  // Replaces the misspelling in the current selection.
367  virtual void ReplaceMisspelling(const base::string16& word) = 0;
368
369  // Let the renderer know that the menu has been closed.
370  virtual void NotifyContextMenuClosed(
371      const CustomContextMenuContext& context) = 0;
372
373  // Executes custom context menu action that was provided from Blink.
374  virtual void ExecuteCustomContextMenuCommand(
375      int action, const CustomContextMenuContext& context) = 0;
376
377  // Views and focus -----------------------------------------------------------
378
379  // Returns the native widget that contains the contents of the tab.
380  virtual gfx::NativeView GetNativeView() = 0;
381
382  // Returns the native widget with the main content of the tab (i.e. the main
383  // render view host, though there may be many popups in the tab as children of
384  // the container).
385  virtual gfx::NativeView GetContentNativeView() = 0;
386
387  // Returns the outermost native view. This will be used as the parent for
388  // dialog boxes.
389  virtual gfx::NativeWindow GetTopLevelNativeWindow() = 0;
390
391  // Computes the rectangle for the native widget that contains the contents of
392  // the tab in the screen coordinate system.
393  virtual gfx::Rect GetContainerBounds() = 0;
394
395  // Get the bounds of the View, relative to the parent.
396  virtual gfx::Rect GetViewBounds() = 0;
397
398  // Returns the current drop data, if any.
399  virtual DropData* GetDropData() = 0;
400
401  // Sets focus to the native widget for this tab.
402  virtual void Focus() = 0;
403
404  // Sets focus to the appropriate element when the WebContents is shown the
405  // first time.
406  virtual void SetInitialFocus() = 0;
407
408  // Stores the currently focused view.
409  virtual void StoreFocus() = 0;
410
411  // Restores focus to the last focus view. If StoreFocus has not yet been
412  // invoked, SetInitialFocus is invoked.
413  virtual void RestoreFocus() = 0;
414
415  // Focuses the first (last if |reverse| is true) element in the page.
416  // Invoked when this tab is getting the focus through tab traversal (|reverse|
417  // is true when using Shift-Tab).
418  virtual void FocusThroughTabTraversal(bool reverse) = 0;
419
420  // Interstitials -------------------------------------------------------------
421
422  // Various other systems need to know about our interstitials.
423  virtual bool ShowingInterstitialPage() const = 0;
424
425  // Returns the currently showing interstitial, NULL if no interstitial is
426  // showing.
427  virtual InterstitialPage* GetInterstitialPage() const = 0;
428
429  // Misc state & callbacks ----------------------------------------------------
430
431  // Check whether we can do the saving page operation this page given its MIME
432  // type.
433  virtual bool IsSavable() = 0;
434
435  // Prepare for saving the current web page to disk.
436  virtual void OnSavePage() = 0;
437
438  // Save page with the main HTML file path, the directory for saving resources,
439  // and the save type: HTML only or complete web page. Returns true if the
440  // saving process has been initiated successfully.
441  virtual bool SavePage(const base::FilePath& main_file,
442                        const base::FilePath& dir_path,
443                        SavePageType save_type) = 0;
444
445  // Saves the given frame's URL to the local filesystem..
446  virtual void SaveFrame(const GURL& url,
447                         const Referrer& referrer) = 0;
448
449  // Generate an MHTML representation of the current page in the given file.
450  virtual void GenerateMHTML(
451      const base::FilePath& file,
452      const base::Callback<void(
453          int64 /* size of the file */)>& callback) = 0;
454
455  // Returns the contents MIME type after a navigation.
456  virtual const std::string& GetContentsMimeType() const = 0;
457
458  // Returns true if this WebContents will notify about disconnection.
459  virtual bool WillNotifyDisconnection() const = 0;
460
461  // Override the encoding and reload the page by sending down
462  // ViewMsg_SetPageEncoding to the renderer. |UpdateEncoding| is kinda
463  // the opposite of this, by which 'browser' is notified of
464  // the encoding of the current tab from 'renderer' (determined by
465  // auto-detect, http header, meta, bom detection, etc).
466  virtual void SetOverrideEncoding(const std::string& encoding) = 0;
467
468  // Remove any user-defined override encoding and reload by sending down
469  // ViewMsg_ResetPageEncodingToDefault to the renderer.
470  virtual void ResetOverrideEncoding() = 0;
471
472  // Returns the settings which get passed to the renderer.
473  virtual content::RendererPreferences* GetMutableRendererPrefs() = 0;
474
475  // Tells the tab to close now. The tab will take care not to close until it's
476  // out of nested message loops.
477  virtual void Close() = 0;
478
479  // A render view-originated drag has ended. Informs the render view host and
480  // WebContentsDelegate.
481  virtual void SystemDragEnded() = 0;
482
483  // Notification the user has made a gesture while focus was on the
484  // page. This is used to avoid uninitiated user downloads (aka carpet
485  // bombing), see DownloadRequestLimiter for details.
486  virtual void UserGestureDone() = 0;
487
488  // Indicates if this tab was explicitly closed by the user (control-w, close
489  // tab menu item...). This is false for actions that indirectly close the tab,
490  // such as closing the window.  The setter is maintained by TabStripModel, and
491  // the getter only useful from within TAB_CLOSED notification
492  virtual void SetClosedByUserGesture(bool value) = 0;
493  virtual bool GetClosedByUserGesture() const = 0;
494
495  // Gets the zoom percent for this tab.
496  virtual int GetZoomPercent(bool* enable_increment,
497                             bool* enable_decrement) const = 0;
498
499  // Opens view-source tab for this contents.
500  virtual void ViewSource() = 0;
501
502  virtual void ViewFrameSource(const GURL& url,
503                               const PageState& page_state)= 0;
504
505  // Gets the minimum/maximum zoom percent.
506  virtual int GetMinimumZoomPercent() const = 0;
507  virtual int GetMaximumZoomPercent() const = 0;
508
509  // Gets the preferred size of the contents.
510  virtual gfx::Size GetPreferredSize() const = 0;
511
512  // Called when the reponse to a pending mouse lock request has arrived.
513  // Returns true if |allowed| is true and the mouse has been successfully
514  // locked.
515  virtual bool GotResponseToLockMouseRequest(bool allowed) = 0;
516
517  // Called when the user has selected a color in the color chooser.
518  virtual void DidChooseColorInColorChooser(SkColor color) = 0;
519
520  // Called when the color chooser has ended.
521  virtual void DidEndColorChooser() = 0;
522
523  // Returns true if the location bar should be focused by default rather than
524  // the page contents. The view calls this function when the tab is focused
525  // to see what it should do.
526  virtual bool FocusLocationBarByDefault() = 0;
527
528  // Does this have an opener associated with it?
529  virtual bool HasOpener() const = 0;
530
531  typedef base::Callback<void(
532      int, /* id */
533      int, /* HTTP status code */
534      const GURL&, /* image_url */
535      const std::vector<SkBitmap>&, /* bitmaps */
536      /* The sizes in pixel of the bitmaps before they were resized due to the
537         max bitmap size passed to DownloadImage(). Each entry in the bitmaps
538         vector corresponds to an entry in the sizes vector. If a bitmap was
539         resized, there should be a single returned bitmap. */
540      const std::vector<gfx::Size>&)>
541          ImageDownloadCallback;
542
543  // Sends a request to download the given image |url| and returns the unique
544  // id of the download request. When the download is finished, |callback| will
545  // be called with the bitmaps received from the renderer. If |is_favicon| is
546  // true, the cookies are not sent and not accepted during download.
547  // Bitmaps with pixel sizes larger than |max_bitmap_size| are filtered out
548  // from the bitmap results. If there are no bitmap results <=
549  // |max_bitmap_size|, the smallest bitmap is resized to |max_bitmap_size| and
550  // is the only result. A |max_bitmap_size| of 0 means unlimited.
551  virtual int DownloadImage(const GURL& url,
552                            bool is_favicon,
553                            uint32_t max_bitmap_size,
554                            const ImageDownloadCallback& callback) = 0;
555
556  // Returns true if the WebContents is responsible for displaying a subframe
557  // in a different process from its parent page.
558  // TODO: this doesn't really belong here. With site isolation, this should be
559  // removed since we can then embed iframes in different processes.
560  virtual bool IsSubframe() const = 0;
561
562  // Finds text on a page.
563  virtual void Find(int request_id,
564                    const base::string16& search_text,
565                    const blink::WebFindOptions& options) = 0;
566
567  // Notifies the renderer that the user has closed the FindInPage window
568  // (and what action to take regarding the selection).
569  virtual void StopFinding(StopFindAction action) = 0;
570
571  // Requests the renderer to insert CSS into the main frame's document.
572  virtual void InsertCSS(const std::string& css) = 0;
573
574#if defined(OS_ANDROID)
575  CONTENT_EXPORT static WebContents* FromJavaWebContents(
576      jobject jweb_contents_android);
577  virtual base::android::ScopedJavaLocalRef<jobject> GetJavaWebContents() = 0;
578#elif defined(OS_MACOSX)
579  // The web contents view assumes that its view will never be overlapped by
580  // another view (either partially or fully). This allows it to perform
581  // optimizations. If the view is in a view hierarchy where it might be
582  // overlapped by another view, notify the view by calling this with |true|.
583  virtual void SetAllowOverlappingViews(bool overlapping) = 0;
584
585  // Returns true if overlapping views are allowed, false otherwise.
586  virtual bool GetAllowOverlappingViews() = 0;
587
588  // To draw two overlapping web contents view, the underlaying one should
589  // know about the overlaying one. Caller must ensure that |overlay| exists
590  // until |RemoveOverlayView| is called.
591  virtual void SetOverlayView(WebContents* overlay,
592                              const gfx::Point& offset) = 0;
593
594  // Removes the previously set overlay view.
595  virtual void RemoveOverlayView() = 0;
596#endif  // OS_ANDROID
597
598 private:
599  // This interface should only be implemented inside content.
600  friend class WebContentsImpl;
601  WebContents() {}
602};
603
604}  // namespace content
605
606#endif  // CONTENT_PUBLIC_BROWSER_WEB_CONTENTS_H_
607