| Index: Source/core/loader/FrameLoader.cpp | 
| diff --git a/Source/core/loader/FrameLoader.cpp b/Source/core/loader/FrameLoader.cpp | 
| index 304c371f5110d69c71512192e838c482890aecb1..efd1aabca0ece3ae89f42693c066fc7719ea9126 100644 | 
| --- a/Source/core/loader/FrameLoader.cpp | 
| +++ b/Source/core/loader/FrameLoader.cpp | 
| @@ -560,10 +560,19 @@ void FrameLoader::updateForSameDocumentNavigation(const KURL& newURL, SameDocume | 
| m_client->postProgressFinishedNotification(); | 
| } | 
|  | 
| -void FrameLoader::loadInSameDocument(const KURL& url, PassRefPtr<SerializedScriptValue> stateObject, bool isNewNavigation, ClientRedirectPolicy clientRedirect) | 
| +void FrameLoader::loadInSameDocument(const KURL& url, PassRefPtr<SerializedScriptValue> stateObject, UpdateBackForwardListPolicy updateBackForwardList, ClientRedirectPolicy clientRedirect) | 
| { | 
| // If we have a state object, we cannot also be a new navigation. | 
| -    ASSERT(!stateObject || (stateObject && !isNewNavigation)); | 
| +    ASSERT(!stateObject || updateBackForwardList == DoNotUpdateBackForwardList); | 
| + | 
| +    // If we have a provisional request for a different document, a fragment scroll should cancel it. | 
| +    if (m_provisionalDocumentLoader) { | 
| +        m_provisionalDocumentLoader->stopLoading(); | 
| +        if (m_provisionalDocumentLoader) | 
| +            m_provisionalDocumentLoader->detachFromFrame(); | 
| +        m_provisionalDocumentLoader = 0; | 
| +    } | 
| +    saveDocumentAndScrollState(); | 
|  | 
| KURL oldURL = m_frame->document()->url(); | 
| // If we were in the autoscroll/panScroll mode we want to stop it before following the link to the anchor | 
| @@ -572,9 +581,8 @@ void FrameLoader::loadInSameDocument(const KURL& url, PassRefPtr<SerializedScrip | 
| m_frame->eventHandler().stopAutoscroll(); | 
| m_frame->domWindow()->enqueueHashchangeEvent(oldURL, url); | 
| } | 
| -    m_documentLoader->setIsClientRedirect((clientRedirect == ClientRedirect && !isNewNavigation) || !UserGestureIndicator::processingUserGesture()); | 
| -    m_documentLoader->setReplacesCurrentHistoryItem(!isNewNavigation); | 
| -    UpdateBackForwardListPolicy updateBackForwardList = isNewNavigation && !shouldTreatURLAsSameAsCurrent(url) && !stateObject ? UpdateBackForwardList : DoNotUpdateBackForwardList; | 
| +    m_documentLoader->setIsClientRedirect(clientRedirect == ClientRedirect); | 
| +    m_documentLoader->setReplacesCurrentHistoryItem(updateBackForwardList == DoNotUpdateBackForwardList); | 
| updateForSameDocumentNavigation(url, SameDocumentNavigationDefault, 0, updateBackForwardList); | 
|  | 
| // It's important to model this as a load that starts and immediately finishes. | 
| @@ -715,11 +723,13 @@ void FrameLoader::load(const FrameLoadRequest& passedRequest) | 
| return; | 
| } | 
|  | 
| -    if (shouldPerformFragmentNavigation(request.formState(), request.resourceRequest().httpMethod(), newLoadType, request.resourceRequest().url())) { | 
| -        checkNavigationPolicyAndContinueFragmentScroll(action, newLoadType != FrameLoadTypeRedirectWithLockedBackForwardList, request.clientRedirect()); | 
| +    const KURL& url = request.resourceRequest().url(); | 
| +    if (shouldPerformFragmentNavigation(request.formState(), request.resourceRequest().httpMethod(), newLoadType, url)) { | 
| +        m_documentLoader->setTriggeringAction(action); | 
| +        loadInSameDocument(url, 0, newLoadType == FrameLoadTypeStandard ? UpdateBackForwardList : DoNotUpdateBackForwardList, request.clientRedirect()); | 
| return; | 
| } | 
| -    bool sameURL = shouldTreatURLAsSameAsCurrent(request.resourceRequest().url()); | 
| +    bool sameURL = shouldTreatURLAsSameAsCurrent(url); | 
| loadWithNavigationAction(action, newLoadType, request.formState(), request.substituteData(), request.clientRedirect()); | 
| // Example of this case are sites that reload the same URL with a different cookie | 
| // driving the generated content, or a master frame with links that drive a target | 
| @@ -1158,25 +1168,6 @@ void FrameLoader::receivedMainResourceError(const ResourceError& error) | 
| checkLoadComplete(); | 
| } | 
|  | 
| -void FrameLoader::checkNavigationPolicyAndContinueFragmentScroll(const NavigationAction& action, bool isNewNavigation, ClientRedirectPolicy clientRedirect) | 
| -{ | 
| -    m_documentLoader->setTriggeringAction(action); | 
| - | 
| -    const ResourceRequest& request = action.resourceRequest(); | 
| -    if (!m_documentLoader->shouldContinueForNavigationPolicy(request, DocumentLoader::PolicyCheckFragment)) | 
| -        return; | 
| - | 
| -    // If we have a provisional request for a different document, a fragment scroll should cancel it. | 
| -    if (m_provisionalDocumentLoader && !equalIgnoringFragmentIdentifier(m_provisionalDocumentLoader->request().url(), request.url())) { | 
| -        m_provisionalDocumentLoader->stopLoading(); | 
| -        if (m_provisionalDocumentLoader) | 
| -            m_provisionalDocumentLoader->detachFromFrame(); | 
| -        m_provisionalDocumentLoader = 0; | 
| -    } | 
| -    saveDocumentAndScrollState(); | 
| -    loadInSameDocument(request.url(), 0, isNewNavigation, clientRedirect); | 
| -} | 
| - | 
| bool FrameLoader::shouldPerformFragmentNavigation(bool isFormSubmission, const String& httpMethod, FrameLoadType loadType, const KURL& url) | 
| { | 
| ASSERT(loadType != FrameLoadTypeReloadFromOrigin); | 
| @@ -1286,7 +1277,7 @@ void FrameLoader::loadWithNavigationAction(const NavigationAction& action, Frame | 
|  | 
| // stopAllLoaders can detach the Frame, so protect it. | 
| RefPtr<Frame> protect(m_frame); | 
| -    if ((!m_policyDocumentLoader->shouldContinueForNavigationPolicy(request, DocumentLoader::PolicyCheckStandard) || !shouldClose()) && m_policyDocumentLoader) { | 
| +    if ((!m_policyDocumentLoader->shouldContinueForNavigationPolicy(request) || !shouldClose()) && m_policyDocumentLoader) { | 
| m_policyDocumentLoader->detachFromFrame(); | 
| m_policyDocumentLoader = 0; | 
| return; | 
| @@ -1419,7 +1410,7 @@ void FrameLoader::loadHistoryItem(HistoryItem* item, HistoryLoadType historyLoad | 
| { | 
| m_provisionalItem = item; | 
| if (historyLoadType == HistorySameDocumentLoad) { | 
| -        loadInSameDocument(item->url(), item->stateObject(), false, NotClientRedirect); | 
| +        loadInSameDocument(item->url(), item->stateObject(), DoNotUpdateBackForwardList, NotClientRedirect); | 
| restoreScrollPositionAndViewState(ForcedRestoreForSameDocumentHistoryNavigation); | 
| return; | 
| } | 
|  |