navigation_controller.h revision 5821806d5e7f356e8fa4b058a389a808ea183019
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/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" 19 20namespace base { 21 22class RefCountedMemory; 23 24} // namespace base 25 26namespace content { 27 28class BrowserContext; 29class NavigationEntry; 30class SessionStorageNamespace; 31class WebContents; 32 33// Used to store the mapping of a StoragePartition id to 34// SessionStorageNamespace. 35typedef 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. 43class 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 // Extra headers for this load, separated by \n. 123 std::string extra_headers; 124 125 // True for renderer-initiated navigations. This is 126 // important for tracking whether to display pending URLs. 127 bool is_renderer_initiated; 128 129 // User agent override for this load. See comments in 130 // UserAgentOverrideOption definition. 131 UserAgentOverrideOption override_user_agent; 132 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; 137 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; 141 142 // Used in LOAD_TYPE_DATA loads only. URL displayed to the user for 143 // data loads. 144 GURL virtual_url_for_data_url; 145 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; 150 151 // True if this URL should be able to access local resources. 152 bool can_load_local_resources; 153 154 explicit LoadURLParams(const GURL& url); 155 ~LoadURLParams(); 156 157 // Allows copying of LoadURLParams struct. 158 LoadURLParams(const LoadURLParams& other); 159 LoadURLParams& operator=(const LoadURLParams& other); 160 }; 161 162 // Disables checking for a repost and prompting the user. This is used during 163 // testing. 164 CONTENT_EXPORT static void DisablePromptOnRepost(); 165 166 virtual ~NavigationController() {} 167 168 // Returns the web contents associated with this controller. It can never be 169 // NULL. 170 virtual WebContents* GetWebContents() const = 0; 171 172 // Get/set the browser context for this controller. It can never be NULL. 173 virtual BrowserContext* GetBrowserContext() const = 0; 174 virtual void SetBrowserContext(BrowserContext* browser_context) = 0; 175 176 // Initializes this NavigationController with the given saved navigations, 177 // using |selected_navigation| as the currently loaded entry. Before this call 178 // the controller should be unused (there should be no current entry). |type| 179 // indicates where the restor comes from. This takes ownership of the 180 // NavigationEntrys in |entries| and clears it out. This is used for session 181 // restore. 182 virtual void Restore(int selected_navigation, 183 RestoreType type, 184 std::vector<NavigationEntry*>* entries) = 0; 185 186 // Entries ------------------------------------------------------------------- 187 188 // There are two basic states for entries: pending and committed. When an 189 // entry is navigated to, a request is sent to the server. While that request 190 // has not been responded to, the NavigationEntry is pending. Once data is 191 // received for that entry, that NavigationEntry is committed. 192 193 // A transient entry is an entry that, when the user navigates away, is 194 // removed and discarded rather than being added to the back-forward list. 195 // Transient entries are useful for interstitial pages and the like. 196 197 // Active entry -------------------------------------------------------------- 198 199 // Returns the active entry, which is the transient entry if any, the pending 200 // entry if a navigation is in progress or the last committed entry otherwise. 201 // NOTE: This can be NULL!! 202 // 203 // If you are trying to get the current state of the NavigationController, 204 // this is the method you will typically want to call. If you want to display 205 // the active entry to the user (e.g., in the location bar), use 206 // GetVisibleEntry instead. 207 virtual NavigationEntry* GetActiveEntry() const = 0; 208 209 // Returns the same entry as GetActiveEntry, except that it ignores pending 210 // history navigation entries. This should be used when displaying info to 211 // the user, so that the location bar and other indicators do not update for 212 // a back/forward navigation until the pending entry commits. This approach 213 // guards against URL spoofs on slow history navigations. 214 virtual NavigationEntry* GetVisibleEntry() const = 0; 215 216 // Returns the index from which we would go back/forward or reload. This is 217 // the last_committed_entry_index_ if pending_entry_index_ is -1. Otherwise, 218 // it is the pending_entry_index_. 219 virtual int GetCurrentEntryIndex() const = 0; 220 221 // Returns the last committed entry, which may be null if there are no 222 // committed entries. 223 virtual NavigationEntry* GetLastCommittedEntry() const = 0; 224 225 // Returns the index of the last committed entry. 226 virtual int GetLastCommittedEntryIndex() const = 0; 227 228 // Returns true if the source for the current entry can be viewed. 229 virtual bool CanViewSource() const = 0; 230 231 // Navigation list ----------------------------------------------------------- 232 233 // Returns the number of entries in the NavigationController, excluding 234 // the pending entry if there is one, but including the transient entry if 235 // any. 236 virtual int GetEntryCount() const = 0; 237 238 virtual NavigationEntry* GetEntryAtIndex(int index) const = 0; 239 240 // Returns the entry at the specified offset from current. Returns NULL 241 // if out of bounds. 242 virtual NavigationEntry* GetEntryAtOffset(int offset) const = 0; 243 244 // Pending entry ------------------------------------------------------------- 245 246 // Discards the pending and transient entries if any. 247 virtual void DiscardNonCommittedEntries() = 0; 248 249 // Returns the pending entry corresponding to the navigation that is 250 // currently in progress, or null if there is none. 251 virtual NavigationEntry* GetPendingEntry() const = 0; 252 253 // Returns the index of the pending entry or -1 if the pending entry 254 // corresponds to a new navigation (created via LoadURL). 255 virtual int GetPendingEntryIndex() const = 0; 256 257 // Transient entry ----------------------------------------------------------- 258 259 // Returns the transient entry if any. This is an entry which is removed and 260 // discarded if any navigation occurs. Note that the returned entry is owned 261 // by the navigation controller and may be deleted at any time. 262 virtual NavigationEntry* GetTransientEntry() const = 0; 263 264 // New navigations ----------------------------------------------------------- 265 266 // Loads the specified URL, specifying extra http headers to add to the 267 // request. Extra headers are separated by \n. 268 virtual void LoadURL(const GURL& url, 269 const Referrer& referrer, 270 PageTransition type, 271 const std::string& extra_headers) = 0; 272 273 // More general version of LoadURL. See comments in LoadURLParams for 274 // using |params|. 275 virtual void LoadURLWithParams(const LoadURLParams& params) = 0; 276 277 // Loads the current page if this NavigationController was restored from 278 // history and the current page has not loaded yet. 279 virtual void LoadIfNecessary() = 0; 280 281 // Renavigation -------------------------------------------------------------- 282 283 // Navigation relative to the "current entry" 284 virtual bool CanGoBack() const = 0; 285 virtual bool CanGoForward() const = 0; 286 virtual bool CanGoToOffset(int offset) const = 0; 287 virtual void GoBack() = 0; 288 virtual void GoForward() = 0; 289 290 // Navigates to the specified absolute index. 291 virtual void GoToIndex(int index) = 0; 292 293 // Navigates to the specified offset from the "current entry". Does nothing if 294 // the offset is out of bounds. 295 virtual void GoToOffset(int offset) = 0; 296 297 // Reloads the current entry. If |check_for_repost| is true and the current 298 // entry has POST data the user is prompted to see if they really want to 299 // reload the page. In nearly all cases pass in true. If a transient entry 300 // is showing, initiates a new navigation to its URL. 301 virtual void Reload(bool check_for_repost) = 0; 302 303 // Like Reload(), but don't use caches (aka "shift-reload"). 304 virtual void ReloadIgnoringCache(bool check_for_repost) = 0; 305 306 // Reloads the current entry using the original URL used to create it. This 307 // is used for cases where the user wants to refresh a page using a different 308 // user agent after following a redirect. 309 virtual void ReloadOriginalRequestURL(bool check_for_repost) = 0; 310 311 // Removing of entries ------------------------------------------------------- 312 313 // Removes the entry at the specified |index|. This call dicards any pending 314 // and transient entries. If the index is the last committed index, this does 315 // nothing and returns false. 316 virtual void RemoveEntryAtIndex(int index) = 0; 317 318 // Random -------------------------------------------------------------------- 319 320 // Session storage depends on dom_storage that depends on WebKit::WebString, 321 // which cannot be used on iOS. 322#if !defined(OS_IOS) 323 // Returns all the SessionStorageNamespace objects that this 324 // NavigationController knows about. 325 virtual const SessionStorageNamespaceMap& 326 GetSessionStorageNamespaceMap() const = 0; 327 328 // TODO(ajwong): Remove this once prerendering, instant, and session restore 329 // are migrated. 330 virtual SessionStorageNamespace* GetDefaultSessionStorageNamespace() = 0; 331#endif 332 333 // Sets the max restored page ID this NavigationController has seen, if it 334 // was restored from a previous session. 335 virtual void SetMaxRestoredPageID(int32 max_id) = 0; 336 337 // Returns the largest restored page ID seen in this navigation controller, 338 // if it was restored from a previous session. (-1 otherwise) 339 virtual int32 GetMaxRestoredPageID() const = 0; 340 341 // Returns true if a reload happens when activated (SetActive(true) is 342 // invoked). This is true for session/tab restore and cloned tabs. 343 virtual bool NeedsReload() const = 0; 344 345 // Cancels a repost that brought up a warning. 346 virtual void CancelPendingReload() = 0; 347 // Continues a repost that brought up a warning. 348 virtual void ContinuePendingReload() = 0; 349 350 // Returns true if we are navigating to the URL the tab is opened with. 351 // Returns false after initial navigation has loaded in frame. 352 virtual bool IsInitialNavigation() = 0; 353 354 // Broadcasts the NOTIFY_NAV_ENTRY_CHANGED notification for the given entry 355 // (which must be at the given index). This will keep things in sync like 356 // the saved session. 357 virtual void NotifyEntryChanged(const NavigationEntry* entry, int index) = 0; 358 359 // Copies the navigation state from the given controller to this one. This 360 // one should be empty (just created). 361 virtual void CopyStateFrom(const NavigationController& source) = 0; 362 363 // A variant of CopyStateFrom. Removes all entries from this except the last 364 // entry, inserts all entries from |source| before and including the active 365 // entry. This method is intended for use when the last entry of |this| is the 366 // active entry. For example: 367 // source: A B *C* D 368 // this: E F *G* (last must be active or pending) 369 // result: A B C *G* 370 // This ignores the transient index of the source and honors that of 'this'. 371 virtual void CopyStateFromAndPrune(NavigationController* source) = 0; 372 373 // Removes all the entries except the active entry. If there is a new pending 374 // navigation it is preserved. 375 virtual void PruneAllButActive() = 0; 376}; 377 378} // namespace content 379 380#endif // CONTENT_PUBLIC_BROWSER_NAVIGATION_CONTROLLER_H_ 381