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 8ec8dc91047a1ab77effedcb448046b9479f3d1e..49c80aad65b95c32c6187dad51f4aef145c16ba4 100644 |
| --- a/content/browser/frame_host/navigation_controller_impl.cc |
| +++ b/content/browser/frame_host/navigation_controller_impl.cc |
| @@ -796,11 +796,15 @@ bool NavigationControllerImpl::RendererDidNavigate( |
| // If we are doing a cross-site reload, we need to replace the existing |
| // navigation entry, not add another entry to the history. This has the side |
| - // effect of removing forward browsing history, if such existed. |
| - // Or if we are doing a cross-site redirect navigation, |
| - // we will do a similar thing. |
| - details->did_replace_entry = |
| - pending_entry_ && pending_entry_->should_replace_entry(); |
| + // effect of removing forward browsing history, if such existed. Or if we are |
| + // doing a cross-site redirect navigation, we will do a similar thing. |
| + if (params.url_is_unreachable) { |
|
Charlie Reis
2015/04/03 20:59:46
Should this be params.url_is_unreachable && failed
Avi (use Gerrit)
2015/04/06 19:38:16
I'm trying to come up with a scenario in which the
Charlie Reis
2015/04/06 20:48:10
The multiple frames thing is a different issue, an
Avi (use Gerrit)
2015/04/06 21:30:14
Yeah, I got it. The pending entry isn't guaranteed
|
| + details->did_replace_entry = failed_pending_entry_.get() && |
| + failed_pending_entry_->should_replace_entry(); |
| + } else { |
| + details->did_replace_entry = pending_entry_ && |
| + pending_entry_->should_replace_entry(); |
| + } |
| // Do navigation-type specific actions. These will make and commit an entry. |
| details->type = ClassifyNavigation(rfh, params); |
| @@ -1758,21 +1762,28 @@ void NavigationControllerImpl::FinishRestore(int selected_index, |
| } |
| void NavigationControllerImpl::DiscardNonCommittedEntriesInternal() { |
| - DiscardPendingEntry(); |
| + DiscardPendingEntry(false); |
| DiscardTransientEntry(); |
| } |
| -void NavigationControllerImpl::DiscardPendingEntry() { |
| +void NavigationControllerImpl::DiscardPendingEntry(bool was_failure) { |
| // It is not safe to call DiscardPendingEntry while NavigateToEntry is in |
| // progress, since this will cause a use-after-free. (We only allow this |
| // when the tab is being destroyed for shutdown, since it won't return to |
| // NavigateToEntry in that case.) http://crbug.com/347742. |
| CHECK(!in_navigate_to_pending_entry_ || delegate_->IsBeingDestroyed()); |
| - if (pending_entry_index_ == -1) |
| - delete pending_entry_; |
| + if (pending_entry_index_ == -1) { |
| + if (was_failure) |
| + failed_pending_entry_.reset(pending_entry_); |
| + else |
| + delete pending_entry_; |
| + } |
| + |
| pending_entry_ = NULL; |
| pending_entry_index_ = -1; |
| + if (!was_failure) |
| + failed_pending_entry_.reset(); |
|
Charlie Reis
2015/04/03 20:59:46
You've confirmed this gets cleared after the error
Avi (use Gerrit)
2015/04/06 19:38:16
Yes, this gets cleared by the DiscardNonCommittedE
|
| } |
| void NavigationControllerImpl::DiscardTransientEntry() { |