Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(668)

Unified Diff: third_party/WebKit/WebCore/loader/FrameLoader.cpp

Issue 20076: WebKit merge 40500:40539 [WebKit side] (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 11 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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();
}
}
« no previous file with comments | « third_party/WebKit/WebCore/loader/FrameLoader.h ('k') | third_party/WebKit/WebCore/loader/FrameLoaderClient.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698