Index: Source/core/loader/FrameLoader.cpp |
diff --git a/Source/core/loader/FrameLoader.cpp b/Source/core/loader/FrameLoader.cpp |
index 8f4cf0cb52da2c9aec02fcc6388727ebe47261c6..5d5e4ef4899b3da7b20d00b90cd06d0c318d1fb9 100644 |
--- a/Source/core/loader/FrameLoader.cpp |
+++ b/Source/core/loader/FrameLoader.cpp |
@@ -1339,10 +1339,19 @@ void FrameLoader::loadWithNavigationAction(const ResourceRequest& request, const |
if (!m_stateMachine.startedFirstRealLoad()) |
m_stateMachine.advanceTo(FrameLoaderStateMachine::StartedFirstRealLoad); |
+ // The current load should replace the history item if it is the first real |
+ // load of the frame. FrameLoadTypeRedirectWithLockedBackForwardList is a |
+ // proxy for history()->currentItemShouldBeReplaced(). |
+ bool replacesCurrentHistoryItem = false; |
+ if (type == FrameLoadTypeRedirectWithLockedBackForwardList |
+ || !m_stateMachine.committedFirstRealDocumentLoad()) { |
+ replacesCurrentHistoryItem = true; |
+ } |
+ |
m_policyDocumentLoader = m_client->createDocumentLoader(request, substituteData.isValid() ? substituteData : defaultSubstituteDataForURL(request.url())); |
m_policyDocumentLoader->setFrame(m_frame); |
m_policyDocumentLoader->setTriggeringAction(action); |
- m_policyDocumentLoader->setReplacesCurrentHistoryItem(type == FrameLoadTypeRedirectWithLockedBackForwardList); |
+ m_policyDocumentLoader->setReplacesCurrentHistoryItem(replacesCurrentHistoryItem); |
m_policyDocumentLoader->setIsClientRedirect(m_startingClientRedirect); |
if (Frame* parent = m_frame->tree()->parent()) |