Skip to content
This repository has been archived by the owner on Jul 28, 2018. It is now read-only.

Commit

Permalink
asset change detection
Browse files Browse the repository at this point in the history
  • Loading branch information
davydotcom committed Oct 3, 2012
1 parent 6ca53da commit a5e8156
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 7 deletions.
30 changes: 23 additions & 7 deletions lib/assets/javascripts/turbolinks.js.coffee
Expand Up @@ -2,7 +2,7 @@ pageCache = []
currentState = null
initialized = false
referer = document.location.href

assets = []

visit = (url) ->
if browserSupportsPushState
Expand All @@ -12,17 +12,18 @@ visit = (url) ->
else
document.location.href = url


fetchReplacement = (url) ->
triggerEvent 'page:fetch'
xhr = new XMLHttpRequest
xhr.open 'GET', url, true
xhr.setRequestHeader 'Accept', 'text/html, application/xhtml+xml, application/xml'
xhr.setRequestHeader 'X-XHR-Referer', referer
xhr.onload = ->
changePage extractTitleAndBody(xhr.responseText)...
reflectRedirectedUrl xhr
triggerEvent 'page:load'
doc = createDocument xhr.responseText
unless assetsChanged extractAssetsFrom doc
changePage extractTitleAndBody(doc)...
reflectRedirectedUrl xhr
triggerEvent 'page:load'
xhr.onabort = -> console.log 'Aborted turbolink fetch!'
xhr.send()

Expand Down Expand Up @@ -80,22 +81,37 @@ rememberCurrentState = ->

rememberInitialPage = ->
unless initialized
assets = extractAssetsFrom document
rememberCurrentUrl()
rememberCurrentState()
initialized = true

recallScrollPosition = (page) ->
window.scrollTo page.positionX, page.positionY

extractAssetsFrom = (doc) ->
headAssets = []
for script in document.head.getElementsByTagName 'script'
headAssets.push script.src if script.src
for link in document.head.getElementsByTagName 'link'
headAssets.push link.href if link.href
headAssets

assetsChanged = (headAssets)->
if assets.length == headAssets.length
for asset, index in assets
unless asset == headAssets[index]
document.location.reload()
return true
false

triggerEvent = (name) ->
event = document.createEvent 'Events'
event.initEvent name, true, true
document.dispatchEvent event


extractTitleAndBody = (html) ->
doc = createDocument html
extractTitleAndBody = (doc) ->
title = doc.querySelector 'title'
[ title?.textContent, doc.body ]

Expand Down
1 change: 1 addition & 0 deletions test/index.html
Expand Up @@ -16,6 +16,7 @@
<li><a href="/other.html"><span>Wrapped link</span></a></li>
<li><a href="http://www.google.com/">Cross origin</a></li>
<li><a href="/other.html" onclick="if(!confirm('follow link?')) { return false}">Confirm Fire Order</a></li>
<li><a href="/reload.html"><span>Asset Change</span></a></li>
<li><a href="/dummy.gif?12345">Query Param Image Link</a></li>
<li><a href="#">Hash link</a></li>
</ul>
Expand Down

0 comments on commit a5e8156

Please sign in to comment.