From 6143735fdae84105ec45761d608590f8bdd61133 Mon Sep 17 00:00:00 2001 From: Hiroaki Nakamura Date: Sat, 3 Aug 2013 21:46:01 +0900 Subject: [PATCH 1/2] Add turbolinks.js 1.3.0. The js, minified js and sourcemap files were created with commands: coffee -c turbolinks.coffee closure-compiler \ --js turbolinks.js \ --create_source_map turbolinks.min.map \ --source_map_format=V3 \ --js_output_file turbolinks.min.js echo '//# sourceMappingURL=turbolinks.min.map' >> turbolinks.min.js --- ajax/libs/turbolinks/1.3.0/turbolinks.js | 423 ++++++++++++++++++ ajax/libs/turbolinks/1.3.0/turbolinks.min.js | 13 + ajax/libs/turbolinks/1.3.0/turbolinks.min.map | 8 + 3 files changed, 444 insertions(+) create mode 100644 ajax/libs/turbolinks/1.3.0/turbolinks.js create mode 100644 ajax/libs/turbolinks/1.3.0/turbolinks.min.js create mode 100644 ajax/libs/turbolinks/1.3.0/turbolinks.min.map diff --git a/ajax/libs/turbolinks/1.3.0/turbolinks.js b/ajax/libs/turbolinks/1.3.0/turbolinks.js new file mode 100644 index 000000000..7723d62ab --- /dev/null +++ b/ajax/libs/turbolinks/1.3.0/turbolinks.js @@ -0,0 +1,423 @@ +// Generated by CoffeeScript 1.6.3 +(function() { + var CSRFToken, anchoredLink, browserCompatibleDocumentParser, browserIsntBuggy, browserSupportsPushState, cacheCurrentPage, cacheSize, changePage, constrainPageCacheTo, createDocument, crossOriginLink, currentState, executeScriptTags, extractLink, extractTitleAndBody, fetchHistory, fetchReplacement, handleClick, ignoreClick, initializeTurbolinks, installClickHandlerLast, loadedAssets, noTurbolink, nonHtmlLink, nonStandardClick, pageCache, pageChangePrevented, pagesCached, processResponse, recallScrollPosition, referer, reflectNewUrl, reflectRedirectedUrl, rememberCurrentState, rememberCurrentUrl, removeHash, removeNoscriptTags, requestMethod, requestMethodIsSafe, resetScrollPosition, targetLink, triggerEvent, visit, xhr, _ref, + __hasProp = {}.hasOwnProperty, + __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; + + cacheSize = 10; + + currentState = null; + + referer = null; + + loadedAssets = null; + + pageCache = {}; + + createDocument = null; + + requestMethod = ((_ref = document.cookie.match(/request_method=(\w+)/)) != null ? _ref[1].toUpperCase() : void 0) || ''; + + xhr = null; + + fetchReplacement = function(url) { + var safeUrl; + triggerEvent('page:fetch'); + safeUrl = removeHash(url); + if (xhr != null) { + xhr.abort(); + } + xhr = new XMLHttpRequest; + xhr.open('GET', safeUrl, true); + xhr.setRequestHeader('Accept', 'text/html, application/xhtml+xml, application/xml'); + xhr.setRequestHeader('X-XHR-Referer', referer); + xhr.onload = function() { + var doc; + triggerEvent('page:receive'); + if (doc = processResponse()) { + reflectNewUrl(url); + changePage.apply(null, extractTitleAndBody(doc)); + reflectRedirectedUrl(); + if (document.location.hash) { + document.location.href = document.location.href; + } else { + resetScrollPosition(); + } + return triggerEvent('page:load'); + } else { + return document.location.href = url; + } + }; + xhr.onloadend = function() { + return xhr = null; + }; + xhr.onabort = function() { + return rememberCurrentUrl(); + }; + xhr.onerror = function() { + return document.location.href = url; + }; + return xhr.send(); + }; + + fetchHistory = function(position) { + var page; + cacheCurrentPage(); + page = pageCache[position]; + if (xhr != null) { + xhr.abort(); + } + changePage(page.title, page.body); + recallScrollPosition(page); + return triggerEvent('page:restore'); + }; + + cacheCurrentPage = function() { + pageCache[currentState.position] = { + url: document.location.href, + body: document.body, + title: document.title, + positionY: window.pageYOffset, + positionX: window.pageXOffset + }; + return constrainPageCacheTo(cacheSize); + }; + + pagesCached = function(size) { + if (size == null) { + size = cacheSize; + } + if (/^[\d]+$/.test(size)) { + return cacheSize = parseInt(size); + } + }; + + constrainPageCacheTo = function(limit) { + var key, value; + for (key in pageCache) { + if (!__hasProp.call(pageCache, key)) continue; + value = pageCache[key]; + if (key <= currentState.position - limit) { + pageCache[key] = null; + } + } + }; + + changePage = function(title, body, csrfToken, runScripts) { + document.title = title; + document.documentElement.replaceChild(body, document.body); + if (csrfToken != null) { + CSRFToken.update(csrfToken); + } + removeNoscriptTags(); + if (runScripts) { + executeScriptTags(); + } + currentState = window.history.state; + return triggerEvent('page:change'); + }; + + executeScriptTags = function() { + var attr, copy, nextSibling, parentNode, script, scripts, _i, _j, _len, _len1, _ref1, _ref2; + scripts = Array.prototype.slice.call(document.body.querySelectorAll('script:not([data-turbolinks-eval="false"])')); + for (_i = 0, _len = scripts.length; _i < _len; _i++) { + script = scripts[_i]; + if (!((_ref1 = script.type) === '' || _ref1 === 'text/javascript')) { + continue; + } + copy = document.createElement('script'); + _ref2 = script.attributes; + for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) { + attr = _ref2[_j]; + copy.setAttribute(attr.name, attr.value); + } + copy.appendChild(document.createTextNode(script.innerHTML)); + parentNode = script.parentNode, nextSibling = script.nextSibling; + parentNode.removeChild(script); + parentNode.insertBefore(copy, nextSibling); + } + }; + + removeNoscriptTags = function() { + var noscript, noscriptTags, _i, _len; + noscriptTags = Array.prototype.slice.call(document.body.getElementsByTagName('noscript')); + for (_i = 0, _len = noscriptTags.length; _i < _len; _i++) { + noscript = noscriptTags[_i]; + noscript.parentNode.removeChild(noscript); + } + }; + + reflectNewUrl = function(url) { + if (url !== referer) { + return window.history.pushState({ + turbolinks: true, + position: currentState.position + 1 + }, '', url); + } + }; + + reflectRedirectedUrl = function() { + var location, preservedHash; + if (location = xhr.getResponseHeader('X-XHR-Redirected-To')) { + preservedHash = removeHash(location) === location ? document.location.hash : ''; + return window.history.replaceState(currentState, '', location + preservedHash); + } + }; + + rememberCurrentUrl = function() { + return window.history.replaceState({ + turbolinks: true, + position: Date.now() + }, '', document.location.href); + }; + + rememberCurrentState = function() { + return currentState = window.history.state; + }; + + recallScrollPosition = function(page) { + return window.scrollTo(page.positionX, page.positionY); + }; + + resetScrollPosition = function() { + return window.scrollTo(0, 0); + }; + + removeHash = function(url) { + var link; + link = url; + if (url.href == null) { + link = document.createElement('A'); + link.href = url; + } + return link.href.replace(link.hash, ''); + }; + + triggerEvent = function(name) { + var event; + event = document.createEvent('Events'); + event.initEvent(name, true, true); + return document.dispatchEvent(event); + }; + + pageChangePrevented = function() { + return !triggerEvent('page:before-change'); + }; + + processResponse = function() { + var assetsChanged, clientOrServerError, doc, extractTrackAssets, intersection, validContent; + clientOrServerError = function() { + var _ref1; + return (400 <= (_ref1 = xhr.status) && _ref1 < 600); + }; + validContent = function() { + return xhr.getResponseHeader('Content-Type').match(/^(?:text\/html|application\/xhtml\+xml|application\/xml)(?:;|$)/); + }; + extractTrackAssets = function(doc) { + var node, _i, _len, _ref1, _results; + _ref1 = doc.head.childNodes; + _results = []; + for (_i = 0, _len = _ref1.length; _i < _len; _i++) { + node = _ref1[_i]; + if ((typeof node.getAttribute === "function" ? node.getAttribute('data-turbolinks-track') : void 0) != null) { + _results.push(node.src || node.href); + } + } + return _results; + }; + assetsChanged = function(doc) { + var fetchedAssets; + loadedAssets || (loadedAssets = extractTrackAssets(document)); + fetchedAssets = extractTrackAssets(doc); + return fetchedAssets.length !== loadedAssets.length || intersection(fetchedAssets, loadedAssets).length !== loadedAssets.length; + }; + intersection = function(a, b) { + var value, _i, _len, _ref1, _results; + if (a.length > b.length) { + _ref1 = [b, a], a = _ref1[0], b = _ref1[1]; + } + _results = []; + for (_i = 0, _len = a.length; _i < _len; _i++) { + value = a[_i]; + if (__indexOf.call(b, value) >= 0) { + _results.push(value); + } + } + return _results; + }; + if (!clientOrServerError() && validContent()) { + doc = createDocument(xhr.responseText); + if (doc && !assetsChanged(doc)) { + return doc; + } + } + }; + + extractTitleAndBody = function(doc) { + var title; + title = doc.querySelector('title'); + return [title != null ? title.textContent : void 0, doc.body, CSRFToken.get(doc).token, 'runScripts']; + }; + + CSRFToken = { + get: function(doc) { + var tag; + if (doc == null) { + doc = document; + } + return { + node: tag = doc.querySelector('meta[name="csrf-token"]'), + token: tag != null ? typeof tag.getAttribute === "function" ? tag.getAttribute('content') : void 0 : void 0 + }; + }, + update: function(latest) { + var current; + current = this.get(); + if ((current.token != null) && (latest != null) && current.token !== latest) { + return current.node.setAttribute('content', latest); + } + } + }; + + browserCompatibleDocumentParser = function() { + var createDocumentUsingDOM, createDocumentUsingParser, createDocumentUsingWrite, e, testDoc, _ref1; + createDocumentUsingParser = function(html) { + return (new DOMParser).parseFromString(html, 'text/html'); + }; + createDocumentUsingDOM = function(html) { + var doc; + doc = document.implementation.createHTMLDocument(''); + doc.documentElement.innerHTML = html; + return doc; + }; + createDocumentUsingWrite = function(html) { + var doc; + doc = document.implementation.createHTMLDocument(''); + doc.open('replace'); + doc.write(html); + doc.close(); + return doc; + }; + try { + if (window.DOMParser) { + testDoc = createDocumentUsingParser('

