turbolinks
Version:
Turbolinks makes navigating your web application faster
105 lines (81 loc) • 3.73 kB
text/coffeescript
#= require ./renderer
class Turbolinks.SnapshotRenderer extends Turbolinks.Renderer
constructor: ( , , ) ->
= .headDetails
= .headDetails
= .bodyElement
= .bodyElement
render: (callback) ->
if
=>
unless
callback()
else
mergeHead: ->
replaceBody: ->
placeholders =
shouldRender: ->
.isVisitable() and
trackedElementsAreIdentical: ->
.getTrackedElementSignature() is .getTrackedElementSignature()
copyNewHeadStylesheetElements: ->
for element in
document.head.appendChild(element)
copyNewHeadScriptElements: ->
for element in
document.head.appendChild( )
removeCurrentHeadProvisionalElements: ->
for element in
document.head.removeChild(element)
copyNewHeadProvisionalElements: ->
for element in
document.head.appendChild(element)
relocateCurrentBodyPermanentElements: ->
for permanentElement in
placeholder = createPlaceholderForPermanentElement(permanentElement)
newElement = .getPermanentElementById(permanentElement.id)
replaceElementWithElement(permanentElement, placeholder.element)
replaceElementWithElement(newElement, permanentElement)
placeholder
replacePlaceholderElementsWithClonedPermanentElements: (placeholders) ->
for { element, permanentElement } in placeholders
clonedElement = permanentElement.cloneNode(true)
replaceElementWithElement(element, clonedElement)
activateNewBodyScriptElements: ->
for inertScriptElement in
activatedScriptElement =
replaceElementWithElement(inertScriptElement, activatedScriptElement)
assignNewBody: ->
document.body =
focusFirstAutofocusableElement: ->
.findFirstAutofocusableElement()?.focus()
getNewHeadStylesheetElements: ->
.getStylesheetElementsNotInDetails( )
getNewHeadScriptElements: ->
.getScriptElementsNotInDetails( )
getCurrentHeadProvisionalElements: ->
.getProvisionalElements()
getNewHeadProvisionalElements: ->
.getProvisionalElements()
getCurrentBodyPermanentElements: ->
.getPermanentElementsPresentInSnapshot( )
getNewBodyScriptElements: ->
.querySelectorAll("script")
createPlaceholderForPermanentElement = (permanentElement) ->
element = document.createElement("meta")
element.setAttribute("name", "turbolinks-permanent-placeholder")
element.setAttribute("content", permanentElement.id)
{ element, permanentElement }
replaceElementWithElement = (fromElement, toElement) ->
if parentElement = fromElement.parentNode
parentElement.replaceChild(toElement, fromElement)