• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "ipc/ipc_sender.h"
22 #include "third_party/skia/include/core/SkColor.h"
23 #include "ui/base/window_open_disposition.h"
24 #include "ui/gfx/native_widget_types.h"
25 #include "ui/gfx/size.h"
26 
27 #if defined(OS_ANDROID)
28 #include "base/android/scoped_java_ref.h"
29 #endif
30 
31 namespace base {
32 class TimeTicks;
33 }
34 
35 namespace gfx {
36 class Rect;
37 class Size;
38 }
39 
40 namespace net {
41 struct LoadStateWithParam;
42 }
43 
44 namespace content {
45 
46 class BrowserContext;
47 class InterstitialPage;
48 class PageState;
49 class RenderFrameHost;
50 class RenderProcessHost;
51 class RenderViewHost;
52 class RenderWidgetHostView;
53 class SiteInstance;
54 class WebContentsDelegate;
55 class WebContentsView;
56 struct RendererPreferences;
57 
58 // WebContents is the core class in content/. A WebContents renders web content
59 // (usually HTML) in a rectangular area.
60 //
61 // Instantiating one is simple:
62 //   scoped_ptr<content::WebContents> web_contents(
63 //       content::WebContents::Create(
64 //           content::WebContents::CreateParams(browser_context)));
65 //   gfx::NativeView view = web_contents->GetView()->GetNativeView();
66 //   // |view| is an HWND, NSView*, GtkWidget*, etc.; insert it into the view
67 //   // hierarchy wherever it needs to go.
68 //
69 // That's it; go to your kitchen, grab a scone, and chill. WebContents will do
70 // all the multi-process stuff behind the scenes. More details are at
71 // http://www.chromium.org/developers/design-documents/multi-process-architecture .
72 //
73 // Each WebContents has exactly one NavigationController; each
74 // NavigationController belongs to one WebContents. The NavigationController can
75 // be obtained from GetController(), and is used to load URLs into the
76 // WebContents, navigate it backwards/forwards, etc. See navigation_controller.h
77 // for more details.
78 class WebContents : public PageNavigator,
79                     public IPC::Sender,
80                     public base::SupportsUserData {
81  public:
82   struct CONTENT_EXPORT CreateParams {
83     explicit CreateParams(BrowserContext* context);
84     CreateParams(BrowserContext* context, SiteInstance* site);
85 
86     BrowserContext* browser_context;
87 
88     // Specifying a SiteInstance here is optional.  It can be set to avoid an
89     // extra process swap if the first navigation is expected to require a
90     // privileged process.
91     SiteInstance* site_instance;
92 
93     WebContents* opener;
94     int routing_id;
95     int main_frame_routing_id;
96 
97     // Initial size of the new WebContent's view. Can be (0, 0) if not needed.
98     gfx::Size initial_size;
99 
100     // True if the contents should be initially hidden.
101     bool initially_hidden;
102 
103     // Used to specify the location context which display the new view should
104     // belong. This can be NULL if not needed.
105     gfx::NativeView context;
106   };
107 
108   // Creates a new WebContents.
109   CONTENT_EXPORT static WebContents* Create(const CreateParams& params);
110 
111   // Similar to Create() above but should be used when you need to prepopulate
112   // the SessionStorageNamespaceMap of the WebContents. This can happen if
113   // you duplicate a WebContents, try to reconstitute it from a saved state,
114   // or when you create a new WebContents based on another one (eg., when
115   // servicing a window.open() call).
116   //
117   // You do not want to call this. If you think you do, make sure you completely
118   // understand when SessionStorageNamespace objects should be cloned, why
119   // they should not be shared by multiple WebContents, and what bad things
120   // can happen if you share the object.
121   CONTENT_EXPORT static WebContents* CreateWithSessionStorage(
122       const CreateParams& params,
123       const SessionStorageNamespaceMap& session_storage_namespace_map);
124 
125   // Returns a WebContents that wraps the RenderViewHost, or NULL if the
126   // render view host's delegate isn't a WebContents.
127   CONTENT_EXPORT static WebContents* FromRenderViewHost(
128       const RenderViewHost* rvh);
129 
~WebContents()130   virtual ~WebContents() {}
131 
132   // Intrinsic tab state -------------------------------------------------------
133 
134   // Gets/Sets the delegate.
135   virtual WebContentsDelegate* GetDelegate() = 0;
136   virtual void SetDelegate(WebContentsDelegate* delegate) = 0;
137 
138   // Gets the controller for this WebContents.
139   virtual NavigationController& GetController() = 0;
140   virtual const NavigationController& GetController() const = 0;
141 
142   // Returns the user browser context associated with this WebContents (via the
143   // NavigationController).
144   virtual content::BrowserContext* GetBrowserContext() const = 0;
145 
146   // Gets the URL that is currently being displayed, if there is one.
147   // This method is deprecated. DO NOT USE! Pick either |GetVisibleURL| or
148   // |GetLastCommittedURL| as appropriate.
149   virtual const GURL& GetURL() const = 0;
150 
151   // Gets the URL currently being displayed in the URL bar, if there is one.
152   // This URL might be a pending navigation that hasn't committed yet, so it is
153   // not guaranteed to match the current page in this WebContents. A typical
154   // example of this is interstitials, which show the URL of the new/loading
155   // page (active) but the security context is of the old page (last committed).
156   virtual const GURL& GetVisibleURL() const = 0;
157 
158   // Gets the last committed URL. It represents the current page that is
159   // displayed in  this WebContents. It represents the current security
160   // context.
161   virtual const GURL& GetLastCommittedURL() const = 0;
162 
163   // Return the currently active RenderProcessHost and RenderViewHost. Each of
164   // these may change over time.
165   virtual RenderProcessHost* GetRenderProcessHost() const = 0;
166 
167   // Returns the main frame for the currently active view.
168   virtual RenderFrameHost* GetMainFrame() = 0;
169 
170   // Gets the current RenderViewHost for this tab.
171   virtual RenderViewHost* GetRenderViewHost() const = 0;
172 
173   typedef base::Callback<void(RenderViewHost* /* render_view_host */,
174                               int /* x */,
175                               int /* y */)> GetRenderViewHostCallback;
176   // Gets the RenderViewHost at coordinates (|x|, |y|) for this WebContents via
177   // |callback|.
178   // This can be different than the current RenderViewHost if there is a
179   // BrowserPlugin at the specified position.
180   virtual void GetRenderViewHostAtPosition(
181       int x,
182       int y,
183       const GetRenderViewHostCallback& callback) = 0;
184 
185   // Returns the WebContents embedding this WebContents, if any.
186   // If this is a top-level WebContents then it returns NULL.
187   virtual WebContents* GetEmbedderWebContents() const = 0;
188 
189   // Gets the instance ID of the current WebContents if it is embedded
190   // within a BrowserPlugin. The instance ID of a WebContents uniquely
191   // identifies it within its embedder WebContents.
192   virtual int GetEmbeddedInstanceID() const = 0;
193 
194   // Gets the current RenderViewHost's routing id. Returns
195   // MSG_ROUTING_NONE when there is no RenderViewHost.
196   virtual int GetRoutingID() const = 0;
197 
198   // Returns the currently active RenderWidgetHostView. This may change over
199   // time and can be NULL (during setup and teardown).
200   virtual RenderWidgetHostView* GetRenderWidgetHostView() const = 0;
201 
202   // Returns the currently active fullscreen widget. If there is none, returns
203   // NULL.
204   virtual RenderWidgetHostView* GetFullscreenRenderWidgetHostView() const = 0;
205 
206   // The WebContentsView will never change and is guaranteed non-NULL.
207   virtual WebContentsView* GetView() const = 0;
208 
209   // Create a WebUI page for the given url. In most cases, this doesn't need to
210   // be called by embedders since content will create its own WebUI objects as
211   // necessary. However if the embedder wants to create its own WebUI object and
212   // keep track of it manually, it can use this.
213   virtual WebUI* CreateWebUI(const GURL& url) = 0;
214 
215   // Returns the committed WebUI if one exists, otherwise the pending one.
216   virtual WebUI* GetWebUI() const = 0;
217   virtual WebUI* GetCommittedWebUI() const = 0;
218 
219   // Allows overriding the user agent used for NavigationEntries it owns.
220   virtual void SetUserAgentOverride(const std::string& override) = 0;
221   virtual const std::string& GetUserAgentOverride() const = 0;
222 
223 #if defined(OS_WIN) && defined(USE_AURA)
224   virtual void SetParentNativeViewAccessible(
225       gfx::NativeViewAccessible accessible_parent) = 0;
226 #endif
227 
228   // Tab navigation state ------------------------------------------------------
229 
230   // Returns the current navigation properties, which if a navigation is
231   // pending may be provisional (e.g., the navigation could result in a
232   // download, in which case the URL would revert to what it was previously).
233   virtual const base::string16& GetTitle() const = 0;
234 
235   // The max page ID for any page that the current SiteInstance has loaded in
236   // this WebContents.  Page IDs are specific to a given SiteInstance and
237   // WebContents, corresponding to a specific RenderView in the renderer.
238   // Page IDs increase with each new page that is loaded by a tab.
239   virtual int32 GetMaxPageID() = 0;
240 
241   // The max page ID for any page that the given SiteInstance has loaded in
242   // this WebContents.
243   virtual int32 GetMaxPageIDForSiteInstance(SiteInstance* site_instance) = 0;
244 
245   // Returns the SiteInstance associated with the current page.
246   virtual SiteInstance* GetSiteInstance() const = 0;
247 
248   // Returns the SiteInstance for the pending navigation, if any.  Otherwise
249   // returns the current SiteInstance.
250   virtual SiteInstance* GetPendingSiteInstance() const = 0;
251 
252   // Return whether this WebContents is loading a resource.
253   virtual bool IsLoading() const = 0;
254 
255   // Returns whether this WebContents is waiting for a first-response for the
256   // main resource of the page.
257   virtual bool IsWaitingForResponse() const = 0;
258 
259   // Return the current load state and the URL associated with it.
260   virtual const net::LoadStateWithParam& GetLoadState() const = 0;
261   virtual const base::string16& GetLoadStateHost() const = 0;
262 
263   // Return the upload progress.
264   virtual uint64 GetUploadSize() const = 0;
265   virtual uint64 GetUploadPosition() const = 0;
266 
267   // Returns a set of the site URLs currently committed in this tab.
268   virtual std::set<GURL> GetSitesInTab() const = 0;
269 
270   // Return the character encoding of the page.
271   virtual const std::string& GetEncoding() const = 0;
272 
273   // True if this is a secure page which displayed insecure content.
274   virtual bool DisplayedInsecureContent() const = 0;
275 
276   // Internal state ------------------------------------------------------------
277 
278   // Indicates whether the WebContents is being captured (e.g., for screenshots
279   // or mirroring).  Increment calls must be balanced with an equivalent number
280   // of decrement calls.
281   virtual void IncrementCapturerCount() = 0;
282   virtual void DecrementCapturerCount() = 0;
283   virtual int GetCapturerCount() const = 0;
284 
285   // Indicates whether this tab should be considered crashed. The setter will
286   // also notify the delegate when the flag is changed.
287   virtual bool IsCrashed() const  = 0;
288   virtual void SetIsCrashed(base::TerminationStatus status, int error_code) = 0;
289 
290   virtual base::TerminationStatus GetCrashedStatus() const = 0;
291 
292   // Whether the tab is in the process of being destroyed.
293   virtual bool IsBeingDestroyed() const = 0;
294 
295   // Convenience method for notifying the delegate of a navigation state
296   // change. See InvalidateType enum.
297   virtual void NotifyNavigationStateChanged(unsigned changed_flags) = 0;
298 
299   // Get the last time that the WebContents was made visible with WasShown()
300   virtual base::TimeTicks GetLastSelectedTime() const = 0;
301 
302   // Invoked when the WebContents becomes shown/hidden.
303   virtual void WasShown() = 0;
304   virtual void WasHidden() = 0;
305 
306   // Returns true if the before unload and unload listeners need to be
307   // fired. The value of this changes over time. For example, if true and the
308   // before unload listener is executed and allows the user to exit, then this
309   // returns false.
310   virtual bool NeedToFireBeforeUnload() = 0;
311 
312   // Commands ------------------------------------------------------------------
313 
314   // Stop any pending navigation.
315   virtual void Stop() = 0;
316 
317   // Creates a new WebContents with the same state as this one. The returned
318   // heap-allocated pointer is owned by the caller.
319   virtual WebContents* Clone() = 0;
320 
321   // Views and focus -----------------------------------------------------------
322   // Focuses the first (last if |reverse| is true) element in the page.
323   // Invoked when this tab is getting the focus through tab traversal (|reverse|
324   // is true when using Shift-Tab).
325   virtual void FocusThroughTabTraversal(bool reverse) = 0;
326 
327   // Interstitials -------------------------------------------------------------
328 
329   // Various other systems need to know about our interstitials.
330   virtual bool ShowingInterstitialPage() const = 0;
331 
332   // Returns the currently showing interstitial, NULL if no interstitial is
333   // showing.
334   virtual InterstitialPage* GetInterstitialPage() const = 0;
335 
336   // Misc state & callbacks ----------------------------------------------------
337 
338   // Check whether we can do the saving page operation this page given its MIME
339   // type.
340   virtual bool IsSavable() = 0;
341 
342   // Prepare for saving the current web page to disk.
343   virtual void OnSavePage() = 0;
344 
345   // Save page with the main HTML file path, the directory for saving resources,
346   // and the save type: HTML only or complete web page. Returns true if the
347   // saving process has been initiated successfully.
348   virtual bool SavePage(const base::FilePath& main_file,
349                         const base::FilePath& dir_path,
350                         SavePageType save_type) = 0;
351 
352   // Saves the given frame's URL to the local filesystem..
353   virtual void SaveFrame(const GURL& url,
354                          const Referrer& referrer) = 0;
355 
356   // Generate an MHTML representation of the current page in the given file.
357   virtual void GenerateMHTML(
358       const base::FilePath& file,
359       const base::Callback<void(
360           int64 /* size of the file */)>& callback) = 0;
361 
362   // Returns true if the active NavigationEntry's page_id equals page_id.
363   virtual bool IsActiveEntry(int32 page_id) = 0;
364 
365   // Returns the contents MIME type after a navigation.
366   virtual const std::string& GetContentsMimeType() const = 0;
367 
368   // Returns true if this WebContents will notify about disconnection.
369   virtual bool WillNotifyDisconnection() const = 0;
370 
371   // Override the encoding and reload the page by sending down
372   // ViewMsg_SetPageEncoding to the renderer. |UpdateEncoding| is kinda
373   // the opposite of this, by which 'browser' is notified of
374   // the encoding of the current tab from 'renderer' (determined by
375   // auto-detect, http header, meta, bom detection, etc).
376   virtual void SetOverrideEncoding(const std::string& encoding) = 0;
377 
378   // Remove any user-defined override encoding and reload by sending down
379   // ViewMsg_ResetPageEncodingToDefault to the renderer.
380   virtual void ResetOverrideEncoding() = 0;
381 
382   // Returns the settings which get passed to the renderer.
383   virtual content::RendererPreferences* GetMutableRendererPrefs() = 0;
384 
385   // Tells the tab to close now. The tab will take care not to close until it's
386   // out of nested message loops.
387   virtual void Close() = 0;
388 
389   // A render view-originated drag has ended. Informs the render view host and
390   // WebContentsDelegate.
391   virtual void SystemDragEnded() = 0;
392 
393   // Notification the user has made a gesture while focus was on the
394   // page. This is used to avoid uninitiated user downloads (aka carpet
395   // bombing), see DownloadRequestLimiter for details.
396   virtual void UserGestureDone() = 0;
397 
398   // Indicates if this tab was explicitly closed by the user (control-w, close
399   // tab menu item...). This is false for actions that indirectly close the tab,
400   // such as closing the window.  The setter is maintained by TabStripModel, and
401   // the getter only useful from within TAB_CLOSED notification
402   virtual void SetClosedByUserGesture(bool value) = 0;
403   virtual bool GetClosedByUserGesture() const = 0;
404 
405   // Gets the zoom level for this tab.
406   virtual double GetZoomLevel() const = 0;
407 
408   // Gets the zoom percent for this tab.
409   virtual int GetZoomPercent(bool* enable_increment,
410                              bool* enable_decrement) const = 0;
411 
412   // Opens view-source tab for this contents.
413   virtual void ViewSource() = 0;
414 
415   virtual void ViewFrameSource(const GURL& url,
416                                const PageState& page_state)= 0;
417 
418   // Gets the minimum/maximum zoom percent.
419   virtual int GetMinimumZoomPercent() const = 0;
420   virtual int GetMaximumZoomPercent() const = 0;
421 
422   // Gets the preferred size of the contents.
423   virtual gfx::Size GetPreferredSize() const = 0;
424 
425   // Called when the reponse to a pending mouse lock request has arrived.
426   // Returns true if |allowed| is true and the mouse has been successfully
427   // locked.
428   virtual bool GotResponseToLockMouseRequest(bool allowed) = 0;
429 
430   // Called when the user has selected a color in the color chooser.
431   virtual void DidChooseColorInColorChooser(SkColor color) = 0;
432 
433   // Called when the color chooser has ended.
434   virtual void DidEndColorChooser() = 0;
435 
436   // Returns true if the location bar should be focused by default rather than
437   // the page contents. The view calls this function when the tab is focused
438   // to see what it should do.
439   virtual bool FocusLocationBarByDefault() = 0;
440 
441   // Does this have an opener associated with it?
442   virtual bool HasOpener() const = 0;
443 
444   typedef base::Callback<void(
445       int, /* id */
446       int, /* HTTP status code */
447       const GURL&, /* image_url */
448       const std::vector<SkBitmap>&, /* bitmaps */
449       /* The sizes in pixel of the bitmaps before they were resized due to the
450          max bitmap size passed to DownloadImage(). Each entry in the bitmaps
451          vector corresponds to an entry in the sizes vector. If a bitmap was
452          resized, there should be a single returned bitmap. */
453       const std::vector<gfx::Size>&)>
454           ImageDownloadCallback;
455 
456   // Sends a request to download the given image |url| and returns the unique
457   // id of the download request. When the download is finished, |callback| will
458   // be called with the bitmaps received from the renderer. If |is_favicon| is
459   // true, the cookies are not sent and not accepted during download.
460   // Bitmaps with pixel sizes larger than |max_bitmap_size| are filtered out
461   // from the bitmap results. If there are no bitmap results <=
462   // |max_bitmap_size|, the smallest bitmap is resized to |max_bitmap_size| and
463   // is the only result. A |max_bitmap_size| of 0 means unlimited.
464   virtual int DownloadImage(const GURL& url,
465                             bool is_favicon,
466                             uint32_t max_bitmap_size,
467                             const ImageDownloadCallback& callback) = 0;
468 
469   // Sets the zoom level for the current page and all BrowserPluginGuests
470   // within the page.
471   virtual void SetZoomLevel(double level) = 0;
472 
473 #if defined(OS_ANDROID)
474   CONTENT_EXPORT static WebContents* FromJavaWebContents(
475       jobject jweb_contents_android);
476   virtual base::android::ScopedJavaLocalRef<jobject> GetJavaWebContents() = 0;
477 #endif  // OS_ANDROID
478 
479  private:
480   // This interface should only be implemented inside content.
481   friend class WebContentsImpl;
WebContents()482   WebContents() {}
483 };
484 
485 }  // namespace content
486 
487 #endif  // CONTENT_PUBLIC_BROWSER_WEB_CONTENTS_H_
488