test'); + return createDocumentUsingParser; + } + } catch (_error) { + e = _error; + testDoc = createDocumentUsingDOM('

test'); + return createDocumentUsingDOM; + } finally { + if ((testDoc != null ? (_ref1 = testDoc.body) != null ? _ref1.childNodes.length : void 0 : void 0) !== 1) { + return createDocumentUsingWrite; + } + } + }; + + installClickHandlerLast = function(event) { + if (!event.defaultPrevented) { + document.removeEventListener('click', handleClick, false); + return document.addEventListener('click', handleClick, false); + } + }; + + handleClick = function(event) { + var link; + if (!event.defaultPrevented) { + link = extractLink(event); + if (link.nodeName === 'A' && !ignoreClick(event, link)) { + if (!pageChangePrevented()) { + visit(link.href); + } + return event.preventDefault(); + } + } + }; + + extractLink = function(event) { + var link; + link = event.target; + while (!(!link.parentNode || link.nodeName === 'A')) { + link = link.parentNode; + } + return link; + }; + + crossOriginLink = function(link) { + return location.protocol !== link.protocol || location.host !== link.host; + }; + + anchoredLink = function(link) { + return ((link.hash && removeHash(link)) === removeHash(location)) || (link.href === location.href + '#'); + }; + + nonHtmlLink = function(link) { + var url; + url = removeHash(link); + return url.match(/\.[a-z]+(\?.*)?$/g) && !url.match(/\.html?(\?.*)?$/g); + }; + + noTurbolink = function(link) { + var ignore; + while (!(ignore || link === document)) { + ignore = link.getAttribute('data-no-turbolink') != null; + link = link.parentNode; + } + return ignore; + }; + + targetLink = function(link) { + return link.target.length !== 0; + }; + + nonStandardClick = function(event) { + return event.which > 1 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey; + }; + + ignoreClick = function(event, link) { + return crossOriginLink(link) || anchoredLink(link) || nonHtmlLink(link) || noTurbolink(link) || targetLink(link) || nonStandardClick(event); + }; + + initializeTurbolinks = function() { + rememberCurrentUrl(); + rememberCurrentState(); + createDocument = browserCompatibleDocumentParser(); + document.addEventListener('click', installClickHandlerLast, true); + return window.addEventListener('popstate', function(event) { + var state; + state = event.state; + if (state != null ? state.turbolinks : void 0) { + if (pageCache[state.position]) { + return fetchHistory(state.position); + } else { + return visit(event.target.location.href); + } + } + }, false); + }; + + browserSupportsPushState = window.history && window.history.pushState && window.history.replaceState && window.history.state !== void 0; + + browserIsntBuggy = !navigator.userAgent.match(/CriOS\//); + + requestMethodIsSafe = requestMethod === 'GET' || requestMethod === ''; + + if (browserSupportsPushState && browserIsntBuggy && requestMethodIsSafe) { + visit = function(url) { + referer = document.location.href; + cacheCurrentPage(); + return fetchReplacement(url); + }; + initializeTurbolinks(); + } else { + visit = function(url) { + return document.location.href = url; + }; + } + + this.Turbolinks = { + visit: visit, + pagesCached: pagesCached + }; + +}).call(this); diff --git a/ajax/libs/turbolinks/1.3.0/turbolinks.min.js b/ajax/libs/turbolinks/1.3.0/turbolinks.min.js new file mode 100644 index 000000000..aa5fa1d2e --- /dev/null +++ b/ajax/libs/turbolinks/1.3.0/turbolinks.min.js @@ -0,0 +1,13 @@ +(function(){var s,A,B,p,C,t,q,u,D,v,E,f,F,G,H,I,J,w,K,L,M,k,N,O,P,g,Q,R,S,r,T,U,V,x,l,W,y,X,Y,h,n,c,aa={}.hasOwnProperty,ba=[].indexOf||function(a){for(var b=0,e=this.length;bb.length&&(c=[b,a],a=c[0],b=c[1]);f=[];d=0;for(e=a.length;da}()&&b()&&(b=v(c.responseText))&&!a(b))return b};H=function(a){var b;b=a.querySelector("title");return[null!=b?b.textContent:void 0,a.body,s.get(a).token,"runScripts"]}; +s={get:function(a){var b;null==a&&(a=document);return{node:b=a.querySelector('meta[name="csrf-token"]'),token:null!=b?"function"===typeof b.getAttribute?b.getAttribute("content"):void 0:void 0}},update:function(a){var b;b=this.get();if(null!=b.token&&null!=a&&b.token!==a)return b.node.setAttribute("content",a)}};B=function(){var a,b,c,d,f;b=function(a){return(new DOMParser).parseFromString(a,"text/html")};a=function(a){var b;b=document.implementation.createHTMLDocument("");b.documentElement.innerHTML= +a;return b};c=function(a){var b;b=document.implementation.createHTMLDocument("");b.open("replace");b.write(a);b.close();return b};try{if(window.DOMParser)return d=b("

