OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "content/browser/tab_contents/navigation_controller_impl.h" | 5 #include "content/browser/tab_contents/navigation_controller_impl.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_number_conversions.h" // Temporary | 9 #include "base/string_number_conversions.h" // Temporary |
10 #include "base/string_util.h" | 10 #include "base/string_util.h" |
(...skipping 394 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
405 NavigationEntry* active_entry = GetActiveEntry(); | 405 NavigationEntry* active_entry = GetActiveEntry(); |
406 return active_entry && !active_entry->IsViewSourceMode() && | 406 return active_entry && !active_entry->IsViewSourceMode() && |
407 is_supported_mime_type && !tab_contents_->GetInterstitialPage(); | 407 is_supported_mime_type && !tab_contents_->GetInterstitialPage(); |
408 } | 408 } |
409 | 409 |
410 int NavigationControllerImpl::GetLastCommittedEntryIndex() const { | 410 int NavigationControllerImpl::GetLastCommittedEntryIndex() const { |
411 return last_committed_entry_index_; | 411 return last_committed_entry_index_; |
412 } | 412 } |
413 | 413 |
414 int NavigationControllerImpl::GetEntryCount() const { | 414 int NavigationControllerImpl::GetEntryCount() const { |
415 DCHECK(entries_.size() <= max_entry_count()); | |
Charlie Reis
2012/03/02 02:37:12
This would have caught the bug in the first place,
| |
415 return static_cast<int>(entries_.size()); | 416 return static_cast<int>(entries_.size()); |
416 } | 417 } |
417 | 418 |
418 NavigationEntry* NavigationControllerImpl::GetEntryAtIndex( | 419 NavigationEntry* NavigationControllerImpl::GetEntryAtIndex( |
419 int index) const { | 420 int index) const { |
420 return entries_.at(index).get(); | 421 return entries_.at(index).get(); |
421 } | 422 } |
422 | 423 |
423 NavigationEntry* NavigationControllerImpl::GetEntryAtOffset( | 424 NavigationEntry* NavigationControllerImpl::GetEntryAtOffset( |
424 int offset) const { | 425 int offset) const { |
(...skipping 645 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1070 DCHECK( | 1071 DCHECK( |
1071 (transient_entry_index_ != -1 && | 1072 (transient_entry_index_ != -1 && |
1072 transient_entry_index_ == GetEntryCount() - 1) || | 1073 transient_entry_index_ == GetEntryCount() - 1) || |
1073 (pending_entry_ && (pending_entry_index_ == -1 || | 1074 (pending_entry_ && (pending_entry_index_ == -1 || |
1074 pending_entry_index_ == GetEntryCount() - 1)) || | 1075 pending_entry_index_ == GetEntryCount() - 1)) || |
1075 (!pending_entry_ && last_committed_entry_index_ == GetEntryCount() - 1)); | 1076 (!pending_entry_ && last_committed_entry_index_ == GetEntryCount() - 1)); |
1076 | 1077 |
1077 // Remove all the entries leaving the active entry. | 1078 // Remove all the entries leaving the active entry. |
1078 PruneAllButActive(); | 1079 PruneAllButActive(); |
1079 | 1080 |
1081 // Ensure that adding the entries from source won't put us over the limit, | |
1082 // if we have an entry to keep. | |
1083 if (GetEntryCount() > 0) | |
cbentzel
2012/03/02 16:47:36
You should DCHECK that GetEntryCount is only 0 or
Charlie Reis
2012/03/02 17:48:24
Done.
| |
1084 source->PruneFirstEntryIfFull(); | |
1085 | |
1080 // Insert the entries from source. Don't use source->GetCurrentEntryIndex as | 1086 // Insert the entries from source. Don't use source->GetCurrentEntryIndex as |
1081 // we don't want to copy over the transient entry. | 1087 // we don't want to copy over the transient entry. |
1082 int max_source_index = source->pending_entry_index_ != -1 ? | 1088 int max_source_index = source->pending_entry_index_ != -1 ? |
1083 source->pending_entry_index_ : source->last_committed_entry_index_; | 1089 source->pending_entry_index_ : source->last_committed_entry_index_; |
1084 if (max_source_index == -1) | 1090 if (max_source_index == -1) |
1085 max_source_index = source->GetEntryCount(); | 1091 max_source_index = source->GetEntryCount(); |
1086 else | 1092 else |
1087 max_source_index++; | 1093 max_source_index++; |
1088 InsertEntriesFrom(*source, max_source_index); | 1094 InsertEntriesFrom(*source, max_source_index); |
1089 | 1095 |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1230 int num_pruned = 0; | 1236 int num_pruned = 0; |
1231 while (last_committed_entry_index_ < (current_size - 1)) { | 1237 while (last_committed_entry_index_ < (current_size - 1)) { |
1232 num_pruned++; | 1238 num_pruned++; |
1233 entries_.pop_back(); | 1239 entries_.pop_back(); |
1234 current_size--; | 1240 current_size--; |
1235 } | 1241 } |
1236 if (num_pruned > 0) // Only notify if we did prune something. | 1242 if (num_pruned > 0) // Only notify if we did prune something. |
1237 NotifyPrunedEntries(this, false, num_pruned); | 1243 NotifyPrunedEntries(this, false, num_pruned); |
1238 } | 1244 } |
1239 | 1245 |
1240 if (entries_.size() >= max_entry_count()) { | 1246 PruneFirstEntryIfFull(); |
1241 DCHECK(last_committed_entry_index_ > 0); | |
1242 RemoveEntryAtIndex(0); | |
1243 NotifyPrunedEntries(this, true, 1); | |
1244 } | |
1245 | 1247 |
1246 entries_.push_back(linked_ptr<NavigationEntryImpl>(entry)); | 1248 entries_.push_back(linked_ptr<NavigationEntryImpl>(entry)); |
1247 last_committed_entry_index_ = static_cast<int>(entries_.size()) - 1; | 1249 last_committed_entry_index_ = static_cast<int>(entries_.size()) - 1; |
1248 | 1250 |
1249 // This is a new page ID, so we need everybody to know about it. | 1251 // This is a new page ID, so we need everybody to know about it. |
1250 tab_contents_->UpdateMaxPageID(entry->GetPageID()); | 1252 tab_contents_->UpdateMaxPageID(entry->GetPageID()); |
1251 } | 1253 } |
1252 | 1254 |
1255 void NavigationControllerImpl::PruneFirstEntryIfFull() { | |
1256 if (entries_.size() >= max_entry_count()) { | |
1257 DCHECK_EQ(max_entry_count(), entries_.size()); | |
1258 DCHECK(last_committed_entry_index_ > 0); | |
1259 RemoveEntryAtIndex(0); | |
1260 NotifyPrunedEntries(this, true, 1); | |
1261 } | |
1262 } | |
1263 | |
1253 void NavigationControllerImpl::NavigateToPendingEntry(ReloadType reload_type) { | 1264 void NavigationControllerImpl::NavigateToPendingEntry(ReloadType reload_type) { |
1254 needs_reload_ = false; | 1265 needs_reload_ = false; |
1255 | 1266 |
1256 // If we were navigating to a slow-to-commit page, and the user performs | 1267 // If we were navigating to a slow-to-commit page, and the user performs |
1257 // a session history navigation to the last committed page, RenderViewHost | 1268 // a session history navigation to the last committed page, RenderViewHost |
1258 // will force the throbber to start, but WebKit will essentially ignore the | 1269 // will force the throbber to start, but WebKit will essentially ignore the |
1259 // navigation, and won't send a message to stop the throbber. To prevent this | 1270 // navigation, and won't send a message to stop the throbber. To prevent this |
1260 // from happening, we drop the navigation here and stop the slow-to-commit | 1271 // from happening, we drop the navigation here and stop the slow-to-commit |
1261 // page from loading (which would normally happen during the navigation). | 1272 // page from loading (which would normally happen during the navigation). |
1262 if (pending_entry_index_ != -1 && | 1273 if (pending_entry_index_ != -1 && |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1414 for (int i = 0; i < max_index; i++) { | 1425 for (int i = 0; i < max_index; i++) { |
1415 // When cloning a tab, copy all entries except interstitial pages | 1426 // When cloning a tab, copy all entries except interstitial pages |
1416 if (source.entries_[i].get()->GetPageType() != | 1427 if (source.entries_[i].get()->GetPageType() != |
1417 content::PAGE_TYPE_INTERSTITIAL) { | 1428 content::PAGE_TYPE_INTERSTITIAL) { |
1418 entries_.insert(entries_.begin() + insert_index++, | 1429 entries_.insert(entries_.begin() + insert_index++, |
1419 linked_ptr<NavigationEntryImpl>( | 1430 linked_ptr<NavigationEntryImpl>( |
1420 new NavigationEntryImpl(*source.entries_[i]))); | 1431 new NavigationEntryImpl(*source.entries_[i]))); |
1421 } | 1432 } |
1422 } | 1433 } |
1423 } | 1434 } |
OLD | NEW |