OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 CONTENT_BROWSER_FRAME_HOST_NAVIGATION_CONTROLLER_IMPL_H_ | 5 #ifndef CONTENT_BROWSER_FRAME_HOST_NAVIGATION_CONTROLLER_IMPL_H_ |
6 #define CONTENT_BROWSER_FRAME_HOST_NAVIGATION_CONTROLLER_IMPL_H_ | 6 #define CONTENT_BROWSER_FRAME_HOST_NAVIGATION_CONTROLLER_IMPL_H_ |
7 | 7 |
8 #include "base/callback.h" | 8 #include "base/callback.h" |
9 #include "base/compiler_specific.h" | 9 #include "base/compiler_specific.h" |
10 #include "base/gtest_prod_util.h" | 10 #include "base/gtest_prod_util.h" |
11 #include "base/memory/linked_ptr.h" | 11 #include "base/memory/linked_ptr.h" |
12 #include "base/time/time.h" | 12 #include "base/time/time.h" |
13 #include "build/build_config.h" | 13 #include "build/build_config.h" |
14 #include "content/browser/frame_host/navigation_controller_delegate.h" | 14 #include "content/browser/frame_host/navigation_controller_delegate.h" |
15 #include "content/browser/frame_host/navigation_entry_impl.h" | 15 #include "content/browser/frame_host/navigation_entry_impl.h" |
16 #include "content/browser/ssl/ssl_manager.h" | 16 #include "content/browser/ssl/ssl_manager.h" |
17 #include "content/public/browser/navigation_controller.h" | 17 #include "content/public/browser/navigation_controller.h" |
18 #include "content/public/browser/navigation_type.h" | 18 #include "content/public/browser/navigation_type.h" |
19 | 19 |
20 struct FrameHostMsg_DidCommitProvisionalLoad_Params; | 20 struct FrameHostMsg_DidCommitProvisionalLoad_Params; |
21 | 21 |
22 namespace content { | 22 namespace content { |
| 23 class FrameTreeNode; |
23 class RenderFrameHostImpl; | 24 class RenderFrameHostImpl; |
24 class NavigationEntryScreenshotManager; | 25 class NavigationEntryScreenshotManager; |
25 class SiteInstance; | 26 class SiteInstance; |
26 struct LoadCommittedDetails; | 27 struct LoadCommittedDetails; |
27 | 28 |
28 class CONTENT_EXPORT NavigationControllerImpl | 29 class CONTENT_EXPORT NavigationControllerImpl |
29 : public NON_EXPORTED_BASE(NavigationController) { | 30 : public NON_EXPORTED_BASE(NavigationController) { |
30 public: | 31 public: |
31 NavigationControllerImpl( | 32 NavigationControllerImpl( |
32 NavigationControllerDelegate* delegate, | 33 NavigationControllerDelegate* delegate, |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
95 | 96 |
96 // The session storage namespace that all child RenderViews belonging to | 97 // The session storage namespace that all child RenderViews belonging to |
97 // |instance| should use. | 98 // |instance| should use. |
98 SessionStorageNamespace* GetSessionStorageNamespace( | 99 SessionStorageNamespace* GetSessionStorageNamespace( |
99 SiteInstance* instance); | 100 SiteInstance* instance); |
100 | 101 |
101 // Returns the index of the specified entry, or -1 if entry is not contained | 102 // Returns the index of the specified entry, or -1 if entry is not contained |
102 // in this NavigationController. | 103 // in this NavigationController. |
103 int GetIndexOfEntry(const NavigationEntryImpl* entry) const; | 104 int GetIndexOfEntry(const NavigationEntryImpl* entry) const; |
104 | 105 |
105 // Return the index of the entry with the corresponding instance and page_id, | 106 // Return the index of the entry with the corresponding page_id, or -1 if not |
106 // or -1 if not found. | 107 // found. |
107 int GetEntryIndexWithPageID(SiteInstance* instance, | 108 int GetEntryIndexWithPageID(int32 page_id) const; |
108 int32 page_id) const; | |
109 | 109 |
110 // Return the entry with the corresponding instance and page_id, or NULL if | 110 // TODO(creis): Private? const? |
111 // not found. | 111 int GetFrameEntryIndex(int64 frame_tree_node_id, |
112 NavigationEntryImpl* GetEntryWithPageID( | 112 SiteInstance* site_instance, |
113 SiteInstance* instance, | 113 int64 item_sequence_number); |
114 int32 page_id) const; | 114 |
| 115 // Return the entry with the corresponding page_id, or NULL if not found. |
| 116 NavigationEntryImpl* GetEntryWithPageID(int32 page_id) const; |
115 | 117 |
116 NavigationControllerDelegate* delegate() const { | 118 NavigationControllerDelegate* delegate() const { |
117 return delegate_; | 119 return delegate_; |
118 } | 120 } |
119 | 121 |
120 // For use by WebContentsImpl ------------------------------------------------ | 122 // For use by WebContentsImpl ------------------------------------------------ |
121 | 123 |
122 // Allow renderer-initiated navigations to create a pending entry when the | 124 // Allow renderer-initiated navigations to create a pending entry when the |
123 // provisional load starts. | 125 // provisional load starts. |
124 void SetPendingEntry(content::NavigationEntryImpl* entry); | 126 void SetPendingEntry(content::NavigationEntryImpl* entry); |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
205 private: | 207 private: |
206 friend class RestoreHelper; | 208 friend class RestoreHelper; |
207 | 209 |
208 FRIEND_TEST_ALL_PREFIXES(NavigationControllerTest, | 210 FRIEND_TEST_ALL_PREFIXES(NavigationControllerTest, |
209 PurgeScreenshot); | 211 PurgeScreenshot); |
210 FRIEND_TEST_ALL_PREFIXES(TimeSmoother, Basic); | 212 FRIEND_TEST_ALL_PREFIXES(TimeSmoother, Basic); |
211 FRIEND_TEST_ALL_PREFIXES(TimeSmoother, SingleDuplicate); | 213 FRIEND_TEST_ALL_PREFIXES(TimeSmoother, SingleDuplicate); |
212 FRIEND_TEST_ALL_PREFIXES(TimeSmoother, ManyDuplicates); | 214 FRIEND_TEST_ALL_PREFIXES(TimeSmoother, ManyDuplicates); |
213 FRIEND_TEST_ALL_PREFIXES(TimeSmoother, ClockBackwardsJump); | 215 FRIEND_TEST_ALL_PREFIXES(TimeSmoother, ClockBackwardsJump); |
214 | 216 |
| 217 typedef std::vector<std::pair<FrameTreeNode*, FrameNavigationEntry*> > |
| 218 FrameLoadVector; |
| 219 |
215 // Helper class to smooth out runs of duplicate timestamps while still | 220 // Helper class to smooth out runs of duplicate timestamps while still |
216 // allowing time to jump backwards. | 221 // allowing time to jump backwards. |
217 class CONTENT_EXPORT TimeSmoother { | 222 class CONTENT_EXPORT TimeSmoother { |
218 public: | 223 public: |
219 // Returns |t| with possibly some time added on. | 224 // Returns |t| with possibly some time added on. |
220 base::Time GetSmoothedTime(base::Time t); | 225 base::Time GetSmoothedTime(base::Time t); |
221 | 226 |
222 private: | 227 private: |
223 // |low_water_mark_| is the first time in a sequence of adjusted | 228 // |low_water_mark_| is the first time in a sequence of adjusted |
224 // times and |high_water_mark_| is the last. | 229 // times and |high_water_mark_| is the last. |
225 base::Time low_water_mark_; | 230 base::Time low_water_mark_; |
226 base::Time high_water_mark_; | 231 base::Time high_water_mark_; |
227 }; | 232 }; |
228 | 233 |
| 234 // TODO(creis): Remove and share code with CreateNavigationEntry. |
| 235 NavigationEntryImpl* CreateSubframeNavigationEntry( |
| 236 int64 frame_tree_node_id, |
| 237 const GURL& url, |
| 238 const Referrer& referrer, |
| 239 ui::PageTransition transition, |
| 240 bool is_renderer_initiated, |
| 241 const std::string& extra_headers, |
| 242 BrowserContext* browser_context); |
| 243 |
229 // Classifies the given renderer navigation (see the NavigationType enum). | 244 // Classifies the given renderer navigation (see the NavigationType enum). |
230 NavigationType ClassifyNavigation( | 245 NavigationType ClassifyNavigation( |
231 RenderFrameHostImpl* rfh, | 246 RenderFrameHostImpl* rfh, |
232 const FrameHostMsg_DidCommitProvisionalLoad_Params& params) const; | 247 const FrameHostMsg_DidCommitProvisionalLoad_Params& params) const; |
233 | 248 |
234 // Causes the controller to load the specified entry. The function assumes | 249 // Causes the controller to load the specified entry. The function assumes |
235 // ownership of the pointer since it is put in the navigation list. | 250 // ownership of the pointer since it is put in the navigation list. |
236 // NOTE: Do not pass an entry that the controller already owns! | 251 // NOTE: Do not pass an entry that the controller already owns! |
237 void LoadEntry(NavigationEntryImpl* entry); | 252 void LoadEntry(NavigationEntryImpl* entry); |
238 | 253 |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
284 void UpdateVirtualURLToURL(NavigationEntryImpl* entry, | 299 void UpdateVirtualURLToURL(NavigationEntryImpl* entry, |
285 const GURL& new_url); | 300 const GURL& new_url); |
286 | 301 |
287 // Invoked after session/tab restore or cloning a tab. Resets the transition | 302 // Invoked after session/tab restore or cloning a tab. Resets the transition |
288 // type of the entries, updates the max page id and creates the active | 303 // type of the entries, updates the max page id and creates the active |
289 // contents. | 304 // contents. |
290 void FinishRestore(int selected_index, RestoreType type); | 305 void FinishRestore(int selected_index, RestoreType type); |
291 | 306 |
292 // Inserts a new entry or replaces the current entry with a new one, removing | 307 // Inserts a new entry or replaces the current entry with a new one, removing |
293 // all entries after it. The new entry will become the active one. | 308 // all entries after it. The new entry will become the active one. |
294 void InsertOrReplaceEntry(NavigationEntryImpl* entry, bool replace); | 309 void InsertOrReplaceEntry(RenderFrameHostImpl* render_frame_host, |
| 310 NavigationEntryImpl* entry, |
| 311 FrameNavigationEntry* frame_entry, |
| 312 bool replace); |
295 | 313 |
296 // Removes the entry at |index|, as long as it is not the current entry. | 314 // Removes the entry at |index|, as long as it is not the current entry. |
297 void RemoveEntryAtIndexInternal(int index); | 315 void RemoveEntryAtIndexInternal(int index); |
298 | 316 |
299 // Discards both the pending and transient entries. | 317 // Discards both the pending and transient entries. |
300 void DiscardNonCommittedEntriesInternal(); | 318 void DiscardNonCommittedEntriesInternal(); |
301 | 319 |
302 // Discards only the transient entry. | 320 // Discards only the transient entry. |
303 void DiscardTransientEntry(); | 321 void DiscardTransientEntry(); |
304 | 322 |
(...skipping 15 matching lines...) Expand all Loading... |
320 // Inserts up to |max_index| entries from |source| into this. This does NOT | 338 // Inserts up to |max_index| entries from |source| into this. This does NOT |
321 // adjust any of the members that reference entries_ | 339 // adjust any of the members that reference entries_ |
322 // (last_committed_entry_index_, pending_entry_index_ or | 340 // (last_committed_entry_index_, pending_entry_index_ or |
323 // transient_entry_index_). | 341 // transient_entry_index_). |
324 void InsertEntriesFrom(const NavigationControllerImpl& source, int max_index); | 342 void InsertEntriesFrom(const NavigationControllerImpl& source, int max_index); |
325 | 343 |
326 // Returns the navigation index that differs from the current entry by the | 344 // Returns the navigation index that differs from the current entry by the |
327 // specified |offset|. The index returned is not guaranteed to be valid. | 345 // specified |offset|. The index returned is not guaranteed to be valid. |
328 int GetIndexForOffset(int offset) const; | 346 int GetIndexForOffset(int offset) const; |
329 | 347 |
| 348 // Recursively add FrameNavigationEntry pointers for the current entries in |
| 349 // each frame's session history to the tree in the top-level NavigationEntry. |
| 350 void AddFramesToNavigationEntry( |
| 351 NavigationEntryImpl::TreeNode* entry_node, |
| 352 FrameTreeNode* frame_tree_node); |
| 353 |
| 354 // Recursively identifies which frames need to be navigated for the pending |
| 355 // NavigationEntry, then tells each such frame to navigate. |
| 356 bool NavigateToPendingEntryInternal(ReloadType reload_type); |
| 357 void RecursiveNavigateToPendingEntry(FrameTreeNode* frame, |
| 358 FrameLoadVector* sameDocumentLoads, |
| 359 FrameLoadVector* differentDocumentLoads); |
| 360 |
330 // --------------------------------------------------------------------------- | 361 // --------------------------------------------------------------------------- |
331 | 362 |
332 // The user browser context associated with this controller. | 363 // The user browser context associated with this controller. |
333 BrowserContext* browser_context_; | 364 BrowserContext* browser_context_; |
334 | 365 |
335 // List of NavigationEntry for this tab | 366 // List of NavigationEntry for this tab |
336 typedef std::vector<linked_ptr<NavigationEntryImpl> > NavigationEntries; | 367 typedef std::vector<linked_ptr<NavigationEntryImpl> > NavigationEntries; |
337 NavigationEntries entries_; | 368 NavigationEntries entries_; |
338 | 369 |
339 // An entry we haven't gotten a response for yet. This will be discarded | 370 // An entry we haven't gotten a response for yet. This will be discarded |
(...skipping 16 matching lines...) Expand all Loading... |
356 // used for interstitial pages. -1 if there are no such entry. | 387 // used for interstitial pages. -1 if there are no such entry. |
357 // Note that this entry really appears in the list of entries, but only | 388 // Note that this entry really appears in the list of entries, but only |
358 // temporarily (until the next navigation). Any index pointing to an entry | 389 // temporarily (until the next navigation). Any index pointing to an entry |
359 // after the transient entry will become invalid if you navigate forward. | 390 // after the transient entry will become invalid if you navigate forward. |
360 int transient_entry_index_; | 391 int transient_entry_index_; |
361 | 392 |
362 // The delegate associated with the controller. Possibly NULL during | 393 // The delegate associated with the controller. Possibly NULL during |
363 // setup. | 394 // setup. |
364 NavigationControllerDelegate* delegate_; | 395 NavigationControllerDelegate* delegate_; |
365 | 396 |
| 397 // The next available page ID, which identifies joint session history items. |
| 398 // TODO(creis): Copy when cloning tabs. |
| 399 int32 next_page_id_; |
| 400 |
366 // The max restored page ID in this controller, if it was restored. We must | 401 // The max restored page ID in this controller, if it was restored. We must |
367 // store this so that WebContentsImpl can tell any renderer in charge of one | 402 // store this so that WebContentsImpl can tell any renderer in charge of one |
368 // of the restored entries to update its max page ID. | 403 // of the restored entries to update its max page ID. |
369 int32 max_restored_page_id_; | 404 int32 max_restored_page_id_; |
370 | 405 |
371 // Manages the SSL security UI. | 406 // Manages the SSL security UI. |
372 SSLManager ssl_manager_; | 407 SSLManager ssl_manager_; |
373 | 408 |
374 // Whether we need to be reloaded when made active. | 409 // Whether we need to be reloaded when made active. |
375 bool needs_reload_; | 410 bool needs_reload_; |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
408 TimeSmoother time_smoother_; | 443 TimeSmoother time_smoother_; |
409 | 444 |
410 scoped_ptr<NavigationEntryScreenshotManager> screenshot_manager_; | 445 scoped_ptr<NavigationEntryScreenshotManager> screenshot_manager_; |
411 | 446 |
412 DISALLOW_COPY_AND_ASSIGN(NavigationControllerImpl); | 447 DISALLOW_COPY_AND_ASSIGN(NavigationControllerImpl); |
413 }; | 448 }; |
414 | 449 |
415 } // namespace content | 450 } // namespace content |
416 | 451 |
417 #endif // CONTENT_BROWSER_FRAME_HOST_NAVIGATION_CONTROLLER_IMPL_H_ | 452 #endif // CONTENT_BROWSER_FRAME_HOST_NAVIGATION_CONTROLLER_IMPL_H_ |
OLD | NEW |