Index: Source/core/loader/FrameLoader.cpp |
diff --git a/Source/core/loader/FrameLoader.cpp b/Source/core/loader/FrameLoader.cpp |
index f3e19af7c0fcdd3a3bd1732a8174ff72576dea5a..ffb0b020aa0a80bec72ddbb3e845367de87ca2eb 100644 |
--- a/Source/core/loader/FrameLoader.cpp |
+++ b/Source/core/loader/FrameLoader.cpp |
@@ -69,6 +69,7 @@ |
#include "core/loader/ProgressTracker.h" |
#include "core/loader/UniqueIdentifier.h" |
#include "core/loader/appcache/ApplicationCacheHost.h" |
+#include "core/page/BackForwardClient.h" |
#include "core/page/Chrome.h" |
#include "core/page/ChromeClient.h" |
#include "core/page/CreateWindow.h" |
@@ -142,7 +143,6 @@ private: |
FrameLoader::FrameLoader(Frame* frame, FrameLoaderClient* client) |
: m_frame(frame) |
, m_client(client) |
- , m_history(frame) |
, m_mixedContentChecker(frame) |
, m_state(FrameStateProvisional) |
, m_loadType(FrameLoadTypeStandard) |
@@ -180,6 +180,11 @@ void FrameLoader::init() |
m_progressTracker = FrameProgressTracker::create(m_frame); |
} |
+HistoryController* FrameLoader::history() const |
+{ |
+ return m_frame->page() ? m_frame->page()->history() : 0; |
+} |
+ |
void FrameLoader::setDefersLoading(bool defers) |
{ |
if (m_documentLoader) |
@@ -220,7 +225,8 @@ void FrameLoader::stopLoading() |
bool FrameLoader::closeURL() |
{ |
- history()->saveDocumentAndScrollState(); |
+ if (m_frame->page()) |
+ history()->saveDocumentAndScrollState(m_frame); |
// Should only send the pagehide event here if the current document exists. |
if (m_frame->document()) |
@@ -311,8 +317,8 @@ void FrameLoader::didBeginDocument(bool dispatch) |
m_isComplete = false; |
m_frame->document()->setReadyState(Document::Loading); |
- if (history()->currentItem() && m_loadType == FrameLoadTypeBackForward) |
- m_frame->domWindow()->statePopped(history()->currentItem()->stateObject()); |
+ if (history()->currentItem(m_frame) && m_loadType == FrameLoadTypeBackForward) |
+ m_frame->domWindow()->statePopped(history()->currentItem(m_frame)->stateObject()); |
if (dispatch) |
dispatchDidClearWindowObjectsInAllWorlds(); |
@@ -340,7 +346,7 @@ void FrameLoader::didBeginDocument(bool dispatch) |
} |
} |
- history()->restoreDocumentState(); |
+ history()->restoreDocumentState(m_frame); |
} |
void FrameLoader::finishedParsing() |
@@ -520,14 +526,14 @@ void FrameLoader::updateForSameDocumentNavigation(const KURL& newURL, SameDocume |
// replaceRequestURLForSameDocumentNavigation(), since we add based on |
// the current request. |
if (updateBackForwardList == UpdateBackForwardList) |
- history()->updateBackForwardListForFragmentScroll(); |
+ history()->updateBackForwardListForFragmentScroll(m_frame); |
if (sameDocumentNavigationSource == SameDocumentNavigationDefault) |
- history()->updateForSameDocumentNavigation(); |
+ history()->updateForSameDocumentNavigation(m_frame); |
else if (sameDocumentNavigationSource == SameDocumentNavigationPushState) |
- history()->pushState(data, newURL.string()); |
+ history()->pushState(m_frame, data, newURL.string()); |
else if (sameDocumentNavigationSource == SameDocumentNavigationReplaceState) |
- history()->replaceState(data, newURL.string()); |
+ history()->replaceState(m_frame, data, newURL.string()); |
else |
ASSERT_NOT_REACHED(); |
@@ -603,20 +609,6 @@ void FrameLoader::started() |
frame->loader().m_isComplete = false; |
} |
-void FrameLoader::prepareForHistoryNavigation() |
-{ |
- // If there is no currentItem, but we still want to engage in |
- // history navigation we need to manufacture one, and update |
- // the state machine of this frame to impersonate having |
- // loaded it. |
- RefPtr<HistoryItem> currentItem = history()->currentItem(); |
- if (!currentItem) { |
- insertDummyHistoryItem(); |
- ASSERT(stateMachine()->isDisplayingInitialEmptyDocument()); |
- stateMachine()->advanceTo(FrameLoaderStateMachine::CommittedFirstRealLoad); |
- } |
-} |
- |
void FrameLoader::setReferrerForFrameRequest(ResourceRequest& request, ShouldSendReferrer shouldSendReferrer) |
{ |
if (shouldSendReferrer == NeverSendReferrer) { |
@@ -648,7 +640,7 @@ FrameLoadType FrameLoader::determineFrameLoadType(const FrameLoadRequest& reques |
{ |
if (m_frame->tree().parent() && !m_stateMachine.startedFirstRealLoad()) |
return FrameLoadTypeInitialInChildFrame; |
- if (!m_frame->tree().parent() && !history()->currentItem()) |
+ if (!m_frame->tree().parent() && !m_frame->page()->backForward().backForwardListCount()) |
return FrameLoadTypeStandard; |
if (request.resourceRequest().cachePolicy() == ReloadIgnoringCacheData) |
return FrameLoadTypeReload; |
@@ -757,9 +749,6 @@ void FrameLoader::reload(ReloadPolicy reloadPolicy, const KURL& overrideURL, con |
if (!documentLoader) |
return; |
- if (m_state == FrameStateProvisional) |
- insertDummyHistoryItem(); |
- |
ResourceRequest request = documentLoader->request(); |
// FIXME: We need to reset cache policy to prevent it from being incorrectly propagted to the reload. |
// Do we need to propagate anything other than the url? |
@@ -878,7 +867,7 @@ void FrameLoader::commitProvisionalLoad() |
if (isLoadingMainFrame()) |
m_frame->page()->chrome().client().needTouchEvents(false); |
- history()->updateForCommit(); |
+ history()->updateForCommit(m_frame); |
m_client->transitionToCommittedForNewPage(); |
m_frame->navigationScheduler().cancel(); |
@@ -993,7 +982,7 @@ void FrameLoader::checkLoadCompleteForThisFrame() |
// If the user had a scroll point, scroll to it, overriding the anchor point if any. |
if (m_frame->page()) { |
if (isBackForwardLoadType(m_loadType) || m_loadType == FrameLoadTypeReload || m_loadType == FrameLoadTypeReloadFromOrigin) |
- history()->restoreScrollPositionAndViewState(); |
+ history()->restoreScrollPositionAndViewState(m_frame); |
} |
if (!m_stateMachine.committedFirstRealDocumentLoad()) |
@@ -1015,7 +1004,7 @@ void FrameLoader::didFirstLayout() |
return; |
if (isBackForwardLoadType(m_loadType) || m_loadType == FrameLoadTypeReload || m_loadType == FrameLoadTypeReloadFromOrigin) |
- history()->restoreScrollPositionAndViewState(); |
+ history()->restoreScrollPositionAndViewState(m_frame); |
} |
void FrameLoader::detachChildren() |
@@ -1222,7 +1211,7 @@ void FrameLoader::checkNavigationPolicyAndContinueFragmentScroll(const Navigatio |
m_provisionalDocumentLoader->detachFromFrame(); |
m_provisionalDocumentLoader = 0; |
} |
- history()->setProvisionalItem(0); |
+ history()->clearProvisionalEntry(); |
loadInSameDocument(request.url(), 0, isNewNavigation, clientRedirect); |
} |
@@ -1415,9 +1404,10 @@ bool FrameLoader::shouldInterruptLoadForXFrameOptions(const String& content, con |
bool FrameLoader::shouldTreatURLAsSameAsCurrent(const KURL& url) const |
{ |
- if (!history()->currentItem()) |
+ HistoryItem* item = history()->currentItem(m_frame); |
+ if (!item) |
return false; |
- return url == history()->currentItem()->url() || url == history()->currentItem()->originalURL(); |
+ return url == item->url() || url == item->originalURL(); |
} |
bool FrameLoader::shouldTreatURLAsSrcdocDocument(const KURL& url) const |
@@ -1461,19 +1451,13 @@ Frame* FrameLoader::findFrameForNavigation(const AtomicString& name, Document* a |
return frame; |
} |
-void FrameLoader::loadHistoryItem(HistoryItem* item) |
+void FrameLoader::loadHistoryItem(HistoryItem* item, HistoryLoadType historyLoadType) |
{ |
- HistoryItem* currentItem = history()->currentItem(); |
- |
- if (currentItem && item->shouldDoSameDocumentNavigationTo(currentItem)) { |
- history()->setCurrentItem(item); |
+ if (historyLoadType == HistorySameDocumentLoad) { |
loadInSameDocument(item->url(), item->stateObject(), false, NotClientRedirect); |
return; |
} |
- // Remember this item so we can traverse any child items as child frames load |
- history()->setProvisionalItem(item); |
- |
RefPtr<FormData> formData = item->formData(); |
ResourceRequest request(item->url()); |
request.setHTTPReferrer(item->referrer()); |
@@ -1488,12 +1472,6 @@ void FrameLoader::loadHistoryItem(HistoryItem* item) |
loadWithNavigationAction(NavigationAction(request, FrameLoadTypeBackForward, formData), FrameLoadTypeBackForward, 0, SubstituteData()); |
} |
-void FrameLoader::insertDummyHistoryItem() |
-{ |
- RefPtr<HistoryItem> currentItem = HistoryItem::create(); |
- history()->setCurrentItem(currentItem.get()); |
-} |
- |
void FrameLoader::dispatchDocumentElementAvailable() |
{ |
m_client->documentElementAvailable(); |