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