Chromium Code Reviews| Index: content/browser/tab_contents/navigation_controller_impl.cc |
| diff --git a/content/browser/tab_contents/navigation_controller_impl.cc b/content/browser/tab_contents/navigation_controller_impl.cc |
| index e8d722d1a1843bd974b0ffc670af912c2836c958..817e94b574fe45a7872e29d312e508648e466bbc 100644 |
| --- a/content/browser/tab_contents/navigation_controller_impl.cc |
| +++ b/content/browser/tab_contents/navigation_controller_impl.cc |
| @@ -412,6 +412,7 @@ int NavigationControllerImpl::GetLastCommittedEntryIndex() const { |
| } |
| int NavigationControllerImpl::GetEntryCount() const { |
| + DCHECK(entries_.size() <= max_entry_count()); |
|
Charlie Reis
2012/03/02 02:37:12
This would have caught the bug in the first place,
|
| return static_cast<int>(entries_.size()); |
| } |
| @@ -1077,6 +1078,11 @@ void NavigationControllerImpl::CopyStateFromAndPrune( |
| // Remove all the entries leaving the active entry. |
| PruneAllButActive(); |
| + // Ensure that adding the entries from source won't put us over the limit, |
| + // if we have an entry to keep. |
| + 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.
|
| + source->PruneFirstEntryIfFull(); |
| + |
| // Insert the entries from source. Don't use source->GetCurrentEntryIndex as |
| // we don't want to copy over the transient entry. |
| int max_source_index = source->pending_entry_index_ != -1 ? |
| @@ -1237,11 +1243,7 @@ void NavigationControllerImpl::InsertOrReplaceEntry(NavigationEntryImpl* entry, |
| NotifyPrunedEntries(this, false, num_pruned); |
| } |
| - if (entries_.size() >= max_entry_count()) { |
| - DCHECK(last_committed_entry_index_ > 0); |
| - RemoveEntryAtIndex(0); |
| - NotifyPrunedEntries(this, true, 1); |
| - } |
| + PruneFirstEntryIfFull(); |
| entries_.push_back(linked_ptr<NavigationEntryImpl>(entry)); |
| last_committed_entry_index_ = static_cast<int>(entries_.size()) - 1; |
| @@ -1250,6 +1252,15 @@ void NavigationControllerImpl::InsertOrReplaceEntry(NavigationEntryImpl* entry, |
| tab_contents_->UpdateMaxPageID(entry->GetPageID()); |
| } |
| +void NavigationControllerImpl::PruneFirstEntryIfFull() { |
| + if (entries_.size() >= max_entry_count()) { |
| + DCHECK_EQ(max_entry_count(), entries_.size()); |
| + DCHECK(last_committed_entry_index_ > 0); |
| + RemoveEntryAtIndex(0); |
| + NotifyPrunedEntries(this, true, 1); |
| + } |
| +} |
| + |
| void NavigationControllerImpl::NavigateToPendingEntry(ReloadType reload_type) { |
| needs_reload_ = false; |