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