test"),b}catch(g){return d=a("

test"),a}finally{if(1!==(null!=d?null!=(f=d.body)?f.childNodes.length:void 0:void 0))return c}};M=function(a){if(!a.defaultPrevented)return document.removeEventListener("click",w,!1),document.addEventListener("click",w,!1)};w=function(a){var b;if(!a.defaultPrevented&&(b=G(a), +"A"===b.nodeName&&!K(a,b)))return Q()||n(b.href),a.preventDefault()};G=function(a){for(a=a.target;a.parentNode&&"A"!==a.nodeName;)a=a.parentNode;return a};E=function(a){return location.protocol!==a.protocol||location.host!==a.host};A=function(a){return(a.hash&&l(a))===l(location)||a.href===location.href+"#"};O=function(a){a=l(a);return a.match(/\.[a-z]+(\?.*)?$/g)&&!a.match(/\.html?(\?.*)?$/g)};N=function(a){for(var b;!b&&a!==document;)b=null!=a.getAttribute("data-no-turbolink"),a=a.parentNode;return b}; +Y=function(a){return 0!==a.target.length};P=function(a){return 1 Date: Sat, 17 Aug 2013 23:25:36 +0900 Subject: [PATCH 2/2] Add package.json. --- ajax/libs/turbolinks/package.json | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 ajax/libs/turbolinks/package.json diff --git a/ajax/libs/turbolinks/package.json b/ajax/libs/turbolinks/package.json new file mode 100644 index 000000000..67b13635b --- /dev/null +++ b/ajax/libs/turbolinks/package.json @@ -0,0 +1,22 @@ +{ + "name": "turbolinks", + "filename": "turbolinks.min.js", + "version": "1.3.0", + "description": "Turbolinks makes following links in your web application faster. Instead of letting the browser recompile the JavaScript and CSS between each page change, it keeps the current page instance alive and replaces only the body and the title in the head. Think CGI vs persistent process.", + "homepage": "https://github.com/rails/turbolinks/", + "keywords": [ + "rails", + "popular" + ], + "maintainers": [ + { + "name": "The Ruby on Rails Project" + } + ], + "repositories": [ + { + "type": "git", + "url": "https://github.com/rails/turbolinks.git" + } + ] +}