Chromium Code Reviews| 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 #include "chrome/browser/tab_contents/navigation_controller.h" | 5 #include "chrome/browser/tab_contents/navigation_controller.h" |
| 6 | 6 |
| 7 #include "base/file_util.h" | 7 #include "base/file_util.h" |
| 8 #include "base/logging.h" | 8 #include "base/logging.h" |
| 9 #include "base/string_util.h" | 9 #include "base/string_util.h" |
| 10 #include "base/time.h" | 10 #include "base/time.h" |
| (...skipping 587 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 598 new_entry = new NavigationEntry; | 598 new_entry = new NavigationEntry; |
| 599 } | 599 } |
| 600 | 600 |
| 601 new_entry->set_url(params.url); | 601 new_entry->set_url(params.url); |
| 602 new_entry->set_referrer(params.referrer); | 602 new_entry->set_referrer(params.referrer); |
| 603 new_entry->set_page_id(params.page_id); | 603 new_entry->set_page_id(params.page_id); |
| 604 new_entry->set_transition_type(params.transition); | 604 new_entry->set_transition_type(params.transition); |
| 605 new_entry->set_site_instance(tab_contents_->GetSiteInstance()); | 605 new_entry->set_site_instance(tab_contents_->GetSiteInstance()); |
| 606 new_entry->set_has_post_data(params.is_post); | 606 new_entry->set_has_post_data(params.is_post); |
| 607 | 607 |
| 608 InsertEntry(new_entry); | 608 if (PageTransition::IsRedirect(new_entry->transition_type())) { |
| 609 // The current entry is a redirection source. It needs to be replaced with | |
| 610 // the new entry to avoid unwanted redirections in navigating backward / | |
| 611 // forward. | |
| 612 ReplaceCurrentEntry(new_entry); | |
| 613 } else { | |
| 614 InsertEntry(new_entry); | |
| 615 } | |
| 609 } | 616 } |
| 610 | 617 |
| 611 void NavigationController::RendererDidNavigateToExistingPage( | 618 void NavigationController::RendererDidNavigateToExistingPage( |
| 612 const ViewHostMsg_FrameNavigate_Params& params) { | 619 const ViewHostMsg_FrameNavigate_Params& params) { |
| 613 // We should only get here for main frame navigations. | 620 // We should only get here for main frame navigations. |
| 614 DCHECK(PageTransition::IsMainFrame(params.transition)); | 621 DCHECK(PageTransition::IsMainFrame(params.transition)); |
| 615 | 622 |
| 616 // This is a back/forward navigation. The existing page for the ID is | 623 // This is a back/forward navigation. The existing page for the ID is |
| 617 // guaranteed to exist by ClassifyNavigation, and we just need to update it | 624 // guaranteed to exist by ClassifyNavigation, and we just need to update it |
| 618 // with new information from the renderer. | 625 // with new information from the renderer. |
| (...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 801 | 808 |
| 802 // If there was a transient entry, invalidate everything so the new active | 809 // If there was a transient entry, invalidate everything so the new active |
| 803 // entry state is shown. | 810 // entry state is shown. |
| 804 if (transient) { | 811 if (transient) { |
| 805 tab_contents_->NotifyNavigationStateChanged( | 812 tab_contents_->NotifyNavigationStateChanged( |
| 806 TabContents::INVALIDATE_EVERYTHING); | 813 TabContents::INVALIDATE_EVERYTHING); |
| 807 } | 814 } |
| 808 } | 815 } |
| 809 | 816 |
| 810 void NavigationController::InsertEntry(NavigationEntry* entry) { | 817 void NavigationController::InsertEntry(NavigationEntry* entry) { |
| 818 InsertOrReplaceEntry(entry, false); | |
| 819 } | |
| 820 | |
| 821 void NavigationController::ReplaceCurrentEntry(NavigationEntry* entry) { | |
| 822 InsertOrReplaceEntry(entry, true); | |
| 823 } | |
| 824 | |
| 825 void NavigationController::InsertOrReplaceEntry( | |
|
brettw
2009/04/24 20:57:59
When all the args fit, we usually like to wrap the
| |
| 826 NavigationEntry* entry, bool replace) { | |
| 811 DCHECK(entry->transition_type() != PageTransition::AUTO_SUBFRAME); | 827 DCHECK(entry->transition_type() != PageTransition::AUTO_SUBFRAME); |
| 812 | 828 |
| 813 // Copy the pending entry's unique ID to the committed entry. | 829 // Copy the pending entry's unique ID to the committed entry. |
| 814 // I don't know if pending_entry_index_ can be other than -1 here. | 830 // I don't know if pending_entry_index_ can be other than -1 here. |
| 815 const NavigationEntry* const pending_entry = (pending_entry_index_ == -1) ? | 831 const NavigationEntry* const pending_entry = (pending_entry_index_ == -1) ? |
| 816 pending_entry_ : entries_[pending_entry_index_].get(); | 832 pending_entry_ : entries_[pending_entry_index_].get(); |
| 817 if (pending_entry) | 833 if (pending_entry) |
| 818 entry->set_unique_id(pending_entry->unique_id()); | 834 entry->set_unique_id(pending_entry->unique_id()); |
| 819 | 835 |
| 820 DiscardNonCommittedEntriesInternal(); | 836 DiscardNonCommittedEntriesInternal(); |
| 821 | 837 |
| 822 int current_size = static_cast<int>(entries_.size()); | 838 int current_size = static_cast<int>(entries_.size()); |
| 823 | 839 |
| 824 // Prune any entries which are in front of the current entry. | |
| 825 if (current_size > 0) { | 840 if (current_size > 0) { |
| 841 // Prune any entries which are in front of the current entry. | |
| 842 // Also prune the current entry if we are to replace the current entry. | |
| 843 int prune_up_to = replace ? last_committed_entry_index_ - 1 | |
| 844 : last_committed_entry_index_; | |
| 826 int num_pruned = 0; | 845 int num_pruned = 0; |
| 827 while (last_committed_entry_index_ < (current_size - 1)) { | 846 while (prune_up_to < (current_size - 1)) { |
| 828 num_pruned++; | 847 num_pruned++; |
| 829 entries_.pop_back(); | 848 entries_.pop_back(); |
| 830 current_size--; | 849 current_size--; |
| 831 } | 850 } |
| 832 if (num_pruned > 0) // Only notify if we did prune something. | 851 if (num_pruned > 0) // Only notify if we did prune something. |
| 833 NotifyPrunedEntries(this, false, num_pruned); | 852 NotifyPrunedEntries(this, false, num_pruned); |
| 834 } | 853 } |
| 835 | 854 |
| 836 if (entries_.size() >= max_entry_count_) { | 855 if (entries_.size() >= max_entry_count_) { |
| 837 RemoveEntryAtIndex(0, GURL()); | 856 RemoveEntryAtIndex(0, GURL()); |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 949 return i; | 968 return i; |
| 950 } | 969 } |
| 951 return -1; | 970 return -1; |
| 952 } | 971 } |
| 953 | 972 |
| 954 NavigationEntry* NavigationController::GetTransientEntry() const { | 973 NavigationEntry* NavigationController::GetTransientEntry() const { |
| 955 if (transient_entry_index_ == -1) | 974 if (transient_entry_index_ == -1) |
| 956 return NULL; | 975 return NULL; |
| 957 return entries_[transient_entry_index_].get(); | 976 return entries_[transient_entry_index_].get(); |
| 958 } | 977 } |
| OLD | NEW |