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.
5 #ifndef CONTENT_PUBLIC_BROWSER_NAVIGATION_CONTROLLER_H_
6 #define CONTENT_PUBLIC_BROWSER_NAVIGATION_CONTROLLER_H_
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 "googleurl/src/gurl.h"
22 class RefCountedMemory
;
29 class NavigationEntry
;
30 class SessionStorageNamespace
;
33 // Used to store the mapping of a StoragePartition id to
34 // SessionStorageNamespace.
35 typedef std::map
<std::string
, scoped_refptr
<SessionStorageNamespace
> >
36 SessionStorageNamespaceMap
;
38 // A NavigationController maintains the back-forward list for a WebContents and
39 // manages all navigation within that list.
41 // Each NavigationController belongs to one WebContents; each WebContents has
42 // exactly one NavigationController.
43 class NavigationController
{
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.
52 // Load type used in LoadURLParams.
54 // For loads that do not fall into any types below.
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
,
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|.
67 // Adding new LoadURLType? Also update LoadUrlParams.java static constants.
70 // User agent override type used in LoadURLParams.
71 enum UserAgentOverrideOption
{
72 // Use the override value from the previous NavigationEntry in the
73 // NavigationController.
76 // Use the default user agent.
79 // Use the user agent override, if it's available.
82 // Adding new UserAgentOverrideOption? Also update LoadUrlParams.java
87 // Indicates the restore is from the current session. For example, restoring
89 RESTORE_CURRENT_SESSION
,
91 // Restore from the previous session.
92 RESTORE_LAST_SESSION_EXITED_CLEANLY
,
93 RESTORE_LAST_SESSION_CRASHED
,
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(
101 const Referrer
& referrer
,
102 PageTransition transition
,
103 bool is_renderer_initiated
,
104 const std::string
& extra_headers
,
105 BrowserContext
* browser_context
);
107 // Extra optional parameters for LoadURLWithParams.
108 struct CONTENT_EXPORT LoadURLParams
{
109 // The url to load. This field is required.
112 // See LoadURLType comments above.
113 LoadURLType load_type
;
115 // PageTransition for this load. See PageTransition for details.
116 // Note the default value in constructor below.
117 PageTransition transition_type
;
119 // Referrer for this load. Empty if none.
122 // Extra headers for this load, separated by \n.
123 std::string extra_headers
;
125 // True for renderer-initiated navigations. This is
126 // important for tracking whether to display pending URLs.
127 bool is_renderer_initiated
;
129 // User agent override for this load. See comments in
130 // UserAgentOverrideOption definition.
131 UserAgentOverrideOption override_user_agent
;
133 // Marks the new navigation as being transferred from one RVH to another.
134 // In this case the browser can recycle the old request once the new
135 // renderer wants to navigate. Identifies the request ID of the old request.
136 GlobalRequestID transferred_global_request_id
;
138 // Used in LOAD_TYPE_DATA loads only. Used for specifying a base URL
139 // for pages loaded via data URLs.
140 GURL base_url_for_data_url
;
142 // Used in LOAD_TYPE_DATA loads only. URL displayed to the user for
144 GURL virtual_url_for_data_url
;
146 // Used in LOAD_TYPE_BROWSER_INITIATED_HTTP_POST loads only. Carries the
147 // post data of the load. Ownership is transferred to NavigationController
148 // after LoadURLWithParams call.
149 scoped_refptr
<base::RefCountedMemory
> browser_initiated_post_data
;
151 // True if this URL should be able to access local resources.
152 bool can_load_local_resources
;
154 // Indicates whether this navigation involves a cross-process redirect,
155 // in which case it should replace the current navigation entry.
156 bool is_cross_site_redirect
;
158 // Used to specify which frame to navigate. If empty, the main frame is
159 // navigated. This is currently only used in tests.
160 std::string frame_name
;
162 // Indicates that during this navigation, the session history should be
163 // cleared such that the resulting page is the first and only entry of the
166 // The clearing is done asynchronously, and completes when this navigation
168 bool should_clear_history_list
;
170 explicit LoadURLParams(const GURL
& url
);
173 // Allows copying of LoadURLParams struct.
174 LoadURLParams(const LoadURLParams
& other
);
175 LoadURLParams
& operator=(const LoadURLParams
& other
);
178 // Disables checking for a repost and prompting the user. This is used during
180 CONTENT_EXPORT
static void DisablePromptOnRepost();
182 virtual ~NavigationController() {}
184 // Returns the web contents associated with this controller. It can never be
186 virtual WebContents
* GetWebContents() const = 0;
188 // Get/set the browser context for this controller. It can never be NULL.
189 virtual BrowserContext
* GetBrowserContext() const = 0;
190 virtual void SetBrowserContext(BrowserContext
* browser_context
) = 0;
192 // Initializes this NavigationController with the given saved navigations,
193 // using |selected_navigation| as the currently loaded entry. Before this call
194 // the controller should be unused (there should be no current entry). |type|
195 // indicates where the restor comes from. This takes ownership of the
196 // NavigationEntrys in |entries| and clears it out. This is used for session
198 virtual void Restore(int selected_navigation
,
200 std::vector
<NavigationEntry
*>* entries
) = 0;
202 // Entries -------------------------------------------------------------------
204 // There are two basic states for entries: pending and committed. When an
205 // entry is navigated to, a request is sent to the server. While that request
206 // has not been responded to, the NavigationEntry is pending. Once data is
207 // received for that entry, that NavigationEntry is committed.
209 // A transient entry is an entry that, when the user navigates away, is
210 // removed and discarded rather than being added to the back-forward list.
211 // Transient entries are useful for interstitial pages and the like.
213 // Active entry --------------------------------------------------------------
215 // Returns the active entry, which is the transient entry if any, the pending
216 // entry if a navigation is in progress or the last committed entry otherwise.
217 // NOTE: This can be NULL!!
219 // If you are trying to get the current state of the NavigationController,
220 // this is the method you will typically want to call. If you want to display
221 // the active entry to the user (e.g., in the location bar), use
222 // GetVisibleEntry instead.
223 virtual NavigationEntry
* GetActiveEntry() const = 0;
225 // Returns the same entry as GetActiveEntry, except that it ignores pending
226 // history navigation entries. This should be used when displaying info to
227 // the user, so that the location bar and other indicators do not update for
228 // a back/forward navigation until the pending entry commits. This approach
229 // guards against URL spoofs on slow history navigations.
230 virtual NavigationEntry
* GetVisibleEntry() const = 0;
232 // Returns the index from which we would go back/forward or reload. This is
233 // the last_committed_entry_index_ if pending_entry_index_ is -1. Otherwise,
234 // it is the pending_entry_index_.
235 virtual int GetCurrentEntryIndex() const = 0;
237 // Returns the last committed entry, which may be null if there are no
238 // committed entries.
239 virtual NavigationEntry
* GetLastCommittedEntry() const = 0;
241 // Returns the index of the last committed entry.
242 virtual int GetLastCommittedEntryIndex() const = 0;
244 // Returns true if the source for the current entry can be viewed.
245 virtual bool CanViewSource() const = 0;
247 // Navigation list -----------------------------------------------------------
249 // Returns the number of entries in the NavigationController, excluding
250 // the pending entry if there is one, but including the transient entry if
252 virtual int GetEntryCount() const = 0;
254 virtual NavigationEntry
* GetEntryAtIndex(int index
) const = 0;
256 // Returns the entry at the specified offset from current. Returns NULL
258 virtual NavigationEntry
* GetEntryAtOffset(int offset
) const = 0;
260 // Pending entry -------------------------------------------------------------
262 // Discards the pending and transient entries if any.
263 virtual void DiscardNonCommittedEntries() = 0;
265 // Returns the pending entry corresponding to the navigation that is
266 // currently in progress, or null if there is none.
267 virtual NavigationEntry
* GetPendingEntry() const = 0;
269 // Returns the index of the pending entry or -1 if the pending entry
270 // corresponds to a new navigation (created via LoadURL).
271 virtual int GetPendingEntryIndex() const = 0;
273 // Transient entry -----------------------------------------------------------
275 // Returns the transient entry if any. This is an entry which is removed and
276 // discarded if any navigation occurs. Note that the returned entry is owned
277 // by the navigation controller and may be deleted at any time.
278 virtual NavigationEntry
* GetTransientEntry() const = 0;
280 // Adds an entry that is returned by GetActiveEntry(). The entry is
281 // transient: any navigation causes it to be removed and discarded. The
282 // NavigationController becomes the owner of |entry| and deletes it when
283 // it discards it. This is useful with interstitial pages that need to be
284 // represented as an entry, but should go away when the user navigates away
286 // Note that adding a transient entry does not change the active contents.
287 virtual void SetTransientEntry(NavigationEntry
* entry
) = 0;
289 // New navigations -----------------------------------------------------------
291 // Loads the specified URL, specifying extra http headers to add to the
292 // request. Extra headers are separated by \n.
293 virtual void LoadURL(const GURL
& url
,
294 const Referrer
& referrer
,
296 const std::string
& extra_headers
) = 0;
298 // More general version of LoadURL. See comments in LoadURLParams for
300 virtual void LoadURLWithParams(const LoadURLParams
& params
) = 0;
302 // Loads the current page if this NavigationController was restored from
303 // history and the current page has not loaded yet.
304 virtual void LoadIfNecessary() = 0;
306 // Renavigation --------------------------------------------------------------
308 // Navigation relative to the "current entry"
309 virtual bool CanGoBack() const = 0;
310 virtual bool CanGoForward() const = 0;
311 virtual bool CanGoToOffset(int offset
) const = 0;
312 virtual void GoBack() = 0;
313 virtual void GoForward() = 0;
315 // Navigates to the specified absolute index.
316 virtual void GoToIndex(int index
) = 0;
318 // Navigates to the specified offset from the "current entry". Does nothing if
319 // the offset is out of bounds.
320 virtual void GoToOffset(int offset
) = 0;
322 // Reloads the current entry. If |check_for_repost| is true and the current
323 // entry has POST data the user is prompted to see if they really want to
324 // reload the page. In nearly all cases pass in true. If a transient entry
325 // is showing, initiates a new navigation to its URL.
326 virtual void Reload(bool check_for_repost
) = 0;
328 // Like Reload(), but don't use caches (aka "shift-reload").
329 virtual void ReloadIgnoringCache(bool check_for_repost
) = 0;
331 // Reloads the current entry using the original URL used to create it. This
332 // is used for cases where the user wants to refresh a page using a different
333 // user agent after following a redirect.
334 virtual void ReloadOriginalRequestURL(bool check_for_repost
) = 0;
336 // Removing of entries -------------------------------------------------------
338 // Removes the entry at the specified |index|. This call dicards any pending
339 // and transient entries. If the index is the last committed index, this does
340 // nothing and returns false.
341 virtual void RemoveEntryAtIndex(int index
) = 0;
343 // Random --------------------------------------------------------------------
345 // Session storage depends on dom_storage that depends on WebKit::WebString,
346 // which cannot be used on iOS.
348 // Returns all the SessionStorageNamespace objects that this
349 // NavigationController knows about.
350 virtual const SessionStorageNamespaceMap
&
351 GetSessionStorageNamespaceMap() const = 0;
353 // TODO(ajwong): Remove this once prerendering, instant, and session restore
355 virtual SessionStorageNamespace
* GetDefaultSessionStorageNamespace() = 0;
358 // Sets the max restored page ID this NavigationController has seen, if it
359 // was restored from a previous session.
360 virtual void SetMaxRestoredPageID(int32 max_id
) = 0;
362 // Returns the largest restored page ID seen in this navigation controller,
363 // if it was restored from a previous session. (-1 otherwise)
364 virtual int32
GetMaxRestoredPageID() const = 0;
366 // Returns true if a reload happens when activated (SetActive(true) is
367 // invoked). This is true for session/tab restore and cloned tabs.
368 virtual bool NeedsReload() const = 0;
370 // Cancels a repost that brought up a warning.
371 virtual void CancelPendingReload() = 0;
372 // Continues a repost that brought up a warning.
373 virtual void ContinuePendingReload() = 0;
375 // Returns true if we are navigating to the URL the tab is opened with.
376 // Returns false after the initial navigation has committed.
377 virtual bool IsInitialNavigation() const = 0;
379 // Broadcasts the NOTIFY_NAV_ENTRY_CHANGED notification for the given entry
380 // (which must be at the given index). This will keep things in sync like
381 // the saved session.
382 virtual void NotifyEntryChanged(const NavigationEntry
* entry
, int index
) = 0;
384 // Copies the navigation state from the given controller to this one. This
385 // one should be empty (just created).
386 virtual void CopyStateFrom(const NavigationController
& source
) = 0;
388 // A variant of CopyStateFrom. Removes all entries from this except the last
389 // committed entry, and inserts all entries from |source| before and including
390 // its last committed entry. For example:
394 // If there is a pending entry after *G* in |this|, it is also preserved.
395 // This ignores any pending or transient entries in |source|. Callers must
396 // ensure that |CanPruneAllButVisible| returns true before calling this, or it
398 virtual void CopyStateFromAndPrune(NavigationController
* source
) = 0;
400 // Returns whether it is safe to call PruneAllButVisible or
401 // CopyStateFromAndPrune. There must be a last committed entry, no transient
402 // entry, and if there is a pending entry, it must be new and not an existing
405 // If there were no last committed entry, the pending entry might not commit,
406 // leaving us with a blank page. This is unsafe when used with
407 // |CopyStateFromAndPrune|, which would show an existing entry above the blank
409 // If there were a transient entry, we would not want to prune the other
410 // entries, which the transient entry could be referring to.
411 // If there were an existing pending entry, we could not prune the last
412 // committed entry, in case it did not commit. That would leave us with no
413 // sensible place to put the pending entry when it did commit, after all other
414 // entries are pruned. For example, it could be going back several entries.
415 // (New pending entries are safe, because they can always commit to the end.)
416 virtual bool CanPruneAllButVisible() = 0;
418 // Removes all the entries except the last committed entry. If there is a new
419 // pending navigation it is preserved. Callers must ensure
420 // |CanPruneAllButVisible| returns true before calling this, or it will crash.
421 virtual void PruneAllButVisible() = 0;
423 // Clears all screenshots associated with navigation entries in this
424 // controller. Useful to reduce memory consumption in low-memory situations.
425 virtual void ClearAllScreenshots() = 0;
428 // This interface should only be implemented inside content.
429 friend class NavigationControllerImpl
;
430 NavigationController() {}
433 } // namespace content
435 #endif // CONTENT_PUBLIC_BROWSER_NAVIGATION_CONTROLLER_H_