Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(49)

Side by Side Diff: chrome/browser/tab_contents/navigation_controller.cc

Issue 341043: Changes session restore to use a normal load rather than preferring... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2009 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 "app/resource_bundle.h" 7 #include "app/resource_bundle.h"
8 #include "base/file_util.h" 8 #include "base/file_util.h"
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/string_util.h" 10 #include "base/string_util.h"
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
60 void SetContentStateIfEmpty(NavigationEntry* entry) { 60 void SetContentStateIfEmpty(NavigationEntry* entry) {
61 if (entry->content_state().empty()) { 61 if (entry->content_state().empty()) {
62 entry->set_content_state( 62 entry->set_content_state(
63 webkit_glue::CreateHistoryStateForURL(entry->url())); 63 webkit_glue::CreateHistoryStateForURL(entry->url()));
64 } 64 }
65 } 65 }
66 66
67 // Configure all the NavigationEntries in entries for restore. This resets 67 // Configure all the NavigationEntries in entries for restore. This resets
68 // the transition type to reload and makes sure the content state isn't empty. 68 // the transition type to reload and makes sure the content state isn't empty.
69 void ConfigureEntriesForRestore( 69 void ConfigureEntriesForRestore(
70 std::vector<linked_ptr<NavigationEntry> >* entries) { 70 std::vector<linked_ptr<NavigationEntry> >* entries,
71 bool from_last_session) {
71 for (size_t i = 0; i < entries->size(); ++i) { 72 for (size_t i = 0; i < entries->size(); ++i) {
72 // Use a transition type of reload so that we don't incorrectly increase 73 // Use a transition type of reload so that we don't incorrectly increase
73 // the typed count. 74 // the typed count.
74 (*entries)[i]->set_transition_type(PageTransition::RELOAD); 75 (*entries)[i]->set_transition_type(PageTransition::RELOAD);
75 (*entries)[i]->set_restored(true); 76 (*entries)[i]->set_restore_type(from_last_session ?
77 NavigationEntry::RESTORE_LAST_SESSION :
78 NavigationEntry::RESTORE_CURRENT_SESSION);
76 // NOTE(darin): This code is only needed for backwards compat. 79 // NOTE(darin): This code is only needed for backwards compat.
77 SetContentStateIfEmpty((*entries)[i].get()); 80 SetContentStateIfEmpty((*entries)[i].get());
78 } 81 }
79 } 82 }
80 83
81 // See NavigationController::IsURLInPageNavigation for how this works and why. 84 // See NavigationController::IsURLInPageNavigation for how this works and why.
82 bool AreURLsInPageNavigation(const GURL& existing_url, const GURL& new_url) { 85 bool AreURLsInPageNavigation(const GURL& existing_url, const GURL& new_url) {
83 if (existing_url == new_url || !new_url.has_ref()) 86 if (existing_url == new_url || !new_url.has_ref())
84 return false; 87 return false;
85 88
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
138 DiscardNonCommittedEntriesInternal(); 141 DiscardNonCommittedEntriesInternal();
139 142
140 NotificationService::current()->Notify( 143 NotificationService::current()->Notify(
141 NotificationType::TAB_CLOSED, 144 NotificationType::TAB_CLOSED,
142 Source<NavigationController>(this), 145 Source<NavigationController>(this),
143 NotificationService::NoDetails()); 146 NotificationService::NoDetails());
144 } 147 }
145 148
146 void NavigationController::RestoreFromState( 149 void NavigationController::RestoreFromState(
147 const std::vector<TabNavigation>& navigations, 150 const std::vector<TabNavigation>& navigations,
148 int selected_navigation) { 151 int selected_navigation,
152 bool from_last_session) {
149 // Verify that this controller is unused and that the input is valid. 153 // Verify that this controller is unused and that the input is valid.
150 DCHECK(entry_count() == 0 && !pending_entry()); 154 DCHECK(entry_count() == 0 && !pending_entry());
151 DCHECK(selected_navigation >= 0 && 155 DCHECK(selected_navigation >= 0 &&
152 selected_navigation < static_cast<int>(navigations.size())); 156 selected_navigation < static_cast<int>(navigations.size()));
153 157
154 // Populate entries_ from the supplied TabNavigations. 158 // Populate entries_ from the supplied TabNavigations.
155 needs_reload_ = true; 159 needs_reload_ = true;
156 CreateNavigationEntriesFromTabNavigations(navigations, &entries_); 160 CreateNavigationEntriesFromTabNavigations(navigations, &entries_);
157 161
158 // And finish the restore. 162 // And finish the restore.
159 FinishRestore(selected_navigation); 163 FinishRestore(selected_navigation, from_last_session);
160 } 164 }
161 165
162 void NavigationController::Reload(bool check_for_repost) { 166 void NavigationController::Reload(bool check_for_repost) {
163 // Reloading a transient entry does nothing. 167 // Reloading a transient entry does nothing.
164 if (transient_entry_index_ != -1) 168 if (transient_entry_index_ != -1)
165 return; 169 return;
166 170
167 DiscardNonCommittedEntriesInternal(); 171 DiscardNonCommittedEntriesInternal();
168 int current_index = GetCurrentEntryIndex(); 172 int current_index = GetCurrentEntryIndex();
169 if (check_for_repost_ && check_for_repost && current_index != -1 && 173 if (check_for_repost_ && check_for_repost && current_index != -1 &&
(...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after
415 } 419 }
416 420
417 // Assign the current site instance to any pending entry, so we can find it 421 // Assign the current site instance to any pending entry, so we can find it
418 // later by calling GetEntryIndexWithPageID. We only care about this if the 422 // later by calling GetEntryIndexWithPageID. We only care about this if the
419 // pending entry is an existing navigation and not a new one (or else we 423 // pending entry is an existing navigation and not a new one (or else we
420 // wouldn't care about finding it with GetEntryIndexWithPageID). 424 // wouldn't care about finding it with GetEntryIndexWithPageID).
421 // 425 //
422 // TODO(brettw) this seems slightly bogus as we don't really know if the 426 // TODO(brettw) this seems slightly bogus as we don't really know if the
423 // pending entry is what this navigation is for. There is a similar TODO 427 // pending entry is what this navigation is for. There is a similar TODO
424 // w.r.t. the pending entry in RendererDidNavigateToNewPage. 428 // w.r.t. the pending entry in RendererDidNavigateToNewPage.
425 if (pending_entry_index_ >= 0) 429 if (pending_entry_index_ >= 0) {
426 pending_entry_->set_site_instance(tab_contents_->GetSiteInstance()); 430 pending_entry_->set_site_instance(tab_contents_->GetSiteInstance());
431 pending_entry_->set_restore_type(NavigationEntry::RESTORE_NONE);
432 }
427 433
428 // Do navigation-type specific actions. These will make and commit an entry. 434 // Do navigation-type specific actions. These will make and commit an entry.
429 details->type = ClassifyNavigation(params); 435 details->type = ClassifyNavigation(params);
430 switch (details->type) { 436 switch (details->type) {
431 case NavigationType::NEW_PAGE: 437 case NavigationType::NEW_PAGE:
432 RendererDidNavigateToNewPage(params, &(details->did_replace_entry)); 438 RendererDidNavigateToNewPage(params, &(details->did_replace_entry));
433 break; 439 break;
434 case NavigationType::EXISTING_PAGE: 440 case NavigationType::EXISTING_PAGE:
435 RendererDidNavigateToExistingPage(params); 441 RendererDidNavigateToExistingPage(params);
436 break; 442 break;
(...skipping 384 matching lines...) Expand 10 before | Expand all | Expand 10 after
821 827
822 if (source.entry_count() == 0) 828 if (source.entry_count() == 0)
823 return; // Nothing new to do. 829 return; // Nothing new to do.
824 830
825 needs_reload_ = true; 831 needs_reload_ = true;
826 for (int i = 0; i < source.entry_count(); i++) { 832 for (int i = 0; i < source.entry_count(); i++) {
827 entries_.push_back(linked_ptr<NavigationEntry>( 833 entries_.push_back(linked_ptr<NavigationEntry>(
828 new NavigationEntry(*source.entries_[i]))); 834 new NavigationEntry(*source.entries_[i])));
829 } 835 }
830 836
831 FinishRestore(source.last_committed_entry_index_); 837 FinishRestore(source.last_committed_entry_index_, false);
832 } 838 }
833 839
834 void NavigationController::DiscardNonCommittedEntries() { 840 void NavigationController::DiscardNonCommittedEntries() {
835 bool transient = transient_entry_index_ != -1; 841 bool transient = transient_entry_index_ != -1;
836 DiscardNonCommittedEntriesInternal(); 842 DiscardNonCommittedEntriesInternal();
837 843
838 // If there was a transient entry, invalidate everything so the new active 844 // If there was a transient entry, invalidate everything so the new active
839 // entry state is shown. 845 // entry state is shown.
840 if (transient) { 846 if (transient) {
841 tab_contents_->NotifyNavigationStateChanged(kInvalidateAllButShelves); 847 tab_contents_->NotifyNavigationStateChanged(kInvalidateAllButShelves);
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
951 void NavigationController::NotifyEntryChanged(const NavigationEntry* entry, 957 void NavigationController::NotifyEntryChanged(const NavigationEntry* entry,
952 int index) { 958 int index) {
953 EntryChangedDetails det; 959 EntryChangedDetails det;
954 det.changed_entry = entry; 960 det.changed_entry = entry;
955 det.index = index; 961 det.index = index;
956 NotificationService::current()->Notify(NotificationType::NAV_ENTRY_CHANGED, 962 NotificationService::current()->Notify(NotificationType::NAV_ENTRY_CHANGED,
957 Source<NavigationController>(this), 963 Source<NavigationController>(this),
958 Details<EntryChangedDetails>(&det)); 964 Details<EntryChangedDetails>(&det));
959 } 965 }
960 966
961 void NavigationController::FinishRestore(int selected_index) { 967 void NavigationController::FinishRestore(int selected_index,
968 bool from_last_session) {
962 DCHECK(selected_index >= 0 && selected_index < entry_count()); 969 DCHECK(selected_index >= 0 && selected_index < entry_count());
963 ConfigureEntriesForRestore(&entries_); 970 ConfigureEntriesForRestore(&entries_, from_last_session);
964 971
965 set_max_restored_page_id(entry_count()); 972 set_max_restored_page_id(entry_count());
966 973
967 last_committed_entry_index_ = selected_index; 974 last_committed_entry_index_ = selected_index;
968 } 975 }
969 976
970 void NavigationController::DiscardNonCommittedEntriesInternal() { 977 void NavigationController::DiscardNonCommittedEntriesInternal() {
971 if (pending_entry_index_ == -1) 978 if (pending_entry_index_ == -1)
972 delete pending_entry_; 979 delete pending_entry_;
973 pending_entry_ = NULL; 980 pending_entry_ = NULL;
(...skipping 19 matching lines...) Expand all
993 return i; 1000 return i;
994 } 1001 }
995 return -1; 1002 return -1;
996 } 1003 }
997 1004
998 NavigationEntry* NavigationController::GetTransientEntry() const { 1005 NavigationEntry* NavigationController::GetTransientEntry() const {
999 if (transient_entry_index_ == -1) 1006 if (transient_entry_index_ == -1)
1000 return NULL; 1007 return NULL;
1001 return entries_[transient_entry_index_].get(); 1008 return entries_[transient_entry_index_].get();
1002 } 1009 }
OLDNEW
« no previous file with comments | « chrome/browser/tab_contents/navigation_controller.h ('k') | chrome/browser/tab_contents/navigation_controller_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698