From bc30b17176dca09ec6fdc70c2636a9d0593a6f75 Mon Sep 17 00:00:00 2001 From: Thibaut Date: Sun, 10 May 2015 15:52:24 -0400 Subject: [PATCH] Scroll to top on transition cache hit --- lib/assets/javascripts/turbolinks.js.coffee | 15 +++++++------ test/javascript/turbolinks_visit_test.coffee | 22 ++++++++++++++++++++ 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/lib/assets/javascripts/turbolinks.js.coffee b/lib/assets/javascripts/turbolinks.js.coffee index ac0fbc2c..8f79f785 100644 --- a/lib/assets/javascripts/turbolinks.js.coffee +++ b/lib/assets/javascripts/turbolinks.js.coffee @@ -30,12 +30,12 @@ fetch = (url, options = {}) -> progressBar?.start() if transitionCacheEnabled and cachedPage = transitionCacheFor(url.absolute) - fetchHistory cachedPage + fetchHistory cachedPage, recallScrollPosition: false options.showProgressBar = false - fetchReplacement url, options else options.onLoadFunction = resetScrollPosition unless options.change - fetchReplacement url, options + + fetchReplacement url, options transitionCacheFor = (url) -> cachedPage = pageCache[url] @@ -89,11 +89,14 @@ fetchReplacement = (url, options) -> xhr.send() -fetchHistory = (cachedPage) -> +fetchHistory = (cachedPage, options) -> xhr?.abort() changePage createDocument(cachedPage.body), title: cachedPage.title, runScripts: false progressBar?.done() - recallScrollPosition cachedPage + if options.recallScrollPosition + recallScrollPosition cachedPage + else + resetScrollPosition() triggerEvent EVENTS.RESTORE cacheCurrentPage = -> @@ -587,7 +590,7 @@ onHistoryChange = (event) -> if event.state?.turbolinks && event.state.url != currentState.url if cachedPage = pageCache[(new ComponentUrl(event.state.url)).absolute] cacheCurrentPage() - fetchHistory cachedPage + fetchHistory cachedPage, recallScrollPosition: true else visit event.target.location.href diff --git a/test/javascript/turbolinks_visit_test.coffee b/test/javascript/turbolinks_visit_test.coffee index 06c331ab..4613f239 100644 --- a/test/javascript/turbolinks_visit_test.coffee +++ b/test/javascript/turbolinks_visit_test.coffee @@ -259,6 +259,28 @@ suite 'Turbolinks.visit()', -> @Turbolinks.pagesCached(0) @Turbolinks.visit('iframe2.html') + test "scrolls to top on transition cache hit", (done) -> + load = 0 + restoreCalled = false + @document.addEventListener 'page:load', => + load += 1 + if load is 1 + @window.scrollTo(8, 8) + setTimeout (=> @Turbolinks.visit('iframe.html')), 0 + else if load is 2 + assert.ok restoreCalled + assert.equal @window.pageXOffset, 16 + assert.equal @window.pageYOffset, 16 + done() + @document.addEventListener 'page:restore', => + assert.equal @window.pageXOffset, 0 + assert.equal @window.pageYOffset, 0 + @window.scrollTo(16, 16) + restoreCalled = true + @window.scrollTo(4, 4) + @Turbolinks.enableTransitionCache() + @Turbolinks.visit('iframe2.html') + test "doesn't scroll to top with :change", (done) -> @window.scrollTo(42, 42) @document.addEventListener 'page:load', =>