| Index: third_party/WebKit/WebCore/loader/FrameLoader.cpp
|
| ===================================================================
|
| --- third_party/WebKit/WebCore/loader/FrameLoader.cpp (revision 9118)
|
| +++ third_party/WebKit/WebCore/loader/FrameLoader.cpp (working copy)
|
| @@ -204,7 +204,7 @@
|
| case FrameLoadTypeReload:
|
| case FrameLoadTypeReloadFromOrigin:
|
| case FrameLoadTypeSame:
|
| - case FrameLoadTypeRedirect:
|
| + case FrameLoadTypeRedirectWithLockedBackForwardList:
|
| case FrameLoadTypeReplace:
|
| return false;
|
| case FrameLoadTypeBack:
|
| @@ -1226,7 +1226,7 @@
|
| case FrameLoadTypeBack:
|
| case FrameLoadTypeForward:
|
| case FrameLoadTypeIndexedBackForward:
|
| - case FrameLoadTypeRedirect:
|
| + case FrameLoadTypeRedirectWithLockedBackForwardList:
|
| case FrameLoadTypeStandard:
|
| itemToRestore = m_currentHistoryItem.get();
|
| }
|
| @@ -1395,7 +1395,7 @@
|
|
|
| // We want a new history item if the refresh timeout is > 1 second.
|
| if (!m_scheduledRedirection || delay <= m_scheduledRedirection->delay)
|
| - scheduleRedirection(new ScheduledRedirection(delay, url, delay <= 1, delay <= 1, false, false));
|
| + scheduleRedirection(new ScheduledRedirection(delay, url, true, delay <= 1, false, false));
|
| }
|
|
|
| void FrameLoader::scheduleLocationChange(const String& url, const String& referrer, bool lockHistory, bool lockBackForwardList, bool wasUserGesture)
|
| @@ -1558,7 +1558,7 @@
|
| ASSERT(childFrame);
|
| HistoryItem* parentItem = currentHistoryItem();
|
| FrameLoadType loadType = this->loadType();
|
| - FrameLoadType childLoadType = FrameLoadTypeRedirect;
|
| + FrameLoadType childLoadType = FrameLoadTypeRedirectWithLockedBackForwardList;
|
|
|
| KURL workingURL = url;
|
|
|
| @@ -1581,7 +1581,7 @@
|
| if (subframeArchive)
|
| childFrame->loader()->loadArchive(subframeArchive.release());
|
| else
|
| - childFrame->loader()->loadURL(workingURL, referer, String(), childLoadType, 0, 0);
|
| + childFrame->loader()->loadURL(workingURL, referer, String(), false, childLoadType, 0, 0);
|
| }
|
|
|
| void FrameLoader::loadArchive(PassRefPtr<Archive> prpArchive)
|
| @@ -2163,7 +2163,6 @@
|
| clientRedirected(KURL(m_scheduledRedirection->url),
|
| m_scheduledRedirection->delay,
|
| currentTime() + m_redirectionTimer.nextFireInterval(),
|
| - m_scheduledRedirection->lockHistory,
|
| m_scheduledRedirection->lockBackForwardList,
|
| m_isExecutingJavaScriptFormAction);
|
| return;
|
| @@ -2267,15 +2266,15 @@
|
| FrameLoadType loadType;
|
| if (request.resourceRequest().cachePolicy() == ReloadIgnoringCacheData)
|
| loadType = FrameLoadTypeReload;
|
| - else if (lockHistory && lockBackForwardList)
|
| - loadType = FrameLoadTypeRedirect;
|
| + else if (lockBackForwardList)
|
| + loadType = FrameLoadTypeRedirectWithLockedBackForwardList;
|
| else
|
| - loadType = FrameLoadTypeStandard;
|
| + loadType = FrameLoadTypeStandard;
|
|
|
| if (request.resourceRequest().httpMethod() == "POST")
|
| - loadPostRequest(request.resourceRequest(), referrer, request.frameName(), loadType, event, formState.release());
|
| + loadPostRequest(request.resourceRequest(), referrer, request.frameName(), lockHistory, loadType, event, formState.release());
|
| else
|
| - loadURL(request.resourceRequest().url(), referrer, request.frameName(), loadType, event, formState.release());
|
| + loadURL(request.resourceRequest().url(), referrer, request.frameName(), lockHistory, loadType, event, formState.release());
|
|
|
| Frame* targetFrame = findFrameForNavigation(request.frameName());
|
| if (targetFrame && targetFrame != m_frame)
|
| @@ -2283,7 +2282,7 @@
|
| page->chrome()->focus();
|
| }
|
|
|
| -void FrameLoader::loadURL(const KURL& newURL, const String& referrer, const String& frameName, FrameLoadType newLoadType,
|
| +void FrameLoader::loadURL(const KURL& newURL, const String& referrer, const String& frameName, bool lockHistory, FrameLoadType newLoadType,
|
| Event* event, PassRefPtr<FormState> prpFormState)
|
| {
|
| RefPtr<FormState> formState = prpFormState;
|
| @@ -2305,7 +2304,7 @@
|
|
|
| if (!frameName.isEmpty()) {
|
| if (Frame* targetFrame = findFrameForNavigation(frameName))
|
| - targetFrame->loader()->loadURL(newURL, referrer, String(), newLoadType, event, formState);
|
| + targetFrame->loader()->loadURL(newURL, referrer, String(), lockHistory, newLoadType, event, formState);
|
| else
|
| checkNewWindowPolicy(action, request, formState, frameName);
|
| return;
|
| @@ -2326,7 +2325,7 @@
|
| } else {
|
| // must grab this now, since this load may stop the previous load and clear this flag
|
| bool isRedirect = m_quickRedirectComing;
|
| - loadWithNavigationAction(request, action, newLoadType, formState);
|
| + loadWithNavigationAction(request, action, lockHistory, newLoadType, formState);
|
| if (isRedirect) {
|
| m_quickRedirectComing = false;
|
| if (m_provisionalDocumentLoader)
|
| @@ -2342,40 +2341,43 @@
|
| }
|
| }
|
|
|
| -void FrameLoader::load(const ResourceRequest& request)
|
| +void FrameLoader::load(const ResourceRequest& request, bool lockHistory)
|
| {
|
| - load(request, SubstituteData());
|
| + load(request, SubstituteData(), lockHistory);
|
| }
|
|
|
| -void FrameLoader::load(const ResourceRequest& request, const SubstituteData& substituteData)
|
| +void FrameLoader::load(const ResourceRequest& request, const SubstituteData& substituteData, bool lockHistory)
|
| {
|
| if (m_inStopAllLoaders)
|
| return;
|
|
|
| // FIXME: is this the right place to reset loadType? Perhaps this should be done after loading is finished or aborted.
|
| m_loadType = FrameLoadTypeStandard;
|
| - load(m_client->createDocumentLoader(request, substituteData).get());
|
| + RefPtr<DocumentLoader> loader = m_client->createDocumentLoader(request, substituteData);
|
| + loader->setURLForHistoryReflectsClientRedirect(lockHistory);
|
| + load(loader.get());
|
| }
|
|
|
| -void FrameLoader::load(const ResourceRequest& request, const String& frameName)
|
| +void FrameLoader::load(const ResourceRequest& request, const String& frameName, bool lockHistory)
|
| {
|
| if (frameName.isEmpty()) {
|
| - load(request);
|
| + load(request, lockHistory);
|
| return;
|
| }
|
|
|
| Frame* frame = findFrameForNavigation(frameName);
|
| if (frame) {
|
| - frame->loader()->load(request);
|
| + frame->loader()->load(request, lockHistory);
|
| return;
|
| }
|
|
|
| checkNewWindowPolicy(NavigationAction(request.url(), NavigationTypeOther), request, 0, frameName);
|
| }
|
|
|
| -void FrameLoader::loadWithNavigationAction(const ResourceRequest& request, const NavigationAction& action, FrameLoadType type, PassRefPtr<FormState> formState)
|
| +void FrameLoader::loadWithNavigationAction(const ResourceRequest& request, const NavigationAction& action, bool lockHistory, FrameLoadType type, PassRefPtr<FormState> formState)
|
| {
|
| RefPtr<DocumentLoader> loader = m_client->createDocumentLoader(request, SubstituteData());
|
| + loader->setURLForHistoryReflectsClientRedirect(lockHistory);
|
|
|
| loader->setTriggeringAction(action);
|
| if (m_documentLoader) {
|
| @@ -3001,8 +3003,8 @@
|
| m_client->transitionToCommittedForNewPage();
|
| break;
|
|
|
| - case FrameLoadTypeRedirect:
|
| - updateHistoryForRedirectWithLockedHistory();
|
| + case FrameLoadTypeRedirectWithLockedBackForwardList:
|
| + updateHistoryForRedirectWithLockedBackForwardList();
|
| m_client->transitionToCommittedForNewPage();
|
| break;
|
|
|
| @@ -3019,9 +3021,9 @@
|
|
|
| if (m_creatingInitialEmptyDocument)
|
| return;
|
| +
|
| + m_committedFirstRealDocumentLoad = true;
|
|
|
| - m_committedFirstRealDocumentLoad = true;
|
| -
|
| // For non-cached HTML pages, these methods are called in FrameLoader::begin.
|
| if (cachedPage || !m_client->hasHTMLView()) {
|
| dispatchDidCommitLoad();
|
| @@ -3045,7 +3047,7 @@
|
| m_sentRedirectNotification = false;
|
| }
|
|
|
| -void FrameLoader::clientRedirected(const KURL& url, double seconds, double fireDate, bool lockHistory, bool lockBackForwardList, bool isJavaScriptFormAction)
|
| +void FrameLoader::clientRedirected(const KURL& url, double seconds, double fireDate, bool lockBackForwardList, bool isJavaScriptFormAction)
|
| {
|
| m_client->dispatchWillPerformClientRedirect(url, seconds, fireDate);
|
|
|
| @@ -3056,7 +3058,7 @@
|
| // If a "quick" redirect comes in an, we set a special mode so we treat the next
|
| // load as part of the same navigation. If we don't have a document loader, we have
|
| // no "original" load on which to base a redirect, so we treat the redirect as a normal load.
|
| - m_quickRedirectComing = (lockHistory && lockBackForwardList) && m_documentLoader && !isJavaScriptFormAction;
|
| + m_quickRedirectComing = lockBackForwardList && m_documentLoader && !isJavaScriptFormAction;
|
| }
|
|
|
| #if ENABLE(WML)
|
| @@ -3694,7 +3696,7 @@
|
| m_client->committedLoad(loader, data, length);
|
| }
|
|
|
| -void FrameLoader::loadPostRequest(const ResourceRequest& inRequest, const String& referrer, const String& frameName, FrameLoadType loadType, Event* event, PassRefPtr<FormState> prpFormState)
|
| +void FrameLoader::loadPostRequest(const ResourceRequest& inRequest, const String& referrer, const String& frameName, bool lockHistory, FrameLoadType loadType, Event* event, PassRefPtr<FormState> prpFormState)
|
| {
|
| RefPtr<FormState> formState = prpFormState;
|
|
|
| @@ -3727,17 +3729,17 @@
|
|
|
| if (!frameName.isEmpty()) {
|
| if (Frame* targetFrame = findFrameForNavigation(frameName))
|
| - targetFrame->loader()->loadWithNavigationAction(workingResourceRequest, action, loadType, formState.release());
|
| + targetFrame->loader()->loadWithNavigationAction(workingResourceRequest, action, lockHistory, loadType, formState.release());
|
| else
|
| checkNewWindowPolicy(action, workingResourceRequest, formState.release(), frameName);
|
| } else
|
| - loadWithNavigationAction(workingResourceRequest, action, loadType, formState.release());
|
| + loadWithNavigationAction(workingResourceRequest, action, lockHistory, loadType, formState.release());
|
| }
|
|
|
| void FrameLoader::loadEmptyDocumentSynchronously()
|
| {
|
| ResourceRequest request(KURL(""));
|
| - load(request);
|
| + load(request, false);
|
| }
|
|
|
| unsigned long FrameLoader::loadResourceSynchronously(const ResourceRequest& request, ResourceError& error, ResourceResponse& response, Vector<char>& data)
|
| @@ -3890,7 +3892,7 @@
|
|
|
| void FrameLoader::continueFragmentScrollAfterNavigationPolicy(const ResourceRequest& request, bool shouldContinue)
|
| {
|
| - bool isRedirect = m_quickRedirectComing || m_policyLoadType == FrameLoadTypeRedirect;
|
| + bool isRedirect = m_quickRedirectComing || m_policyLoadType == FrameLoadTypeRedirectWithLockedBackForwardList;
|
| m_quickRedirectComing = false;
|
|
|
| if (!shouldContinue)
|
| @@ -4170,7 +4172,7 @@
|
| mainFrame->loader()->setOpenedByDOM();
|
| mainFrame->loader()->m_client->dispatchShow();
|
| mainFrame->loader()->setOpener(frame.get());
|
| - mainFrame->loader()->loadWithNavigationAction(request, NavigationAction(), FrameLoadTypeStandard, formState);
|
| + mainFrame->loader()->loadWithNavigationAction(request, NavigationAction(), false, FrameLoadTypeStandard, formState);
|
| }
|
|
|
| void FrameLoader::sendRemainingDelegateMessages(unsigned long identifier, const ResourceResponse& response, int length, const ResourceError& error)
|
| @@ -4645,7 +4647,7 @@
|
| request.setCachePolicy(ReturnCacheDataElseLoad);
|
| break;
|
| case FrameLoadTypeStandard:
|
| - case FrameLoadTypeRedirect:
|
| + case FrameLoadTypeRedirectWithLockedBackForwardList:
|
| break;
|
| case FrameLoadTypeSame:
|
| default:
|
| @@ -4658,7 +4660,7 @@
|
| if (!addedExtraFields)
|
| addExtraFieldsToRequest(request, m_loadType, true, formData);
|
|
|
| - loadWithNavigationAction(request, action, loadType, 0);
|
| + loadWithNavigationAction(request, action, false, loadType, 0);
|
| }
|
| }
|
| }
|
| @@ -4808,11 +4810,14 @@
|
| m_navigationDuringLoad = false;
|
| }
|
|
|
| + bool didUpdateGlobalHistory = false;
|
| if (!frameNavigationDuringLoad && !documentLoader()->isClientRedirect()) {
|
| if (!historyURL.isEmpty()) {
|
| addBackForwardItemClippedAtTarget(true);
|
| - if (!needPrivacy)
|
| + if (!needPrivacy) {
|
| m_client->updateGlobalHistory();
|
| + didUpdateGlobalHistory = true;
|
| + }
|
| if (Page* page = m_frame->page())
|
| page->setGlobalHistoryItem(needPrivacy ? 0 : page->backForwardList()->currentItem());
|
| }
|
| @@ -4824,6 +4829,9 @@
|
| if (!historyURL.isEmpty() && !needPrivacy) {
|
| if (Page* page = m_frame->page())
|
| page->group().addVisitedLink(historyURL);
|
| +
|
| + if (!didUpdateGlobalHistory && !url().isEmpty())
|
| + m_client->updateGlobalHistoryForRedirectWithoutHistoryItem();
|
| }
|
| }
|
|
|
| @@ -4881,23 +4889,26 @@
|
| }
|
| }
|
|
|
| -void FrameLoader::updateHistoryForRedirectWithLockedHistory()
|
| +void FrameLoader::updateHistoryForRedirectWithLockedBackForwardList()
|
| {
|
| #if !LOG_DISABLED
|
| if (documentLoader())
|
| - LOG(History, "WebCoreHistory: Updating History for internal load in frame %s", documentLoader()->title().utf8().data());
|
| + LOG(History, "WebCoreHistory: Updating History for redirect load in frame %s", documentLoader()->title().utf8().data());
|
| #endif
|
|
|
| Settings* settings = m_frame->settings();
|
| bool needPrivacy = !settings || settings->privateBrowsingEnabled();
|
| const KURL& historyURL = documentLoader()->urlForHistory();
|
|
|
| + bool didUpdateGlobalHistory = false;
|
| if (documentLoader()->isClientRedirect()) {
|
| if (!m_currentHistoryItem && !m_frame->tree()->parent()) {
|
| - addBackForwardItemClippedAtTarget(true);
|
| if (!historyURL.isEmpty()) {
|
| - if (!needPrivacy)
|
| + addBackForwardItemClippedAtTarget(true);
|
| + if (!needPrivacy) {
|
| m_client->updateGlobalHistory();
|
| + didUpdateGlobalHistory = true;
|
| + }
|
| if (Page* page = m_frame->page())
|
| page->setGlobalHistoryItem(needPrivacy ? 0 : page->backForwardList()->currentItem());
|
| }
|
| @@ -4915,6 +4926,9 @@
|
| if (!historyURL.isEmpty() && !needPrivacy) {
|
| if (Page* page = m_frame->page())
|
| page->group().addVisitedLink(historyURL);
|
| +
|
| + if (!didUpdateGlobalHistory && !url().isEmpty())
|
| + m_client->updateGlobalHistoryForRedirectWithoutHistoryItem();
|
| }
|
| }
|
|
|
|
|