Chromium Code Reviews| Index: content/browser/frame_host/navigation_controller_impl.cc |
| diff --git a/content/browser/frame_host/navigation_controller_impl.cc b/content/browser/frame_host/navigation_controller_impl.cc |
| index 2229ff0952c79f9f8b9d32bb552f026c7c78cb48..19f57cabcd9553d372b31782ddf84da176fa6378 100644 |
| --- a/content/browser/frame_host/navigation_controller_impl.cc |
| +++ b/content/browser/frame_host/navigation_controller_impl.cc |
| @@ -1651,17 +1651,28 @@ void NavigationControllerImpl::InsertOrReplaceEntry( |
| DiscardNonCommittedEntriesInternal(); |
| int current_size = static_cast<int>(entries_.size()); |
| - DCHECK_IMPLIES(replace, current_size > 0); |
| + |
| + // When replacing, don't prune the forward history. |
| + if (replace) { |
| + DCHECK_GT(current_size, 0); |
| + int32 page_id = entry->GetPageID(); |
| + |
| + // ScopedVectors don't automatically delete the replaced value, so make sure |
|
Charlie Reis
2015/07/16 23:51:14
Nick and I took a look, and there doesn't appear t
Avi (use Gerrit)
2015/07/17 02:17:24
Yeah. As soon as we can use the C++11 library we'l
dcheng
2015/07/17 03:49:59
An alternate way of doing this which maintains the
ncarter (slow)
2015/07/17 16:54:20
reinterpret_cast<scoped_ptr<NavigationEntryImpl>&>
Charlie Reis
2015/07/17 17:00:11
Heh, I've stumbled into a fun corner case, I see.
|
| + // the previous value gets deleted. |
| + scoped_ptr<NavigationEntryImpl> old_entry( |
| + entries_[last_committed_entry_index_]); |
| + entries_[last_committed_entry_index_] = entry.release(); |
| + |
| + // This is a new page ID, so we need everybody to know about it. |
| + delegate_->UpdateMaxPageID(page_id); |
| + return; |
| + } |
| if (current_size > 0) { |
| // Prune any entries which are in front of the current entry. |
| - // Also prune the current entry if we are to replace the current entry. |
| // last_committed_entry_index_ must be updated here since calls to |
| // NotifyPrunedEntries() below may re-enter and we must make sure |
| // last_committed_entry_index_ is not left in an invalid state. |
| - if (replace) |
| - --last_committed_entry_index_; |
| - |
| int num_pruned = 0; |
| while (last_committed_entry_index_ < (current_size - 1)) { |
| num_pruned++; |