| 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;
|
| }
|
|
|