Index: Source/core/loader/FrameLoader.cpp |
diff --git a/Source/core/loader/FrameLoader.cpp b/Source/core/loader/FrameLoader.cpp |
index 3d8ab8b84bc46b42a5857b61572df491501f33b4..f5d1f2473b32f5d7de3eac38178d8270b85757ea 100644 |
--- a/Source/core/loader/FrameLoader.cpp |
+++ b/Source/core/loader/FrameLoader.cpp |
@@ -377,6 +377,8 @@ void FrameLoader::setHistoryItemStateForCommit(HistoryCommitType historyCommitTy |
m_currentItem->setPinchViewportScrollPoint(oldItem->pinchViewportScrollPoint()); |
m_currentItem->setPageScaleFactor(oldItem->pageScaleFactor()); |
m_currentItem->setStateObject(oldItem->stateObject()); |
+ m_currentItem->setScrollRestorationType(oldItem->scrollRestorationType()); |
+ |
// The item sequence number determines whether items are "the same", such back/forward navigation |
// between items with the same item sequence number is a no-op. Only treat this as identical if the |
// navigation did not create a back/forward entry and the url is identical or it was loaded via |
@@ -571,6 +573,8 @@ void FrameLoader::checkCompleted() |
m_progressTracker->progressCompleted(); |
// Retry restoring scroll offset since finishing loading disables content |
// size clamping. |
+ // TODO(majidvp): Remove this call as it appears to be a no-op because |
+ // we set load type to |FrameLoadTypeStandard| just above. |
restoreScrollPositionAndViewState(); |
m_frame->localDOMWindow()->finishedLoading(); |
@@ -690,9 +694,6 @@ void FrameLoader::loadInSameDocument(const KURL& url, PassRefPtr<SerializedScrip |
m_frame->view()->setWasScrolledByUser(false); |
- // We need to scroll to the fragment whether or not a hash change occurred, since |
- // the user might have scrolled since the previous navigation. |
- processFragment(url, NavigationWithinSameDocument); |
checkCompleted(); |
m_frame->localDOMWindow()->statePopped(stateObject ? stateObject : SerializedScriptValue::nullValue()); |
@@ -914,6 +915,10 @@ void FrameLoader::load(const FrameLoadRequest& passedRequest, FrameLoadType fram |
if (sameDocumentHistoryNavigation) |
restoreScrollPositionAndViewState(); |
+ |
+ // We need to scroll to the fragment whether or not a hash change occurred, since |
+ // the user might have scrolled since the previous navigation. |
+ processFragment(url, NavigationWithinSameDocument); |
return; |
} |
@@ -1108,8 +1113,10 @@ void FrameLoader::restoreScrollPositionAndViewState() |
if (!needsHistoryItemRestore(m_loadType)) |
return; |
- if (m_currentItem->scrollRestorationType() == ScrollRestorationManual) |
+ if (m_currentItem->scrollRestorationType() == ScrollRestorationManual) { |
+ documentLoader()->initialScrollState().didRestoreFromHistory = true; |
return; |
+ } |
// This tries to balance 1. restoring as soon as possible, 2. detecting |
// clamping to avoid repeatedly popping the scroll position down as the |
@@ -1236,9 +1243,13 @@ void FrameLoader::processFragment(const KURL& url, LoadStartType loadStartType) |
if (boundaryFrame && boundaryFrame->isLocalFrame()) |
toLocalFrame(boundaryFrame.get())->view()->setSafeToPropagateScrollToParent(false); |
- view->processUrlFragment(url, |
- loadStartType == NavigationToDifferentDocument && documentLoader()->initialScrollState().didRestoreFromHistory ? |
- FrameView::UrlFragmentDontScroll : FrameView::UrlFragmentScroll); |
+ // If scroll position is restored from history fragment then we should not override it unless |
+ // this is a same document reload. |
+ bool shouldScrollToFragment = (loadStartType == NavigationWithinSameDocument && !isBackForwardLoadType(m_loadType)) |
+ || !documentLoader()->initialScrollState().didRestoreFromHistory; |
+ |
+ view->processUrlFragment(url, shouldScrollToFragment ? |
+ FrameView::UrlFragmentScroll : FrameView::UrlFragmentDontScroll); |
if (boundaryFrame && boundaryFrame->isLocalFrame()) |
toLocalFrame(boundaryFrame.get())->view()->setSafeToPropagateScrollToParent(true); |