- add sources.
[platform/framework/web/crosswalk.git] / src / content / public / browser / navigation_controller.h
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_NAVIGATION_CONTROLLER_H_
6 #define CONTENT_PUBLIC_BROWSER_NAVIGATION_CONTROLLER_H_
7
8 #include <map>
9 #include <string>
10 #include <vector>
11
12 #include "base/memory/ref_counted.h"
13 #include "base/strings/string16.h"
14 #include "content/common/content_export.h"
15 #include "content/public/browser/global_request_id.h"
16 #include "content/public/common/page_transition_types.h"
17 #include "content/public/common/referrer.h"
18 #include "url/gurl.h"
19
20 namespace base {
21
22 class RefCountedMemory;
23
24 }  // namespace base
25
26 namespace content {
27
28 class BrowserContext;
29 class NavigationEntry;
30 class SessionStorageNamespace;
31 class WebContents;
32
33 // Used to store the mapping of a StoragePartition id to
34 // SessionStorageNamespace.
35 typedef std::map<std::string, scoped_refptr<SessionStorageNamespace> >
36     SessionStorageNamespaceMap;
37
38 // A NavigationController maintains the back-forward list for a WebContents and
39 // manages all navigation within that list.
40 //
41 // Each NavigationController belongs to one WebContents; each WebContents has
42 // exactly one NavigationController.
43 class NavigationController {
44  public:
45   enum ReloadType {
46     NO_RELOAD,                   // Normal load.
47     RELOAD,                      // Normal (cache-validating) reload.
48     RELOAD_IGNORING_CACHE,       // Reload bypassing the cache (shift-reload).
49     RELOAD_ORIGINAL_REQUEST_URL  // Reload using the original request URL.
50   };
51
52   // Load type used in LoadURLParams.
53   enum LoadURLType {
54     // For loads that do not fall into any types below.
55     LOAD_TYPE_DEFAULT,
56
57     // An http post load request initiated from browser side.
58     // The post data is passed in |browser_initiated_post_data|.
59     LOAD_TYPE_BROWSER_INITIATED_HTTP_POST,
60
61     // Loads a 'data:' scheme URL with specified base URL and a history entry
62     // URL. This is only safe to be used for browser-initiated data: URL
63     // navigations, since it shows arbitrary content as if it comes from
64     // |virtual_url_for_data_url|.
65     LOAD_TYPE_DATA
66
67     // Adding new LoadURLType? Also update LoadUrlParams.java static constants.
68   };
69
70   // User agent override type used in LoadURLParams.
71   enum UserAgentOverrideOption {
72     // Use the override value from the previous NavigationEntry in the
73     // NavigationController.
74     UA_OVERRIDE_INHERIT,
75
76     // Use the default user agent.
77     UA_OVERRIDE_FALSE,
78
79     // Use the user agent override, if it's available.
80     UA_OVERRIDE_TRUE
81
82     // Adding new UserAgentOverrideOption? Also update LoadUrlParams.java
83     // static constants.
84   };
85
86   enum RestoreType {
87     // Indicates the restore is from the current session. For example, restoring
88     // a closed tab.
89     RESTORE_CURRENT_SESSION,
90
91     // Restore from the previous session.
92     RESTORE_LAST_SESSION_EXITED_CLEANLY,
93     RESTORE_LAST_SESSION_CRASHED,
94   };
95
96   // Creates a navigation entry and translates the virtual url to a real one.
97   // This is a general call; prefer LoadURL[FromRenderer]/TransferURL below.
98   // Extra headers are separated by \n.
99   CONTENT_EXPORT static NavigationEntry* CreateNavigationEntry(
100       const GURL& url,
101       const Referrer& referrer,
102       PageTransition transition,
103       bool is_renderer_initiated,
104       const std::string& extra_headers,
105       BrowserContext* browser_context);
106
107   // Extra optional parameters for LoadURLWithParams.
108   struct CONTENT_EXPORT LoadURLParams {
109     // The url to load. This field is required.
110     GURL url;
111
112     // See LoadURLType comments above.
113     LoadURLType load_type;
114
115     // PageTransition for this load. See PageTransition for details.
116     // Note the default value in constructor below.
117     PageTransition transition_type;
118
119     // Referrer for this load. Empty if none.
120     Referrer referrer;
121
122     // Any redirect URLs that occurred for this navigation before |url|.
123     // Defaults to an empty vector.
124     std::vector<GURL> redirect_chain;
125
126     // Extra headers for this load, separated by \n.
127     std::string extra_headers;
128
129     // True for renderer-initiated navigations. This is
130     // important for tracking whether to display pending URLs.
131     bool is_renderer_initiated;
132
133     // User agent override for this load. See comments in
134     // UserAgentOverrideOption definition.
135     UserAgentOverrideOption override_user_agent;
136
137     // Marks the new navigation as being transferred from one RVH to another.
138     // In this case the browser can recycle the old request once the new
139     // renderer wants to navigate. Identifies the request ID of the old request.
140     GlobalRequestID transferred_global_request_id;
141
142     // Used in LOAD_TYPE_DATA loads only. Used for specifying a base URL
143     // for pages loaded via data URLs.
144     GURL base_url_for_data_url;
145
146     // Used in LOAD_TYPE_DATA loads only. URL displayed to the user for
147     // data loads.
148     GURL virtual_url_for_data_url;
149
150     // Used in LOAD_TYPE_BROWSER_INITIATED_HTTP_POST loads only. Carries the
151     // post data of the load. Ownership is transferred to NavigationController
152     // after LoadURLWithParams call.
153     scoped_refptr<base::RefCountedMemory> browser_initiated_post_data;
154
155     // True if this URL should be able to access local resources.
156     bool can_load_local_resources;
157
158     // Indicates whether this navigation should replace the current
159     // navigation entry.
160     bool should_replace_current_entry;
161
162     // Used to specify which frame to navigate. If empty, the main frame is
163     // navigated. This is currently only used in tests.
164     std::string frame_name;
165
166     // Indicates that during this navigation, the session history should be
167     // cleared such that the resulting page is the first and only entry of the
168     // session history.
169     //
170     // The clearing is done asynchronously, and completes when this navigation
171     // commits.
172     bool should_clear_history_list;
173
174     explicit LoadURLParams(const GURL& url);
175     ~LoadURLParams();
176
177     // Allows copying of LoadURLParams struct.
178     LoadURLParams(const LoadURLParams& other);
179     LoadURLParams& operator=(const LoadURLParams& other);
180   };
181
182   // Disables checking for a repost and prompting the user. This is used during
183   // testing.
184   CONTENT_EXPORT static void DisablePromptOnRepost();
185
186   virtual ~NavigationController() {}
187
188   // Returns the web contents associated with this controller. It can never be
189   // NULL.
190   virtual WebContents* GetWebContents() const = 0;
191
192   // Get/set the browser context for this controller. It can never be NULL.
193   virtual BrowserContext* GetBrowserContext() const = 0;
194   virtual void SetBrowserContext(BrowserContext* browser_context) = 0;
195
196   // Initializes this NavigationController with the given saved navigations,
197   // using |selected_navigation| as the currently loaded entry. Before this call
198   // the controller should be unused (there should be no current entry). |type|
199   // indicates where the restor comes from. This takes ownership of the
200   // NavigationEntrys in |entries| and clears it out.  This is used for session
201   // restore.
202   virtual void Restore(int selected_navigation,
203                        RestoreType type,
204                        std::vector<NavigationEntry*>* entries) = 0;
205
206   // Entries -------------------------------------------------------------------
207
208   // There are two basic states for entries: pending and committed. When an
209   // entry is navigated to, a request is sent to the server. While that request
210   // has not been responded to, the NavigationEntry is pending. Once data is
211   // received for that entry, that NavigationEntry is committed.
212
213   // A transient entry is an entry that, when the user navigates away, is
214   // removed and discarded rather than being added to the back-forward list.
215   // Transient entries are useful for interstitial pages and the like.
216
217   // Active entry --------------------------------------------------------------
218
219   // THIS IS DEPRECATED. DO NOT USE. Use GetVisibleEntry instead.
220   //
221   // Returns the active entry, which is the transient entry if any, the pending
222   // entry if a navigation is in progress or the last committed entry otherwise.
223   // NOTE: This can be NULL!!
224   //
225   // If you are trying to get the current state of the NavigationController,
226   // this is the method you will typically want to call.  If you want to display
227   // the active entry to the user (e.g., in the location bar), use
228   // GetVisibleEntry instead.
229   virtual NavigationEntry* GetActiveEntry() const = 0;
230
231   // Returns the same entry as GetActiveEntry, except that it ignores pending
232   // history navigation entries.  This should be used when displaying info to
233   // the user, so that the location bar and other indicators do not update for
234   // a back/forward navigation until the pending entry commits.  This approach
235   // guards against URL spoofs on slow history navigations.
236   virtual NavigationEntry* GetVisibleEntry() const = 0;
237
238   // Returns the index from which we would go back/forward or reload.  This is
239   // the last_committed_entry_index_ if pending_entry_index_ is -1.  Otherwise,
240   // it is the pending_entry_index_.
241   virtual int GetCurrentEntryIndex() const = 0;
242
243   // Returns the last committed entry, which may be null if there are no
244   // committed entries.
245   virtual NavigationEntry* GetLastCommittedEntry() const = 0;
246
247   // Returns the index of the last committed entry.
248   virtual int GetLastCommittedEntryIndex() const = 0;
249
250   // Returns true if the source for the current entry can be viewed.
251   virtual bool CanViewSource() const = 0;
252
253   // Navigation list -----------------------------------------------------------
254
255   // Returns the number of entries in the NavigationController, excluding
256   // the pending entry if there is one, but including the transient entry if
257   // any.
258   virtual int GetEntryCount() const = 0;
259
260   virtual NavigationEntry* GetEntryAtIndex(int index) const = 0;
261
262   // Returns the entry at the specified offset from current.  Returns NULL
263   // if out of bounds.
264   virtual NavigationEntry* GetEntryAtOffset(int offset) const = 0;
265
266   // Pending entry -------------------------------------------------------------
267
268   // Discards the pending and transient entries if any.
269   virtual void DiscardNonCommittedEntries() = 0;
270
271   // Returns the pending entry corresponding to the navigation that is
272   // currently in progress, or null if there is none.
273   virtual NavigationEntry* GetPendingEntry() const = 0;
274
275   // Returns the index of the pending entry or -1 if the pending entry
276   // corresponds to a new navigation (created via LoadURL).
277   virtual int GetPendingEntryIndex() const = 0;
278
279   // Transient entry -----------------------------------------------------------
280
281   // Returns the transient entry if any. This is an entry which is removed and
282   // discarded if any navigation occurs. Note that the returned entry is owned
283   // by the navigation controller and may be deleted at any time.
284   virtual NavigationEntry* GetTransientEntry() const = 0;
285
286   // Adds an entry that is returned by GetActiveEntry(). The entry is
287   // transient: any navigation causes it to be removed and discarded.  The
288   // NavigationController becomes the owner of |entry| and deletes it when
289   // it discards it. This is useful with interstitial pages that need to be
290   // represented as an entry, but should go away when the user navigates away
291   // from them.
292   // Note that adding a transient entry does not change the active contents.
293   virtual void SetTransientEntry(NavigationEntry* entry) = 0;
294
295   // New navigations -----------------------------------------------------------
296
297   // Loads the specified URL, specifying extra http headers to add to the
298   // request.  Extra headers are separated by \n.
299   virtual void LoadURL(const GURL& url,
300                        const Referrer& referrer,
301                        PageTransition type,
302                        const std::string& extra_headers) = 0;
303
304   // More general version of LoadURL. See comments in LoadURLParams for
305   // using |params|.
306   virtual void LoadURLWithParams(const LoadURLParams& params) = 0;
307
308   // Loads the current page if this NavigationController was restored from
309   // history and the current page has not loaded yet or if the load was
310   // explicitly requested using SetNeedsReload().
311   virtual void LoadIfNecessary() = 0;
312
313   // Renavigation --------------------------------------------------------------
314
315   // Navigation relative to the "current entry"
316   virtual bool CanGoBack() const = 0;
317   virtual bool CanGoForward() const = 0;
318   virtual bool CanGoToOffset(int offset) const = 0;
319   virtual void GoBack() = 0;
320   virtual void GoForward() = 0;
321
322   // Navigates to the specified absolute index.
323   virtual void GoToIndex(int index) = 0;
324
325   // Navigates to the specified offset from the "current entry". Does nothing if
326   // the offset is out of bounds.
327   virtual void GoToOffset(int offset) = 0;
328
329   // Reloads the current entry. If |check_for_repost| is true and the current
330   // entry has POST data the user is prompted to see if they really want to
331   // reload the page. In nearly all cases pass in true.  If a transient entry
332   // is showing, initiates a new navigation to its URL.
333   virtual void Reload(bool check_for_repost) = 0;
334
335   // Like Reload(), but don't use caches (aka "shift-reload").
336   virtual void ReloadIgnoringCache(bool check_for_repost) = 0;
337
338   // Reloads the current entry using the original URL used to create it.  This
339   // is used for cases where the user wants to refresh a page using a different
340   // user agent after following a redirect.
341   virtual void ReloadOriginalRequestURL(bool check_for_repost) = 0;
342
343   // Removing of entries -------------------------------------------------------
344
345   // Removes the entry at the specified |index|.  This call discards any
346   // transient entries.  If the index is the last committed index or the pending
347   // entry, this does nothing and returns false.
348   virtual bool RemoveEntryAtIndex(int index) = 0;
349
350   // Random --------------------------------------------------------------------
351
352   // Session storage depends on dom_storage that depends on WebKit::WebString,
353   // which cannot be used on iOS.
354 #if !defined(OS_IOS)
355   // Returns all the SessionStorageNamespace objects that this
356   // NavigationController knows about.
357   virtual const SessionStorageNamespaceMap&
358       GetSessionStorageNamespaceMap() const = 0;
359
360   // TODO(ajwong): Remove this once prerendering, instant, and session restore
361   // are migrated.
362   virtual SessionStorageNamespace* GetDefaultSessionStorageNamespace() = 0;
363 #endif
364
365   // Sets the max restored page ID this NavigationController has seen, if it
366   // was restored from a previous session.
367   virtual void SetMaxRestoredPageID(int32 max_id) = 0;
368
369   // Returns the largest restored page ID seen in this navigation controller,
370   // if it was restored from a previous session.  (-1 otherwise)
371   virtual int32 GetMaxRestoredPageID() const = 0;
372
373   // Returns true if a reload happens when activated (SetActive(true) is
374   // invoked). This is true for session/tab restore, cloned tabs and tabs that
375   // requested a reload (using SetNeedsReload()) after their renderer was
376   // killed.
377   virtual bool NeedsReload() const = 0;
378
379   // Request a reload to happen when activated. This can be used when a renderer
380   // backing a background tab is killed by the system on Android or ChromeOS.
381   virtual void SetNeedsReload() = 0;
382
383   // Cancels a repost that brought up a warning.
384   virtual void CancelPendingReload() = 0;
385   // Continues a repost that brought up a warning.
386   virtual void ContinuePendingReload() = 0;
387
388   // Returns true if we are navigating to the URL the tab is opened with.
389   // Returns false after the initial navigation has committed.
390   virtual bool IsInitialNavigation() const = 0;
391
392   // Broadcasts the NOTIFICATION_NAV_ENTRY_CHANGED notification for the given
393   // entry (which must be at the given index). This will keep things in sync
394   // like the saved session.
395   virtual void NotifyEntryChanged(const NavigationEntry* entry, int index) = 0;
396
397   // Copies the navigation state from the given controller to this one. This
398   // one should be empty (just created).
399   virtual void CopyStateFrom(const NavigationController& source) = 0;
400
401   // A variant of CopyStateFrom. Removes all entries from this except the last
402   // committed entry, and inserts all entries from |source| before and including
403   // its last committed entry. For example:
404   // source: A B *C* D
405   // this:   E F *G*
406   // result: A B C *G*
407   // If there is a pending entry after *G* in |this|, it is also preserved.
408   // This ignores any pending or transient entries in |source|.  Callers must
409   // ensure that |CanPruneAllButVisible| returns true before calling this, or it
410   // will crash.
411   virtual void CopyStateFromAndPrune(NavigationController* source) = 0;
412
413   // Returns whether it is safe to call PruneAllButVisible or
414   // CopyStateFromAndPrune.  There must be a last committed entry, no transient
415   // entry, and if there is a pending entry, it must be new and not an existing
416   // entry.
417   //
418   // If there were no last committed entry, the pending entry might not commit,
419   // leaving us with a blank page.  This is unsafe when used with
420   // |CopyStateFromAndPrune|, which would show an existing entry above the blank
421   // page.
422   // If there were a transient entry, we would not want to prune the other
423   // entries, which the transient entry could be referring to.
424   // If there were an existing pending entry, we could not prune the last
425   // committed entry, in case it did not commit.  That would leave us with no
426   // sensible place to put the pending entry when it did commit, after all other
427   // entries are pruned.  For example, it could be going back several entries.
428   // (New pending entries are safe, because they can always commit to the end.)
429   virtual bool CanPruneAllButVisible() = 0;
430
431   // Removes all the entries except the last committed entry. If there is a new
432   // pending navigation it is preserved.  Callers must ensure
433   // |CanPruneAllButVisible| returns true before calling this, or it will crash.
434   virtual void PruneAllButVisible() = 0;
435
436   // Clears all screenshots associated with navigation entries in this
437   // controller. Useful to reduce memory consumption in low-memory situations.
438   virtual void ClearAllScreenshots() = 0;
439
440  private:
441   // This interface should only be implemented inside content.
442   friend class NavigationControllerImpl;
443   NavigationController() {}
444 };
445
446 }  // namespace content
447
448 #endif  // CONTENT_PUBLIC_BROWSER_NAVIGATION_CONTROLLER_H_