OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 964 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
975 // point to the previous entry. | 975 // point to the previous entry. |
976 transient_entry_index_ = entry_count() - 1; | 976 transient_entry_index_ = entry_count() - 1; |
977 if (last_committed_entry_index_ != -1) | 977 if (last_committed_entry_index_ != -1) |
978 last_committed_entry_index_--; | 978 last_committed_entry_index_--; |
979 } | 979 } |
980 | 980 |
981 // Take over the session id from source. | 981 // Take over the session id from source. |
982 session_id_ = source.session_id_; | 982 session_id_ = source.session_id_; |
983 } | 983 } |
984 | 984 |
| 985 void NavigationController::PruneAllButActive() { |
| 986 int prune_count = entry_count(); |
| 987 if (transient_entry_index_ != -1) { |
| 988 // There is a transient entry. Prune up to it. |
| 989 DCHECK_EQ(entry_count() - 1, transient_entry_index_); |
| 990 prune_count = transient_entry_index_; |
| 991 transient_entry_index_ = 0; |
| 992 last_committed_entry_index_ = -1; |
| 993 pending_entry_index_ = -1; |
| 994 } else if (!pending_entry_) { |
| 995 // There's no pending entry. Leave the last entry (if there is one). |
| 996 if (!prune_count) |
| 997 return; |
| 998 |
| 999 prune_count--; |
| 1000 last_committed_entry_index_ = 0; |
| 1001 } else if (pending_entry_index_ != -1) { |
| 1002 DCHECK_EQ(pending_entry_index_, prune_count - 1); |
| 1003 pending_entry_index_ = 0; |
| 1004 last_committed_entry_index_ = 0; |
| 1005 prune_count--; |
| 1006 } else { |
| 1007 // There is a pending_entry, but it's not in entries_. |
| 1008 pending_entry_index_ = -1; |
| 1009 last_committed_entry_index_ = -1; |
| 1010 } |
| 1011 |
| 1012 if (tab_contents_->interstitial_page()) { |
| 1013 // Normally the interstitial page hides itself if the user doesn't proceeed. |
| 1014 // This would result in showing a NavigationEntry we just removed. Set this |
| 1015 // so the interstitial triggers a reload if the user doesn't proceed. |
| 1016 tab_contents_->interstitial_page()->set_reload_on_dont_proceed(true); |
| 1017 } |
| 1018 |
| 1019 entries_.erase(entries_.begin(), entries_.begin() + prune_count); |
| 1020 } |
| 1021 |
985 void NavigationController::DiscardNonCommittedEntries() { | 1022 void NavigationController::DiscardNonCommittedEntries() { |
986 bool transient = transient_entry_index_ != -1; | 1023 bool transient = transient_entry_index_ != -1; |
987 DiscardNonCommittedEntriesInternal(); | 1024 DiscardNonCommittedEntriesInternal(); |
988 | 1025 |
989 // If there was a transient entry, invalidate everything so the new active | 1026 // If there was a transient entry, invalidate everything so the new active |
990 // entry state is shown. | 1027 // entry state is shown. |
991 if (transient) { | 1028 if (transient) { |
992 tab_contents_->NotifyNavigationStateChanged(kInvalidateAllButShelves); | 1029 tab_contents_->NotifyNavigationStateChanged(kInvalidateAllButShelves); |
993 } | 1030 } |
994 } | 1031 } |
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1150 } | 1187 } |
1151 return -1; | 1188 return -1; |
1152 } | 1189 } |
1153 | 1190 |
1154 NavigationEntry* NavigationController::GetTransientEntry() const { | 1191 NavigationEntry* NavigationController::GetTransientEntry() const { |
1155 if (transient_entry_index_ == -1) | 1192 if (transient_entry_index_ == -1) |
1156 return NULL; | 1193 return NULL; |
1157 return entries_[transient_entry_index_].get(); | 1194 return entries_[transient_entry_index_].get(); |
1158 } | 1195 } |
1159 | 1196 |
1160 void NavigationController::PruneAllButActive() { | |
1161 int prune_count = entry_count(); | |
1162 if (transient_entry_index_ != -1) { | |
1163 // There is a transient entry. Prune up to it. | |
1164 DCHECK_EQ(entry_count() - 1, transient_entry_index_); | |
1165 prune_count = transient_entry_index_; | |
1166 transient_entry_index_ = 0; | |
1167 last_committed_entry_index_ = -1; | |
1168 pending_entry_index_ = -1; | |
1169 } else if (!pending_entry_) { | |
1170 // There's no pending entry. Leave the last entry (if there is one). | |
1171 if (!prune_count) | |
1172 return; | |
1173 | |
1174 prune_count--; | |
1175 last_committed_entry_index_ = 0; | |
1176 } else if (pending_entry_index_ != -1) { | |
1177 DCHECK_EQ(pending_entry_index_, prune_count - 1); | |
1178 pending_entry_index_ = 0; | |
1179 last_committed_entry_index_ = 0; | |
1180 prune_count--; | |
1181 } else { | |
1182 // There is a pending_entry, but it's not in entries_. | |
1183 pending_entry_index_ = -1; | |
1184 last_committed_entry_index_ = -1; | |
1185 } | |
1186 | |
1187 if (tab_contents_->interstitial_page()) { | |
1188 // Normally the interstitial page hides itself if the user doesn't proceeed. | |
1189 // This would result in showing a NavigationEntry we just removed. Set this | |
1190 // so the interstitial triggers a reload if the user doesn't proceed. | |
1191 tab_contents_->interstitial_page()->set_reload_on_dont_proceed(true); | |
1192 } | |
1193 | |
1194 entries_.erase(entries_.begin(), entries_.begin() + prune_count); | |
1195 } | |
1196 | |
1197 void NavigationController::InsertEntriesFrom( | 1197 void NavigationController::InsertEntriesFrom( |
1198 const NavigationController& source, | 1198 const NavigationController& source, |
1199 int max_index) { | 1199 int max_index) { |
1200 DCHECK_LE(max_index, source.entry_count()); | 1200 DCHECK_LE(max_index, source.entry_count()); |
1201 size_t insert_index = 0; | 1201 size_t insert_index = 0; |
1202 for (int i = 0; i < max_index; i++) { | 1202 for (int i = 0; i < max_index; i++) { |
1203 // When cloning a tab, copy all entries except interstitial pages | 1203 // When cloning a tab, copy all entries except interstitial pages |
1204 if (source.entries_[i].get()->page_type() != | 1204 if (source.entries_[i].get()->page_type() != |
1205 NavigationEntry::INTERSTITIAL_PAGE) { | 1205 NavigationEntry::INTERSTITIAL_PAGE) { |
1206 entries_.insert(entries_.begin() + insert_index++, | 1206 entries_.insert(entries_.begin() + insert_index++, |
1207 linked_ptr<NavigationEntry>( | 1207 linked_ptr<NavigationEntry>( |
1208 new NavigationEntry(*source.entries_[i]))); | 1208 new NavigationEntry(*source.entries_[i]))); |
1209 } | 1209 } |
1210 } | 1210 } |
1211 } | 1211 } |
OLD | NEW |