OLD | NEW |
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef CHROME_BROWSER_NAVIGATION_CONTROLLER_H_ | 5 #ifndef CHROME_BROWSER_NAVIGATION_CONTROLLER_H_ |
6 #define CHROME_BROWSER_NAVIGATION_CONTROLLER_H_ | 6 #define CHROME_BROWSER_NAVIGATION_CONTROLLER_H_ |
7 | 7 |
8 #include <hash_map> | 8 #include <map> |
9 | 9 |
10 #include "base/linked_ptr.h" | 10 #include "base/linked_ptr.h" |
11 #include "base/ref_counted.h" | 11 #include "base/ref_counted.h" |
12 #include "chrome/browser/alternate_nav_url_fetcher.h" | 12 #include "chrome/browser/alternate_nav_url_fetcher.h" |
13 #include "chrome/browser/session_service.h" | 13 #include "chrome/browser/session_service.h" |
14 #include "chrome/browser/site_instance.h" | 14 #include "chrome/browser/site_instance.h" |
15 #include "chrome/browser/ssl_manager.h" | 15 #include "chrome/browser/ssl_manager.h" |
16 #include "chrome/browser/tab_contents_type.h" | 16 #include "chrome/browser/tab_contents_type.h" |
17 | 17 |
18 class GURL; | 18 class GURL; |
19 class Profile; | 19 class Profile; |
20 class TabContents; | 20 class TabContents; |
21 class WebContents; | 21 class WebContents; |
22 class TabContentsCollector; | 22 class TabContentsCollector; |
23 struct TabNavigation; | 23 struct TabNavigation; |
| 24 struct ViewHostMsg_FrameNavigate_Params; |
24 | 25 |
25 namespace printing { | 26 // A NavigationController maintains the back-forward list for a single tab and |
26 class PrintViewManager; | 27 // manages all navigation within that list. |
27 } | |
28 | |
29 //////////////////////////////////////////////////////////////////////////////// | |
30 // | |
31 // NavigationController class | |
32 // | |
33 // A NavigationController maintains navigation data. We have one | |
34 // NavigationController instance per tab. | |
35 // | 28 // |
36 // The NavigationController also owns all TabContents for the tab. This is to | 29 // The NavigationController also owns all TabContents for the tab. This is to |
37 // make sure that we have at most one TabContents instance per type. | 30 // make sure that we have at most one TabContents instance per type. |
38 // | |
39 //////////////////////////////////////////////////////////////////////////////// | |
40 class NavigationController { | 31 class NavigationController { |
41 public: | 32 public: |
| 33 // Notification details ------------------------------------------------------ |
| 34 |
42 // Provides the details for a NOTIFY_NAV_ENTRY_CHANGED notification. | 35 // Provides the details for a NOTIFY_NAV_ENTRY_CHANGED notification. |
43 struct EntryChangedDetails { | 36 struct EntryChangedDetails { |
44 // The changed navigation entry after it has been updated. | 37 // The changed navigation entry after it has been updated. |
45 const NavigationEntry* changed_entry; | 38 const NavigationEntry* changed_entry; |
46 | 39 |
47 // Indicates the current index in the back/forward list of the entry. | 40 // Indicates the current index in the back/forward list of the entry. |
48 int index; | 41 int index; |
49 }; | 42 }; |
50 | 43 |
| 44 // Provides the details for a NOTIFY_NAV_ENTRY_COMMITTED notification. |
51 struct LoadCommittedDetails { | 45 struct LoadCommittedDetails { |
52 // By default, the entry will be filled according to a new main frame | 46 // By default, the entry will be filled according to a new main frame |
53 // navigation. | 47 // navigation. |
54 LoadCommittedDetails() | 48 LoadCommittedDetails() |
55 : entry(NULL), | 49 : entry(NULL), |
56 is_auto(false), | 50 is_auto(false), |
57 is_in_page(false), | 51 is_in_page(false), |
58 is_main_frame(true) { | 52 is_main_frame(true) { |
59 } | 53 } |
60 | 54 |
(...skipping 20 matching lines...) Expand all Loading... |
81 | 75 |
82 // Returns whether the user probably felt like they navigated somewhere new. | 76 // Returns whether the user probably felt like they navigated somewhere new. |
83 // We often need this logic for showing or hiding something, and this | 77 // We often need this logic for showing or hiding something, and this |
84 // returns true only for main frame loads that the user initiated, that go | 78 // returns true only for main frame loads that the user initiated, that go |
85 // to a new page. | 79 // to a new page. |
86 bool is_user_initiated_main_frame_load() const { | 80 bool is_user_initiated_main_frame_load() const { |
87 return !is_auto && !is_in_page && is_main_frame; | 81 return !is_auto && !is_in_page && is_main_frame; |
88 } | 82 } |
89 }; | 83 }; |
90 | 84 |
| 85 // --------------------------------------------------------------------------- |
| 86 |
91 NavigationController(TabContents* initial_contents, Profile* profile); | 87 NavigationController(TabContents* initial_contents, Profile* profile); |
| 88 |
92 // Creates a NavigationController from the specified history. Processing | 89 // Creates a NavigationController from the specified history. Processing |
93 // for this is asynchronous and handled via the RestoreHelper (in | 90 // for this is asynchronous and handled via the RestoreHelper (in |
94 // navigation_controller.cc). | 91 // navigation_controller.cc). |
95 NavigationController( | 92 NavigationController( |
96 Profile* profile, | 93 Profile* profile, |
97 const std::vector<TabNavigation>& navigations, | 94 const std::vector<TabNavigation>& navigations, |
98 int selected_navigation, | 95 int selected_navigation, |
99 HWND parent); | 96 HWND parent); |
100 ~NavigationController(); | 97 ~NavigationController(); |
101 | 98 |
102 // Same as Reload, but doesn't check if current entry has POST data. | 99 // Begin the destruction sequence for this NavigationController and all its |
103 void ReloadDontCheckForRepost(); | 100 // registered tabs. The sequence is as follows: |
| 101 // 1. All tabs are asked to Destroy themselves. |
| 102 // 2. When each tab is finished Destroying, it will notify the controller. |
| 103 // 3. Once all tabs are Destroyed, the NavigationController deletes itself. |
| 104 // This ensures that all the TabContents outlive the NavigationController. |
| 105 void Destroy(); |
| 106 |
| 107 // Clone the receiving navigation controller. Only the active tab contents is |
| 108 // duplicated. It is created as a child of the provided HWND. |
| 109 NavigationController* Clone(HWND hwnd); |
| 110 |
| 111 // Returns the profile for this controller. It can never be NULL. |
| 112 Profile* profile() const { |
| 113 return profile_; |
| 114 } |
| 115 |
| 116 // Active entry -------------------------------------------------------------- |
104 | 117 |
105 // Returns the active entry, which is the pending entry if a navigation is in | 118 // Returns the active entry, which is the pending entry if a navigation is in |
106 // progress or the last committed entry otherwise. NOTE: This can be NULL!! | 119 // progress or the last committed entry otherwise. NOTE: This can be NULL!! |
107 // | 120 // |
108 // If you are trying to get the current state of the NavigationControllerBase, | 121 // If you are trying to get the current state of the NavigationControllerBase, |
109 // this is the method you will typically want to call. | 122 // this is the method you will typically want to call. |
110 // | 123 // |
111 NavigationEntry* GetActiveEntry() const; | 124 NavigationEntry* GetActiveEntry() const; |
112 | 125 |
113 // Returns the index from which we would go back/forward or reload. This is | 126 // Returns the index from which we would go back/forward or reload. This is |
114 // the last_committed_entry_index_ if pending_entry_index_ is -1. Otherwise, | 127 // the last_committed_entry_index_ if pending_entry_index_ is -1. Otherwise, |
115 // it is the pending_entry_index_. | 128 // it is the pending_entry_index_. |
116 int GetCurrentEntryIndex() const; | 129 int GetCurrentEntryIndex() const; |
117 | 130 |
118 // Returns the pending entry corresponding to the navigation that is | 131 // Returns the last committed entry, which may be null if there are no |
119 // currently in progress, or null if there is none. | |
120 NavigationEntry* GetPendingEntry() const { | |
121 return pending_entry_; | |
122 } | |
123 | |
124 // Returns the index of the pending entry or -1 if the pending entry | |
125 // corresponds to a new navigation (created via LoadURL). | |
126 int GetPendingEntryIndex() const { | |
127 return pending_entry_index_; | |
128 } | |
129 | |
130 // Returns the last committed entry, which may be null if there are no | |
131 // committed entries. | 132 // committed entries. |
132 NavigationEntry* GetLastCommittedEntry() const; | 133 NavigationEntry* GetLastCommittedEntry() const; |
133 | 134 |
134 // Returns the index of the last committed entry. | 135 // Returns the index of the last committed entry. |
135 int GetLastCommittedEntryIndex() const { | 136 int GetLastCommittedEntryIndex() const { |
136 return last_committed_entry_index_; | 137 return last_committed_entry_index_; |
137 } | 138 } |
138 | 139 |
| 140 // Navigation list ----------------------------------------------------------- |
| 141 |
139 // Returns the number of entries in the NavigationControllerBase, excluding | 142 // Returns the number of entries in the NavigationControllerBase, excluding |
140 // the pending entry if there is one. | 143 // the pending entry if there is one. |
141 int GetEntryCount() const { | 144 int GetEntryCount() const { |
142 return static_cast<int>(entries_.size()); | 145 return static_cast<int>(entries_.size()); |
143 } | 146 } |
144 | 147 |
145 NavigationEntry* GetEntryAtIndex(int index) const { | 148 NavigationEntry* GetEntryAtIndex(int index) const { |
146 return entries_.at(index).get(); | 149 return entries_.at(index).get(); |
147 } | 150 } |
148 | 151 |
149 // Returns the entry at the specified offset from current. Returns NULL | 152 // Returns the entry at the specified offset from current. Returns NULL |
150 // if out of bounds. | 153 // if out of bounds. |
151 NavigationEntry* GetEntryAtOffset(int offset) const; | 154 NavigationEntry* GetEntryAtOffset(int offset) const; |
152 | 155 |
153 bool CanStop() const; | 156 // Returns the index of the specified entry, or -1 if entry is not contained |
| 157 // in this NavigationControllerBase. |
| 158 int GetIndexOfEntry(const NavigationEntry* entry) const; |
154 | 159 |
155 // Return whether this controller can go back. | 160 // Return the index of the entry with the corresponding type, instance, and |
156 bool CanGoBack() const; | 161 // page_id, or -1 if not found. Use a NULL instance if the type is not |
157 | 162 // TAB_CONTENTS_WEB. |
158 // Return whether this controller can go forward. | 163 int GetEntryIndexWithPageID(TabContentsType type, |
159 bool CanGoForward() const; | 164 SiteInstance* instance, |
160 | 165 int32 page_id) const; |
161 // Causes the controller to go back. | |
162 void GoBack(); | |
163 | |
164 // Causes the controller to go forward. | |
165 void GoForward(); | |
166 | |
167 // Causes the controller to go to the specified index. | |
168 void GoToIndex(int index); | |
169 | |
170 // Causes the controller to go to the specified offset from current. Does | |
171 // nothing if out of bounds. | |
172 void GoToOffset(int offset); | |
173 | |
174 // Causes the controller to stop a pending navigation if any. | |
175 void Stop(); | |
176 | |
177 // Causes the controller to reload the current entry. Will prompt the user if | |
178 // reloading a URL with POST data and the active WebContents isn't showing the | |
179 // POST interstitial page. | |
180 void Reload(); | |
181 | 166 |
182 // Return the entry with the corresponding type, instance, and page_id, or | 167 // Return the entry with the corresponding type, instance, and page_id, or |
183 // NULL if not found. Use a NULL instance if the type is not | 168 // NULL if not found. Use a NULL instance if the type is not |
184 // TAB_CONTENTS_WEB. | 169 // TAB_CONTENTS_WEB. |
185 NavigationEntry* GetEntryWithPageID(TabContentsType type, | 170 NavigationEntry* GetEntryWithPageID(TabContentsType type, |
186 SiteInstance* instance, | 171 SiteInstance* instance, |
187 int32 page_id) const; | 172 int32 page_id) const; |
188 | 173 |
189 // Causes the controller to load the specified entry. The controller | 174 // Pending entry ------------------------------------------------------------- |
190 // assumes ownership of the entry. | |
191 // NOTE: Do not pass an entry that the controller already owns! | |
192 void LoadEntry(NavigationEntry* entry); | |
193 | 175 |
194 // Ensure the given NavigationEntry has a valid state, so that WebKit does | 176 // Commits the current pending entry and issues the NOTIFY_NAV_ENTRY_COMMIT |
195 // not get confused. | 177 // notification. No changes are made to the entry during this process, it is |
196 static void SetContentStateIfEmpty(NavigationEntry* entry); | 178 // just moved from pending to committed. This is an alternative to |
| 179 // RendererDidNavigate for simple TabContents types. |
| 180 // |
| 181 // When the pending entry is a new navigation, it will have a page ID of -1. |
| 182 // The caller should leave this as-is. CommitPendingEntry will generate a |
| 183 // new page ID for you and update the TabContents with that ID. |
| 184 void CommitPendingEntry(); |
197 | 185 |
198 // Begin the destruction sequence for this NavigationController and all its | 186 // Calling this may cause the active tab contents to switch if the current |
199 // registered tabs. The sequence is as follows: | 187 // entry corresponds to a different tab contents type. |
200 // 1. All tabs are asked to Destroy themselves. | 188 void DiscardPendingEntry(); |
201 // 2. When each tab is finished Destroying, it will notify the controller. | 189 |
202 // 3. Once all tabs are Destroyed, the NavigationController deletes itself. | 190 // Returns the pending entry corresponding to the navigation that is |
203 // This ensures that all the TabContents outlive the NavigationController. | 191 // currently in progress, or null if there is none. |
204 void Destroy(); | 192 NavigationEntry* GetPendingEntry() const { |
| 193 return pending_entry_; |
| 194 } |
| 195 |
| 196 // Returns the index of the pending entry or -1 if the pending entry |
| 197 // corresponds to a new navigation (created via LoadURL). |
| 198 int GetPendingEntryIndex() const { |
| 199 return pending_entry_index_; |
| 200 } |
| 201 |
| 202 // New navigations ----------------------------------------------------------- |
| 203 |
| 204 // Loads the specified URL. |
| 205 void LoadURL(const GURL& url, PageTransition::Type type); |
| 206 |
| 207 // Load the specified URL the next time it becomes active. |
| 208 void LoadURLLazily(const GURL& url, PageTransition::Type type, |
| 209 const std::wstring& title, SkBitmap* icon); |
| 210 |
| 211 // Loads the current page if this NavigationController was restored from |
| 212 // history and the current page has not loaded yet. |
| 213 void LoadIfNecessary(); |
| 214 |
| 215 // Renavigation -------------------------------------------------------------- |
| 216 |
| 217 // Navigation relative to the "current entry" |
| 218 bool CanGoBack() const; |
| 219 bool CanGoForward() const; |
| 220 void GoBack(); |
| 221 void GoForward(); |
| 222 |
| 223 // Navigates to the specified absolute index. |
| 224 void GoToIndex(int index); |
| 225 |
| 226 // Navigates to the specified offset from the "current entry". Does nothing if |
| 227 // the offset is out of bounds. |
| 228 void GoToOffset(int offset); |
| 229 |
| 230 // Reloads the current entry. The user will be prompted if the URL has POST |
| 231 // data and the active WebContents isn't showing the POST interstitial page. |
| 232 void Reload(); |
| 233 |
| 234 // Same as Reload, but doesn't check if current entry has POST data. |
| 235 void ReloadDontCheckForRepost(); |
| 236 |
| 237 // TabContents --------------------------------------------------------------- |
205 | 238 |
206 // Notifies the controller that a TabContents that it owns has been destroyed. | 239 // Notifies the controller that a TabContents that it owns has been destroyed. |
207 // This is part of the NavigationController's Destroy sequence. | 240 // This is part of the NavigationController's Destroy sequence. |
208 void TabContentsWasDestroyed(TabContentsType type); | 241 void TabContentsWasDestroyed(TabContentsType type); |
209 | 242 |
| 243 // Returns the TabContents cached on this controller for the given type or |
| 244 // NULL if there is none. |
| 245 TabContents* GetTabContents(TabContentsType type); |
| 246 |
210 // Returns the currently-active TabContents associated with this controller. | 247 // Returns the currently-active TabContents associated with this controller. |
211 // You should use GetActiveEntry instead of this in most cases. | 248 // You should use GetActiveEntry instead of this in most cases. |
212 TabContents* active_contents() const { | 249 TabContents* active_contents() const { |
213 return active_contents_; | 250 return active_contents_; |
214 } | 251 } |
215 | 252 |
216 // This can never be null. | 253 // For use by TabContents ---------------------------------------------------- |
217 Profile* profile() const { | |
218 return profile_; | |
219 } | |
220 | 254 |
221 // Returns the TabContents cached on this controller for the given type or | 255 // Handles updating the navigation state after the renderer has navigated. |
222 // NULL if there is none. | 256 // This is used by the WebContents. Simpler tab contents types can use |
223 TabContents* GetTabContents(TabContentsType type); | 257 // CommitPendingEntry below. |
| 258 // |
| 259 // If a new entry is created, it will return true and will have filled the |
| 260 // given details structure and broadcast the NOTIFY_NAV_ENTRY_COMMITTED |
| 261 // notification. The caller can then use the details without worrying about |
| 262 // listening for the notification. |
| 263 // |
| 264 // In the case that nothing has changed, the details structure is undefined |
| 265 // and it will return false. |
| 266 bool RendererDidNavigate(const ViewHostMsg_FrameNavigate_Params& params, |
| 267 bool is_interstitial, |
| 268 LoadCommittedDetails* details); |
224 | 269 |
225 // Causes the controller to load the specified URL. | 270 // Inserts a new entry by making a copy of the given navigation entry. This is |
226 void LoadURL(const GURL& url, PageTransition::Type type); | 271 // used by interstitials to create dummy entries that they will be in charge |
| 272 // of removing later. |
| 273 void AddDummyEntryForInterstitial(const NavigationEntry& clone_me); |
227 | 274 |
228 // Causes the controller to load the specified URL the next time it becomes | 275 // Removes the last entry in the list. This is used by the interstitial code |
229 // active. | 276 // to delete the dummy entry created by AddDummyEntryForInterstitial. If the |
230 void LoadURLLazily(const GURL& url, PageTransition::Type type, | 277 // last entry is the currently committed one, a ENTRY_COMMITTED notification |
231 const std::wstring& title, SkBitmap* icon); | 278 // will be broadcast. |
| 279 void RemoveLastEntryForInterstitial(); |
| 280 |
| 281 // Notifies us that we just became active. This is used by the TabContents |
| 282 // so that we know to load URLs that were pending as "lazy" loads. |
| 283 void SetActive(bool is_active); |
| 284 |
| 285 // Broadcasts the NOTIFY_NAV_ENTRY_CHANGED notification for the given entry |
| 286 // (which must be at the given index). This will keep things in sync like |
| 287 // the saved session. |
| 288 void NotifyEntryChanged(const NavigationEntry* entry, int index); |
| 289 |
| 290 // Returns true if the given URL would be an in-page navigation (i.e. only |
| 291 // the reference fragment is different) from the "last committed entry". We do |
| 292 // not compare it against the "active entry" since the active entry can be |
| 293 // pending and in page navigations only happen on committed pages. If there |
| 294 // is no last committed entry, then nothing will be in-page. |
| 295 // |
| 296 // Special note: if the URLs are the same, it does NOT count as an in-page |
| 297 // navigation. Neither does an input URL that has no ref, even if the rest is |
| 298 // the same. This may seem weird, but when we're considering whether a |
| 299 // navigation happened without loading anything, the same URL would be a |
| 300 // reload, while only a different ref would be in-page (pages can't clear |
| 301 // refs without reload, only change to "#" which we don't count as empty). |
| 302 bool IsURLInPageNavigation(const GURL& url) const; |
| 303 |
| 304 // Random data --------------------------------------------------------------- |
232 | 305 |
233 // Returns true if this NavigationController is is configured to load a URL | 306 // Returns true if this NavigationController is is configured to load a URL |
234 // lazily. If true, use GetLazyTitle() and GetLazyFavIcon() to discover the | 307 // lazily. If true, use GetLazyTitle() and GetLazyFavIcon() to discover the |
235 // titles and favicons. Since no request was made, this is the only info | 308 // titles and favicons. Since no request was made, this is the only info |
236 // we have about this page. This feature is used by web application clusters. | 309 // we have about this page. This feature is used by web application clusters. |
237 bool LoadingURLLazily(); | 310 bool LoadingURLLazily(); |
238 const std::wstring& GetLazyTitle() const; | 311 const std::wstring& GetLazyTitle() const; |
239 const SkBitmap& GetLazyFavIcon() const; | 312 const SkBitmap& GetLazyFavIcon() const; |
240 | 313 |
| 314 // TODO(brettw) bug 1324500: move this out of here. |
241 void SetAlternateNavURLFetcher( | 315 void SetAlternateNavURLFetcher( |
242 AlternateNavURLFetcher* alternate_nav_url_fetcher); | 316 AlternateNavURLFetcher* alternate_nav_url_fetcher); |
243 | 317 |
244 // -------------------------------------------------------------------------- | |
245 // For use by TabContents implementors: | |
246 | |
247 // Used to inform the NavigationControllerBase of a navigation being committed | |
248 // for a tab. The controller takes ownership of the entry. Any entry located | |
249 // forward to the current entry will be deleted. The new entry becomes the | |
250 // current entry. | |
251 // | |
252 // The details are populated by the caller except for the new NavigationEntry | |
253 // pointer and the previous URL. We will fill these in before using it to | |
254 // broadcast notifications, so it can also be used by the caller. | |
255 // | |
256 // TODO(brettw) bug 1343146: The NavigationController should internally make | |
257 // the entry and the notification details. | |
258 void DidNavigateToEntry(NavigationEntry* entry, | |
259 LoadCommittedDetails* details); | |
260 | |
261 // Calling this may cause the active tab contents to switch if the current | |
262 // entry corresponds to a different tab contents type. | |
263 void DiscardPendingEntry(); | |
264 | |
265 // Inserts an entry after the current position, removing all entries after it. | |
266 // The new entry will become the active one. | |
267 void InsertEntry(NavigationEntry* entry); | |
268 | |
269 // Returns the identifier used by session restore. | 318 // Returns the identifier used by session restore. |
270 const SessionID& session_id() const { return session_id_; } | 319 const SessionID& session_id() const { return session_id_; } |
271 | 320 |
272 // Identifier of the window we're in. | 321 // Identifier of the window we're in. |
273 void SetWindowID(const SessionID& id); | 322 void SetWindowID(const SessionID& id); |
274 const SessionID& window_id() const { return window_id_; } | 323 const SessionID& window_id() const { return window_id_; } |
275 | 324 |
276 SSLManager* ssl_manager() { return &ssl_manager_; } | 325 SSLManager* ssl_manager() { return &ssl_manager_; } |
277 | 326 |
278 // Broadcasts the NOTIFY_NAV_ENTRY_CHANGED notification for the | |
279 // navigation corresponding to the given page. This will keep things in sync | |
280 // like saved session. | |
281 void NotifyEntryChangedByPageID(TabContentsType type, | |
282 SiteInstance* instance, | |
283 int32 page_id); | |
284 | |
285 void SetActive(bool is_active); | |
286 | |
287 // If this NavigationController was restored from history and the selected | |
288 // page has not loaded, it is loaded. | |
289 void LoadIfNecessary(); | |
290 | |
291 // Clone the receiving navigation controller. Only the active tab contents is | |
292 // duplicated. It is created as a child of the provided HWND. | |
293 NavigationController* Clone(HWND hwnd); | |
294 | |
295 // Returns true if a reload happens when activated (SetActive(true) is | 327 // Returns true if a reload happens when activated (SetActive(true) is |
296 // invoked). This is true for session/tab restore and cloned tabs. | 328 // invoked). This is true for session/tab restore and cloned tabs. |
297 bool needs_reload() const { return needs_reload_; } | 329 bool needs_reload() const { return needs_reload_; } |
298 | 330 |
| 331 // Returns the largest restored page ID seen in this navigation controller, |
| 332 // if it was restored from a previous session. (-1 otherwise) |
| 333 int max_restored_page_id() const { return max_restored_page_id_; } |
| 334 |
299 // Disables checking for a repost and prompting the user. This is used during | 335 // Disables checking for a repost and prompting the user. This is used during |
300 // testing. | 336 // testing. |
301 static void DisablePromptOnRepost(); | 337 static void DisablePromptOnRepost(); |
302 | 338 |
303 // Returns the largest restored page ID seen in this navigation controller, | |
304 // if it was restored from a previous session. (-1 otherwise) | |
305 int max_restored_page_id() const { return max_restored_page_id_; } | |
306 | |
307 // Returns the index of the specified entry, or -1 if entry is not contained | |
308 // in this NavigationControllerBase. | |
309 int GetIndexOfEntry(const NavigationEntry* entry) const; | |
310 | |
311 // Removes the last committed entry. | |
312 void RemoveLastEntry(); | |
313 | |
314 private: | 339 private: |
315 FRIEND_TEST(NavigationControllerTest, EnforceMaxNavigationCount); | 340 FRIEND_TEST(NavigationControllerTest, EnforceMaxNavigationCount); |
316 | |
317 class RestoreHelper; | 341 class RestoreHelper; |
318 friend class RestoreHelper; | 342 friend class RestoreHelper; |
| 343 friend class TabContents; // For invoking OnReservedPageIDRange. |
319 | 344 |
320 // For invoking OnReservedPageIDRange. | 345 // Indicates different types of navigations that can occur that we will handle |
321 friend class TabContents; | 346 // separately. This is computed by ClassifyNavigation. |
322 // For invoking GetMaxPageID. | 347 enum NavClass { |
323 friend class WebContents; | 348 // A new page was navigated in the main frame. |
324 // For invoking GetMaxPageID. | 349 NAV_NEW_PAGE, |
325 friend class printing::PrintViewManager; | |
326 | 350 |
327 // Returns the largest page ID seen. When PageIDs come in larger than | 351 // Renavigating to an existing navigation entry. The entry is guaranteed to |
328 // this (via DidNavigateToEntry), we know that we've navigated to a new page. | 352 // exist in the list, or else it would be a new page or IGNORE navigation. |
329 int GetMaxPageID() const; | 353 NAV_EXISTING_PAGE, |
| 354 |
| 355 // The same page has been reloaded as a result of the user requesting |
| 356 // navigation to that same page (like pressing Enter in the URL bar). This |
| 357 // is not the same as an in-page navigation because we'll actually have a |
| 358 // pending entry for the load, which is then meaningless. |
| 359 NAV_SAME_PAGE, |
| 360 |
| 361 // In page navigations are when the reference fragment changes. This will |
| 362 // be in the main frame only (we won't even get notified of in-page |
| 363 // subframe navigations). It may be for any page, not necessarily the last |
| 364 // committed one (for example, whey going back to a page with a ref). |
| 365 NAV_IN_PAGE, |
| 366 |
| 367 // A new subframe was manually navigated by the user. We will create a new |
| 368 // NavigationEntry so they can go back to the previous subframe content |
| 369 // using the back button. |
| 370 NAV_NEW_SUBFRAME, |
| 371 |
| 372 // A subframe in the page was automatically loaded or navigated to such that |
| 373 // a new navigation entry should not be created. There are two cases: |
| 374 // 1. Stuff like iframes containing ads that the page loads automatically. |
| 375 // The user doesn't want to see these, so we just update the existing |
| 376 // navigation entry. |
| 377 // 2. Going back/forward to previous subframe navigations. We don't create |
| 378 // a new entry here either, just update the last committed entry. |
| 379 // These two cases are actually pretty different, they just happen to |
| 380 // require almost the same code to handle. |
| 381 NAV_AUTO_SUBFRAME, |
| 382 |
| 383 // Nothing happened. This happens when we get information about a page we |
| 384 // don't know anything about. It can also happen when an iframe in a popup |
| 385 // navigated to about:blank is navigated. Nothing needs to be done. |
| 386 NAV_IGNORE, |
| 387 }; |
| 388 |
| 389 // Classifies the given renderer navigation (see the NavigationType enum). |
| 390 NavClass ClassifyNavigation( |
| 391 const ViewHostMsg_FrameNavigate_Params& params) const; |
| 392 |
| 393 // Causes the controller to load the specified entry. The function assumes |
| 394 // ownership of the pointer since it is put in the navigation list. |
| 395 // NOTE: Do not pass an entry that the controller already owns! |
| 396 void LoadEntry(NavigationEntry* entry); |
| 397 |
| 398 // Handlers for the different types of navigation types. They will actually |
| 399 // handle the navigations corresponding to the different NavClasses above. |
| 400 // They will NOT broadcast the commit notification, that should be handled by |
| 401 // the caller. |
| 402 // |
| 403 // RendererDidNavigateAutoSubframe is special, it may not actually change |
| 404 // anything if some random subframe is loaded. It will return true if anything |
| 405 // changed, or false if not. |
| 406 void RendererDidNavigateToNewPage( |
| 407 const ViewHostMsg_FrameNavigate_Params& params); |
| 408 void RendererDidNavigateToExistingPage( |
| 409 const ViewHostMsg_FrameNavigate_Params& params); |
| 410 void RendererDidNavigateToSamePage( |
| 411 const ViewHostMsg_FrameNavigate_Params& params); |
| 412 void RendererDidNavigateInPage( |
| 413 const ViewHostMsg_FrameNavigate_Params& params); |
| 414 void RendererDidNavigateNewSubframe( |
| 415 const ViewHostMsg_FrameNavigate_Params& params); |
| 416 bool RendererDidNavigateAutoSubframe( |
| 417 const ViewHostMsg_FrameNavigate_Params& params); |
330 | 418 |
331 // Actually issues the navigation held in pending_entry. | 419 // Actually issues the navigation held in pending_entry. |
332 void NavigateToPendingEntry(bool reload); | 420 void NavigateToPendingEntry(bool reload); |
333 | 421 |
334 // Allows the derived class to issue notifications that a load has been | 422 // Allows the derived class to issue notifications that a load has been |
335 // committed. This will fill in the active entry to the details structure. | 423 // committed. This will fill in the active entry to the details structure. |
336 void NotifyNavigationEntryCommitted(LoadCommittedDetails* details); | 424 void NotifyNavigationEntryCommitted(LoadCommittedDetails* details); |
337 | 425 |
338 // Invoked when entries have been pruned, or removed. For example, if the | |
339 // current entries are [google, digg, yahoo], with the current entry google, | |
340 // and the user types in cnet, then digg and yahoo are pruned. | |
341 void NotifyPrunedEntries(); | |
342 | |
343 // Invoked when the index of the active entry may have changed. | 426 // Invoked when the index of the active entry may have changed. |
344 // The prev_commited_index parameter specifies the previous value | 427 // The prev_commited_index parameter specifies the previous value |
345 // of the last commited index before this navigation event happened | 428 // of the last commited index before this navigation event happened |
346 void IndexOfActiveEntryChanged(int prev_commited_index); | 429 void IndexOfActiveEntryChanged(int prev_commited_index); |
347 | 430 |
348 // Returns the TabContents for the |entry|'s type. If the TabContents | 431 // Returns the TabContents for the |entry|'s type. If the TabContents |
349 // doesn't yet exist, it is created. If a new TabContents is created, its | 432 // doesn't yet exist, it is created. If a new TabContents is created, its |
350 // parent is |parent|. Becomes part of |entry|'s SiteInstance. | 433 // parent is |parent|. Becomes part of |entry|'s SiteInstance. |
351 TabContents* GetTabContentsCreateIfNecessary(HWND parent, | 434 TabContents* GetTabContentsCreateIfNecessary(HWND parent, |
352 const NavigationEntry& entry); | 435 const NavigationEntry& entry); |
353 | 436 |
354 // Register the provided tab contents. This tab contents will be owned | 437 // Register the provided tab contents. This tab contents will be owned |
355 // and deleted by this navigation controller | 438 // and deleted by this navigation controller |
356 void RegisterTabContents(TabContents* some_contents); | 439 void RegisterTabContents(TabContents* some_contents); |
357 | 440 |
358 // Broadcasts a notification that the given entry changed. | |
359 void NotifyEntryChanged(const NavigationEntry* entry, int index); | |
360 | |
361 // Removes the entry at the specified index. Note that you should not remove | 441 // Removes the entry at the specified index. Note that you should not remove |
362 // the pending entry or the last committed entry. | 442 // the pending entry or the last committed entry. |
363 void RemoveEntryAtIndex(int index); | 443 void RemoveEntryAtIndex(int index); |
364 | 444 |
365 // Sets the max restored page ID this NavigationController has seen, if it | 445 // Sets the max restored page ID this NavigationController has seen, if it |
366 // was restored from a previous session. | 446 // was restored from a previous session. |
367 void set_max_restored_page_id(int max_id) { max_restored_page_id_ = max_id; } | 447 void set_max_restored_page_id(int max_id) { max_restored_page_id_ = max_id; } |
368 | 448 |
369 NavigationEntry* CreateNavigationEntry(const GURL& url, | 449 NavigationEntry* CreateNavigationEntry(const GURL& url, |
370 PageTransition::Type transition); | 450 PageTransition::Type transition); |
371 | 451 |
372 // Invokes ScheduleTabContentsCollection for all TabContents but the active | 452 // Invokes ScheduleTabContentsCollection for all TabContents but the active |
373 // one. | 453 // one. |
374 void ScheduleTabContentsCollectionForInactiveTabs(); | 454 void ScheduleTabContentsCollectionForInactiveTabs(); |
375 | 455 |
376 // Schedule the TabContents currently allocated for |tc| for collection. | 456 // Schedule the TabContents currently allocated for |tc| for collection. |
377 // The TabContents will be destroyed later from a different event. | 457 // The TabContents will be destroyed later from a different event. |
378 void ScheduleTabContentsCollection(TabContentsType t); | 458 void ScheduleTabContentsCollection(TabContentsType t); |
379 | 459 |
380 // Cancel the collection of the TabContents allocated for |tc|. This method | 460 // Cancel the collection of the TabContents allocated for |tc|. This method |
381 // is used when we keep using a TabContents because a provisional load failed. | 461 // is used when we keep using a TabContents because a provisional load failed. |
382 void CancelTabContentsCollection(TabContentsType t); | 462 void CancelTabContentsCollection(TabContentsType t); |
383 | 463 |
384 // Invoked after session/tab restore or cloning a tab. Resets the transition | 464 // Invoked after session/tab restore or cloning a tab. Resets the transition |
385 // type of the entries, updates the max page id and creates the active | 465 // type of the entries, updates the max page id and creates the active |
386 // contents. | 466 // contents. |
387 void FinishRestore(HWND parent_hwnd, int selected_index); | 467 void FinishRestore(HWND parent_hwnd, int selected_index); |
388 | 468 |
| 469 // Inserts an entry after the current position, removing all entries after it. |
| 470 // The new entry will become the active one. |
| 471 void InsertEntry(NavigationEntry* entry); |
| 472 |
389 // Discards the pending entry without updating active_contents_ | 473 // Discards the pending entry without updating active_contents_ |
390 void DiscardPendingEntryInternal(); | 474 void DiscardPendingEntryInternal(); |
391 | 475 |
392 // Return the index of the entry with the corresponding type, instance, and | 476 // --------------------------------------------------------------------------- |
393 // page_id, or -1 if not found. Use a NULL instance if the type is not | |
394 // TAB_CONTENTS_WEB. | |
395 int GetEntryIndexWithPageID(TabContentsType type, | |
396 SiteInstance* instance, | |
397 int32 page_id) const; | |
398 | 477 |
399 // The user profile associated with this controller | 478 // The user profile associated with this controller |
400 Profile* profile_; | 479 Profile* profile_; |
401 | 480 |
402 // List of NavigationEntry for this tab | 481 // List of NavigationEntry for this tab |
403 typedef std::vector<linked_ptr<NavigationEntry> > NavigationEntries; | 482 typedef std::vector<linked_ptr<NavigationEntry> > NavigationEntries; |
404 NavigationEntries entries_; | 483 NavigationEntries entries_; |
405 | 484 |
406 // An entry we haven't gotten a response for yet. This will be discarded | 485 // An entry we haven't gotten a response for yet. This will be discarded |
407 // when we navigate again. It's used only so we know what the currently | 486 // when we navigate again. It's used only so we know what the currently |
408 // displayed tab is. | 487 // displayed tab is. |
409 // | 488 // |
410 // This may refer to an item in the entries_ list if the pending_entry_index_ | 489 // This may refer to an item in the entries_ list if the pending_entry_index_ |
411 // == -1, or it may be its own entry that should be deleted. Be careful with | 490 // == -1, or it may be its own entry that should be deleted. Be careful with |
412 // the memory management. | 491 // the memory management. |
413 NavigationEntry* pending_entry_; | 492 NavigationEntry* pending_entry_; |
414 | 493 |
415 // currently visible entry | 494 // currently visible entry |
416 int last_committed_entry_index_; | 495 int last_committed_entry_index_; |
417 | 496 |
418 // index of pending entry if it is in entries_, or -1 if pending_entry_ is a | 497 // index of pending entry if it is in entries_, or -1 if pending_entry_ is a |
419 // new entry (created by LoadURL). | 498 // new entry (created by LoadURL). |
420 int pending_entry_index_; | 499 int pending_entry_index_; |
421 | 500 |
422 // Tab contents. One entry per type used. The tab controller owns | 501 // Tab contents. One entry per type used. The tab controller owns |
423 // every tab contents used. | 502 // every tab contents used. |
424 typedef stdext::hash_map<TabContentsType, TabContents*> TabContentsMap; | 503 typedef std::map<TabContentsType, TabContents*> TabContentsMap; |
425 TabContentsMap tab_contents_map_; | 504 TabContentsMap tab_contents_map_; |
426 | 505 |
427 // A map of TabContentsType -> TabContentsCollector containing all the | 506 // A map of TabContentsType -> TabContentsCollector containing all the |
428 // pending collectors. | 507 // pending collectors. |
429 typedef stdext::hash_map<TabContentsType, TabContentsCollector*> | 508 typedef stdext::hash_map<TabContentsType, TabContentsCollector*> |
430 TabContentsCollectorMap; | 509 TabContentsCollectorMap; |
431 TabContentsCollectorMap tab_contents_collector_map_; | 510 TabContentsCollectorMap tab_contents_collector_map_; |
432 | 511 |
433 // The tab contents that is currently active. | 512 // The tab contents that is currently active. |
434 TabContents* active_contents_; | 513 TabContents* active_contents_; |
(...skipping 29 matching lines...) Expand all Loading... |
464 // when testing. | 543 // when testing. |
465 static bool check_for_repost_; | 544 static bool check_for_repost_; |
466 | 545 |
467 // The maximum number of entries that a navigation controller can store. | 546 // The maximum number of entries that a navigation controller can store. |
468 size_t max_entry_count_; | 547 size_t max_entry_count_; |
469 | 548 |
470 DISALLOW_COPY_AND_ASSIGN(NavigationController); | 549 DISALLOW_COPY_AND_ASSIGN(NavigationController); |
471 }; | 550 }; |
472 | 551 |
473 #endif // CHROME_BROWSER_NAVIGATION_CONTROLLER_H_ | 552 #endif // CHROME_BROWSER_NAVIGATION_CONTROLLER_H_ |
474 | |
OLD | NEW |