JezK
Edit File: snapshot_renderer.js
// Generated by CoffeeScript 2.7.0 (function() { var createPlaceholderForPermanentElement, replaceElementWithElement; require('./renderer'); Turbolinks.SnapshotRenderer = class SnapshotRenderer extends Turbolinks.Renderer { constructor(currentSnapshot, newSnapshot, isPreview) { super(currentSnapshot, newSnapshot, isPreview); this.currentSnapshot = currentSnapshot; this.newSnapshot = newSnapshot; this.isPreview = isPreview; this.currentHeadDetails = this.currentSnapshot.headDetails; this.newHeadDetails = this.newSnapshot.headDetails; this.currentBody = this.currentSnapshot.bodyElement; this.newBody = this.newSnapshot.bodyElement; } render(callback) { if (this.shouldRender()) { this.mergeHead(); return this.renderView(() => { this.replaceBody(); if (!this.isPreview) { this.focusFirstAutofocusableElement(); } return callback(); }); } else { return this.invalidateView(); } } mergeHead() { this.copyNewHeadStylesheetElements(); this.copyNewHeadScriptElements(); this.removeCurrentHeadProvisionalElements(); return this.copyNewHeadProvisionalElements(); } replaceBody() { var placeholders; placeholders = this.relocateCurrentBodyPermanentElements(); this.activateNewBodyScriptElements(); this.assignNewBody(); return this.replacePlaceholderElementsWithClonedPermanentElements(placeholders); } shouldRender() { return this.newSnapshot.isVisitable() && this.trackedElementsAreIdentical(); } trackedElementsAreIdentical() { return this.currentHeadDetails.getTrackedElementSignature() === this.newHeadDetails.getTrackedElementSignature(); } copyNewHeadStylesheetElements() { var element, i, len, ref, results; ref = this.getNewHeadStylesheetElements(); results = []; for (i = 0, len = ref.length; i < len; i++) { element = ref[i]; results.push(document.head.appendChild(element)); } return results; } copyNewHeadScriptElements() { var element, i, len, ref, results; ref = this.getNewHeadScriptElements(); results = []; for (i = 0, len = ref.length; i < len; i++) { element = ref[i]; results.push(document.head.appendChild(this.createScriptElement(element))); } return results; } removeCurrentHeadProvisionalElements() { var element, i, len, ref, results; ref = this.getCurrentHeadProvisionalElements(); results = []; for (i = 0, len = ref.length; i < len; i++) { element = ref[i]; results.push(document.head.removeChild(element)); } return results; } copyNewHeadProvisionalElements() { var element, i, len, ref, results; ref = this.getNewHeadProvisionalElements(); results = []; for (i = 0, len = ref.length; i < len; i++) { element = ref[i]; results.push(document.head.appendChild(element)); } return results; } relocateCurrentBodyPermanentElements() { var i, len, newElement, permanentElement, placeholder, ref, results; ref = this.getCurrentBodyPermanentElements(); results = []; for (i = 0, len = ref.length; i < len; i++) { permanentElement = ref[i]; placeholder = createPlaceholderForPermanentElement(permanentElement); newElement = this.newSnapshot.getPermanentElementById(permanentElement.id); replaceElementWithElement(permanentElement, placeholder.element); replaceElementWithElement(newElement, permanentElement); results.push(placeholder); } return results; } replacePlaceholderElementsWithClonedPermanentElements(placeholders) { var clonedElement, element, i, len, permanentElement, results; results = []; for (i = 0, len = placeholders.length; i < len; i++) { ({element, permanentElement} = placeholders[i]); clonedElement = permanentElement.cloneNode(true); results.push(replaceElementWithElement(element, clonedElement)); } return results; } activateNewBodyScriptElements() { var activatedScriptElement, i, inertScriptElement, len, ref, results; ref = this.getNewBodyScriptElements(); results = []; for (i = 0, len = ref.length; i < len; i++) { inertScriptElement = ref[i]; activatedScriptElement = this.createScriptElement(inertScriptElement); results.push(replaceElementWithElement(inertScriptElement, activatedScriptElement)); } return results; } assignNewBody() { return document.body = this.newBody; } focusFirstAutofocusableElement() { var ref; return (ref = this.newSnapshot.findFirstAutofocusableElement()) != null ? ref.focus() : void 0; } getNewHeadStylesheetElements() { return this.newHeadDetails.getStylesheetElementsNotInDetails(this.currentHeadDetails); } getNewHeadScriptElements() { return this.newHeadDetails.getScriptElementsNotInDetails(this.currentHeadDetails); } getCurrentHeadProvisionalElements() { return this.currentHeadDetails.getProvisionalElements(); } getNewHeadProvisionalElements() { return this.newHeadDetails.getProvisionalElements(); } getCurrentBodyPermanentElements() { return this.currentSnapshot.getPermanentElementsPresentInSnapshot(this.newSnapshot); } getNewBodyScriptElements() { return this.newBody.querySelectorAll("script"); } }; createPlaceholderForPermanentElement = function(permanentElement) { var element; element = document.createElement("meta"); element.setAttribute("name", "turbolinks-permanent-placeholder"); element.setAttribute("content", permanentElement.id); return {element, permanentElement}; }; replaceElementWithElement = function(fromElement, toElement) { var parentElement; if (parentElement = fromElement.parentNode) { return parentElement.replaceChild(toElement, fromElement); } }; }).call(this);