| Index: content/renderer/history_controller.cc
|
| diff --git a/content/renderer/history_controller.cc b/content/renderer/history_controller.cc
|
| index 5f0f28b4f6da89f25393c62075aa1db914f1b331..14ced356b8896426cd4f027aac3ff5c594a45e46 100644
|
| --- a/content/renderer/history_controller.cc
|
| +++ b/content/renderer/history_controller.cc
|
| @@ -201,7 +201,8 @@ void HistoryController::UpdateForCommit(RenderFrameImpl* frame,
|
| // a different frame. For main frames, it is not safe to leave the
|
| // current_entry_ in place, which may have a cross-site page and will be
|
| // included in the PageState for this commit. Replace it with a new
|
| - // HistoryEntry corresponding to the commit.
|
| + // HistoryEntry corresponding to the commit, and clear any stale
|
| + // NavigationParams which might point to the wrong entry.
|
| //
|
| // This will lack any subframe history items that were in the original
|
| // provisional entry, but we don't know what those were after discarding
|
| @@ -214,8 +215,10 @@ void HistoryController::UpdateForCommit(RenderFrameImpl* frame,
|
| // main frame case. Since this bug is not present in the new
|
| // FrameNavigationEntry-based navigation path (https://crbug.com/236848)
|
| // we'll wait for that to fix the subframe case.
|
| - if (frame->IsMainFrame())
|
| + if (frame->IsMainFrame()) {
|
| current_entry_.reset(new HistoryEntry(item));
|
| + navigation_params_.reset();
|
| + }
|
|
|
| return;
|
| }
|
| @@ -251,6 +254,13 @@ void HistoryController::UpdateForCommit(RenderFrameImpl* frame,
|
|
|
| if (HistoryEntry::HistoryNode* node =
|
| current_entry_->GetHistoryNodeForFrame(frame)) {
|
| + // Clear the children and any NavigationParams if this commit isn't for
|
| + // the same item. Otherwise we might have stale data from a race.
|
| + if (node->item().itemSequenceNumber() != item.itemSequenceNumber()) {
|
| + node->RemoveChildren();
|
| + navigation_params_.reset();
|
| + }
|
| +
|
| node->set_item(item);
|
| }
|
| break;
|
|
|