turbograft 0.1.5 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 02d54ea2e6cd5256f9d5de5124c826d0c5a4873c
4
- data.tar.gz: 67b141c9ea5940bd766e625ed451f79dfde388a8
3
+ metadata.gz: a5a3301f90770c31b4656c3a2b2a3e83ac537499
4
+ data.tar.gz: 81ac458b0fc3cd04aaa98806ee23af8b87b20bc5
5
5
  SHA512:
6
- metadata.gz: 9f77a1c9d71b92cce89c4681210798d2159fa1607c8e09ffbfba67c24bf8db0bee9f052212cff74bf4c914dd97060ceefa7ae00e767d46e160fdad36ccd27de8
7
- data.tar.gz: 7bb7e66e72f3969bfd076152244eb9f3afa727e5d42032e5744d2e78bb8a7d1e8a263dabac5592db27581f5165815a26bb270bc30badfeafc768c33cdad8ab10
6
+ metadata.gz: 223c63384ffff6634312422ea2810eba67072750fe04815dbc98cc5a82fbd4f26a1fb06365cc924e6ffccd3eede6ccb0603e18fbbb801f38520f7779bd3ec9d4
7
+ data.tar.gz: 1218b18debf30ba7689875c5ce3ee9e62b3889250c4803c1ddea0470167b3e17039670af6559cf3b2ff5634b914bcacd654f4f6aa77be0ddc294be079adb25c2
@@ -20,6 +20,7 @@ class TurboGraft.Remote
20
20
  xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest')
21
21
  xhr.setRequestHeader('Accept', 'text/html, application/xhtml+xml, application/xml')
22
22
  xhr.setRequestHeader("Content-Type", @contentType) if @contentType
23
+ xhr.setRequestHeader 'X-XHR-Referer', document.location.href
23
24
 
24
25
  csrfToken = CSRFToken.get().token
25
26
  xhr.setRequestHeader('X-CSRF-Token', csrfToken) if csrfToken
@@ -1,3 +1,3 @@
1
1
  module TurboGraft
2
- VERSION = '0.1.5'
2
+ VERSION = '0.1.6'
3
3
  end
@@ -8,39 +8,40 @@ module TurboGraft
8
8
  # request, where it will be used to set the X-XHR-Redirected-To response header. The
9
9
  # Turbolinks script will detect the header and use replaceState to reflect the redirected
10
10
  # url.
11
+
11
12
  module XHRHeaders
12
13
  extend ActiveSupport::Concern
13
14
 
14
- included do
15
- alias_method_chain :_compute_redirect_to_location, :xhr_referer
15
+ def _compute_redirect_to_location(*args)
16
+ options, request = _normalize_redirect_params(args)
17
+
18
+ store_for_turbolinks begin
19
+ if options == :back && request.headers["X-XHR-Referer"]
20
+ super(*[(request if args.length == 2), request.headers["X-XHR-Referer"]].compact)
21
+ else
22
+ super(*args)
23
+ end
24
+ end
16
25
  end
17
26
 
18
27
  private
19
-
20
- if Rails::VERSION::MAJOR == 4 && Rails::VERSION::MINOR > 1
21
- def _compute_redirect_to_location_with_xhr_referer(request, options)
22
- session[:_turbolinks_redirect_to] =
23
- if options == :back && request.headers["X-XHR-Referer"]
24
- _compute_redirect_to_location_without_xhr_referer(request, request.headers["X-XHR-Referer"])
25
- else
26
- _compute_redirect_to_location_without_xhr_referer(request, options)
27
- end
28
+ def store_for_turbolinks(url)
29
+ session[:_turbolinks_redirect_to] = url if session && request.headers["X-XHR-Referer"]
30
+ url
28
31
  end
29
- else
30
- def _compute_redirect_to_location_with_xhr_referer(options)
31
- session[:_turbolinks_redirect_to] =
32
- if options == :back && request.headers["X-XHR-Referer"]
33
- _compute_redirect_to_location_without_xhr_referer(request.headers["X-XHR-Referer"])
34
- else
35
- _compute_redirect_to_location_without_xhr_referer(options)
36
- end
32
+
33
+ def set_xhr_redirected_to
34
+ if session && session[:_turbolinks_redirect_to]
35
+ response.headers['X-XHR-Redirected-To'] = session.delete :_turbolinks_redirect_to
36
+ end
37
37
  end
38
- end
39
38
 
40
- def set_xhr_redirected_to
41
- if session[:_turbolinks_redirect_to]
42
- response.headers['X-XHR-Redirected-To'] = session.delete :_turbolinks_redirect_to
39
+ # Ensure backwards compatibility
40
+ # Rails < 4.2: _compute_redirect_to_location(options)
41
+ # Rails >= 4.2: _compute_redirect_to_location(request, options)
42
+ def _normalize_redirect_params(args)
43
+ options, req = args.reverse
44
+ [options, req || request]
43
45
  end
44
- end
45
46
  end
46
47
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: turbograft
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kristian Plettenberg-Dussault
@@ -13,7 +13,7 @@ authors:
13
13
  autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
- date: 2015-01-09 00:00:00.000000000 Z
16
+ date: 2015-01-13 00:00:00.000000000 Z
17
17
  dependencies:
18
18
  - !ruby/object:Gem::Dependency
19
19
  name: coffee-rails
@@ -229,7 +229,6 @@ files:
229
229
  - lib/assets/javascripts/turbograft/page.coffee
230
230
  - lib/assets/javascripts/turbograft/remote.coffee
231
231
  - lib/assets/javascripts/turbograft/turbolinks.coffee
232
- - lib/turbograft.js
233
232
  - lib/turbograft.rb
234
233
  - lib/turbograft/cookies.rb
235
234
  - lib/turbograft/redirection.rb
data/lib/turbograft.js DELETED
@@ -1,978 +0,0 @@
1
- (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
2
- window.Click = (function() {
3
- Click.installHandlerLast = function(event) {
4
- if (!event.defaultPrevented) {
5
- document.removeEventListener('click', Click.handle, false);
6
- return document.addEventListener('click', Click.handle, false);
7
- }
8
- };
9
-
10
- Click.handle = function(event) {
11
- return new Click(event);
12
- };
13
-
14
- function Click(event) {
15
- this.event = event;
16
- if (this.event.defaultPrevented) {
17
- return;
18
- }
19
- this._extractLink();
20
- if (this._validForTurbolinks()) {
21
- if (!this._pageChangePrevented()) {
22
- Turbolinks.visit(this.link.href);
23
- }
24
- this.event.preventDefault();
25
- }
26
- }
27
-
28
- Click.prototype._pageChangePrevented = function() {
29
- return !triggerEvent('page:before-change');
30
- };
31
-
32
- Click.prototype._extractLink = function() {
33
- var link;
34
- link = this.event.target;
35
- while (!(!link.parentNode || link.nodeName === 'A')) {
36
- link = link.parentNode;
37
- }
38
- if (link.nodeName === 'A' && link.href.length !== 0) {
39
- return this.link = new Link(link);
40
- }
41
- };
42
-
43
- Click.prototype._validForTurbolinks = function() {
44
- return (this.link != null) && !(this.link.shouldIgnore() || this._nonStandardClick());
45
- };
46
-
47
- Click.prototype._nonStandardClick = function() {
48
- return this.event.which > 1 || this.event.metaKey || this.event.ctrlKey || this.event.shiftKey || this.event.altKey;
49
- };
50
-
51
- return Click;
52
-
53
- })();
54
-
55
-
56
-
57
- },{}],2:[function(require,module,exports){
58
- window.ComponentUrl = (function() {
59
- function ComponentUrl(original) {
60
- this.original = original != null ? original : document.location.href;
61
- if (this.original.constructor === ComponentUrl) {
62
- return this.original;
63
- }
64
- this._parse();
65
- }
66
-
67
- ComponentUrl.prototype.withoutHash = function() {
68
- return this.href.replace(this.hash, '');
69
- };
70
-
71
- ComponentUrl.prototype.withoutHashForIE10compatibility = function() {
72
- return this.withoutHash();
73
- };
74
-
75
- ComponentUrl.prototype.hasNoHash = function() {
76
- return this.hash.length === 0;
77
- };
78
-
79
- ComponentUrl.prototype._parse = function() {
80
- var _ref;
81
- (this.link != null ? this.link : this.link = document.createElement('a')).href = this.original;
82
- _ref = this.link, this.href = _ref.href, this.protocol = _ref.protocol, this.host = _ref.host, this.hostname = _ref.hostname, this.port = _ref.port, this.pathname = _ref.pathname, this.search = _ref.search, this.hash = _ref.hash;
83
- this.origin = [this.protocol, '//', this.hostname].join('');
84
- if (this.port.length !== 0) {
85
- this.origin += ":" + this.port;
86
- }
87
- this.relative = [this.pathname, this.search, this.hash].join('');
88
- return this.absolute = this.href;
89
- };
90
-
91
- return ComponentUrl;
92
-
93
- })();
94
-
95
-
96
-
97
- },{}],3:[function(require,module,exports){
98
- window.CSRFToken = (function() {
99
- function CSRFToken() {}
100
-
101
- CSRFToken.get = function(doc) {
102
- var tag;
103
- if (doc == null) {
104
- doc = document;
105
- }
106
- return {
107
- node: tag = doc.querySelector('meta[name="csrf-token"]'),
108
- token: tag != null ? typeof tag.getAttribute === "function" ? tag.getAttribute('content') : void 0 : void 0
109
- };
110
- };
111
-
112
- CSRFToken.update = function(latest) {
113
- var current;
114
- current = this.get();
115
- if ((current.token != null) && (latest != null) && current.token !== latest) {
116
- return current.node.setAttribute('content', latest);
117
- }
118
- };
119
-
120
- return CSRFToken;
121
-
122
- })();
123
-
124
-
125
-
126
- },{}],4:[function(require,module,exports){
127
- var documentListenerForButtons, hasClass, nodeIsDisabled;
128
-
129
- window.TurboGraft = {
130
- handlers: {}
131
- };
132
-
133
- hasClass = function(node, search) {
134
- var className, _i, _len, _ref;
135
- _ref = node.classList;
136
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
137
- className = _ref[_i];
138
- if (className === search) {
139
- return true;
140
- }
141
- }
142
- return false;
143
- };
144
-
145
- nodeIsDisabled = function(node) {
146
- return node.getAttribute('disabled') || hasClass(node, 'disabled');
147
- };
148
-
149
- TurboGraft.handlers.partialGraftClickHandler = function(ev) {
150
- var href, keys, partialGraft, refresh, target;
151
- target = ev.target;
152
- partialGraft = target.getAttribute("partial-graft");
153
- if (partialGraft == null) {
154
- return;
155
- }
156
- ev.preventDefault();
157
- href = target.getAttribute("href");
158
- refresh = target.getAttribute("refresh");
159
- if (href == null) {
160
- throw "TurboGraft developer error: href is not defined on node " + target;
161
- }
162
- if (refresh == null) {
163
- throw "TurboGraft developer error: refresh is not defined on node " + target;
164
- }
165
- keys = refresh.trim().split(" ");
166
- return Page.refresh({
167
- url: href,
168
- onlyKeys: keys
169
- });
170
- };
171
-
172
- TurboGraft.handlers.remoteMethodHandler = function(ev) {
173
- var httpRequestType, httpUrl, onlyOnce, options, remote, target;
174
- target = ev.target;
175
- if (!target.getAttribute('remote-method')) {
176
- return;
177
- }
178
- ev.preventDefault();
179
- httpUrl = target.getAttribute('href');
180
- httpRequestType = target.getAttribute('remote-method');
181
- if (!httpRequestType) {
182
- throw "Turbograft developer error: You did not provide a request type for remote-method";
183
- }
184
- if (!httpUrl) {
185
- throw "Turbograft developer error: You did not provide a URL for remote-method";
186
- }
187
- if (onlyOnce = target.getAttribute("remote-once")) {
188
- target.removeAttribute("remote-once");
189
- target.removeAttribute("remote-method");
190
- }
191
- options = {
192
- httpRequestType: httpRequestType,
193
- httpUrl: httpUrl,
194
- fullRefresh: target.getAttribute('full-refresh') != null,
195
- refreshOnSuccess: target.getAttribute('refresh-on-success'),
196
- refreshOnError: target.getAttribute('refresh-on-error')
197
- };
198
- remote = new TurboGraft.Remote(options);
199
- };
200
-
201
- documentListenerForButtons = function(eventType, handler, useCapture) {
202
- if (useCapture == null) {
203
- useCapture = false;
204
- }
205
- return document.addEventListener(eventType, function(ev) {
206
- var target;
207
- target = ev.target;
208
- if (!(target.nodeName === "A" || target.nodeName === "BUTTON") || nodeIsDisabled(target)) {
209
- return;
210
- }
211
- return handler(ev);
212
- });
213
- };
214
-
215
- documentListenerForButtons('click', TurboGraft.handlers.partialGraftClickHandler, true);
216
-
217
- documentListenerForButtons('click', TurboGraft.handlers.remoteMethodHandler, true);
218
-
219
-
220
-
221
- },{}],5:[function(require,module,exports){
222
- var __hasProp = {}.hasOwnProperty,
223
- __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
224
- __slice = [].slice;
225
-
226
- window.Link = (function(_super) {
227
- __extends(Link, _super);
228
-
229
- Link.HTML_EXTENSIONS = ['html'];
230
-
231
- Link.allowExtensions = function() {
232
- var extension, extensions, _i, _len;
233
- extensions = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
234
- for (_i = 0, _len = extensions.length; _i < _len; _i++) {
235
- extension = extensions[_i];
236
- Link.HTML_EXTENSIONS.push(extension);
237
- }
238
- return Link.HTML_EXTENSIONS;
239
- };
240
-
241
- function Link(link) {
242
- this.link = link;
243
- if (this.link.constructor === Link) {
244
- return this.link;
245
- }
246
- this.original = this.link.href;
247
- Link.__super__.constructor.apply(this, arguments);
248
- }
249
-
250
- Link.prototype.shouldIgnore = function() {
251
- return this._crossOrigin() || this._anchored() || this._nonHtml() || this._optOut() || this._target();
252
- };
253
-
254
- Link.prototype._crossOrigin = function() {
255
- return this.origin !== (new ComponentUrl).origin;
256
- };
257
-
258
- Link.prototype._anchored = function() {
259
- var current;
260
- return ((this.hash && this.withoutHash()) === (current = new ComponentUrl).withoutHash()) || (this.href === current.href + '#');
261
- };
262
-
263
- Link.prototype._nonHtml = function() {
264
- return this.pathname.match(/\.[a-z]+$/g) && !this.pathname.match(new RegExp("\\.(?:" + (Link.HTML_EXTENSIONS.join('|')) + ")?$", 'g'));
265
- };
266
-
267
- Link.prototype._optOut = function() {
268
- var ignore, link;
269
- link = this.link;
270
- while (!(ignore || link === document || link === null)) {
271
- ignore = link.getAttribute('data-no-turbolink') != null;
272
- link = link.parentNode;
273
- }
274
- return ignore;
275
- };
276
-
277
- Link.prototype._target = function() {
278
- return this.link.target.length !== 0;
279
- };
280
-
281
- return Link;
282
-
283
- })(ComponentUrl);
284
-
285
-
286
-
287
- },{}],6:[function(require,module,exports){
288
- if (!window.Page) {
289
- window.Page = {};
290
- }
291
-
292
- Page.visit = function(url, opts) {
293
- if (opts == null) {
294
- opts = {};
295
- }
296
- if (opts.reload) {
297
- return window.location = url;
298
- } else {
299
- return Turbolinks.visit(url);
300
- }
301
- };
302
-
303
- Page.refresh = function(options, callback) {
304
- var newUrl, paramString;
305
- if (options == null) {
306
- options = {};
307
- }
308
- newUrl = options.url ? options.url : options.queryParams ? (paramString = $.param(options.queryParams), paramString ? paramString = "?" + paramString : void 0, location.pathname + paramString) : location.href;
309
- if (options.response) {
310
- return Turbolinks.loadPage(null, options.response, true, callback, options.onlyKeys || []);
311
- } else {
312
- return Turbolinks.visit(newUrl, true, options.onlyKeys || [], function() {
313
- return typeof callback === "function" ? callback() : void 0;
314
- });
315
- }
316
- };
317
-
318
- Page.open = function() {
319
- return window.open.apply(window, arguments);
320
- };
321
-
322
-
323
-
324
- },{}],7:[function(require,module,exports){
325
- window.PageCache = (function() {
326
- var simultaneousAdditionOffset, storage;
327
-
328
- storage = {};
329
-
330
- simultaneousAdditionOffset = 0;
331
-
332
- function PageCache(cacheSize) {
333
- this.cacheSize = cacheSize != null ? cacheSize : 10;
334
- storage = {};
335
- return this;
336
- }
337
-
338
- PageCache.prototype.get = function(key) {
339
- return storage[key];
340
- };
341
-
342
- PageCache.prototype.set = function(key, value) {
343
- if (typeof value !== "object") {
344
- throw "Developer error: You must store objects in this cache";
345
- }
346
- value['cachedAt'] = new Date().getTime() + (simultaneousAdditionOffset += 1);
347
- storage[key] = value;
348
- return this.constrain();
349
- };
350
-
351
- PageCache.prototype.clear = function() {
352
- return storage = {};
353
- };
354
-
355
- PageCache.prototype.setCacheSize = function(newSize) {
356
- if (/^[\d]+$/.test(newSize)) {
357
- this.cacheSize = parseInt(newSize, 10);
358
- return this.constrain();
359
- } else {
360
- throw "Developer error: Invalid parameter '" + newSize + "' for PageCache; must be integer";
361
- }
362
- };
363
-
364
- PageCache.prototype.constrain = function() {
365
- var cacheTimesRecentFirst, key, pageCacheKeys, _i, _len, _results;
366
- pageCacheKeys = Object.keys(storage);
367
- cacheTimesRecentFirst = pageCacheKeys.map((function(_this) {
368
- return function(url) {
369
- return storage[url].cachedAt;
370
- };
371
- })(this)).sort(function(a, b) {
372
- return b - a;
373
- });
374
- _results = [];
375
- for (_i = 0, _len = pageCacheKeys.length; _i < _len; _i++) {
376
- key = pageCacheKeys[_i];
377
- if (!(storage[key].cachedAt <= cacheTimesRecentFirst[this.cacheSize])) {
378
- continue;
379
- }
380
- triggerEvent('page:expire', storage[key]);
381
- _results.push(delete storage[key]);
382
- }
383
- return _results;
384
- };
385
-
386
- PageCache.prototype.length = function() {
387
- return Object.keys(storage).length;
388
- };
389
-
390
- return PageCache;
391
-
392
- })();
393
-
394
-
395
-
396
- },{}],8:[function(require,module,exports){
397
- TurboGraft.Remote = (function() {
398
- function Remote(opts, form) {
399
- var actualRequestType, formData, xhr;
400
- this.opts = opts;
401
- if (form) {
402
- formData = new FormData(form);
403
- } else {
404
- formData = new FormData();
405
- }
406
- actualRequestType = this.opts.httpRequestType.toLowerCase() === 'get' ? 'GET' : 'POST';
407
- formData.append("_method", this.opts.httpRequestType);
408
- if (this.opts.refreshOnSuccess) {
409
- this.refreshOnSuccess = this.opts.refreshOnSuccess.split(" ");
410
- }
411
- if (this.opts.refreshOnError) {
412
- this.refreshOnError = this.opts.refreshOnError.split(" ");
413
- }
414
- xhr = new XMLHttpRequest;
415
- xhr.open(actualRequestType, this.opts.httpUrl, true);
416
- xhr.setRequestHeader('Accept', 'text/html, application/xhtml+xml, application/xml');
417
- xhr.addEventListener('loadstart', function() {
418
- return triggerEvent('turbograft:remote:start', xhr);
419
- });
420
- xhr.addEventListener('error', this.onError);
421
- xhr.addEventListener('load', (function(_this) {
422
- return function(event) {
423
- if (xhr.status < 400) {
424
- return _this.onSuccess(event);
425
- } else {
426
- return _this.onError(event);
427
- }
428
- };
429
- })(this));
430
- xhr.addEventListener('loadend', function() {
431
- return triggerEvent('turbograft:remote:always', xhr);
432
- });
433
- xhr.send(formData);
434
- return xhr;
435
- }
436
-
437
- Remote.prototype.onSuccess = function(ev) {
438
- var redirect, xhr;
439
- xhr = ev.target;
440
- triggerEvent('turbograft:remote:success', xhr);
441
- if (redirect = xhr.getResponseHeader('X-Next-Redirect')) {
442
- Page.visit(redirect, {
443
- reload: true
444
- });
445
- return;
446
- }
447
- if (this.opts.fullRefresh) {
448
- return Page.refresh({
449
- onlyKeys: this.refreshOnSuccess
450
- });
451
- } else if (this.refreshOnSuccess) {
452
- return Page.refresh({
453
- response: xhr,
454
- onlyKeys: this.refreshOnSuccess
455
- });
456
- }
457
- };
458
-
459
- Remote.prototype.onError = function(ev) {
460
- var xhr;
461
- xhr = ev.target;
462
- triggerEvent('turbograft:remote:fail', xhr);
463
- if (this.refreshOnError) {
464
- return Page.refresh({
465
- response: xhr,
466
- onlyKeys: this.refreshOnError
467
- });
468
- } else {
469
- return triggerEvent('turbograft:remote:fail:unhandled', xhr);
470
- }
471
- };
472
-
473
- return Remote;
474
-
475
- })();
476
-
477
-
478
-
479
- },{}],9:[function(require,module,exports){
480
- var browserIsntBuggy, browserSupportsCustomEvents, browserSupportsPushState, browserSupportsTurbolinks, historyStateIsDefined, installDocumentReadyPageEventTriggers, installJqueryAjaxSuccessPageUpdateTrigger, popCookie, requestMethodIsSafe, xhr, _ref,
481
- __slice = [].slice,
482
- __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; };
483
-
484
- xhr = null;
485
-
486
- installDocumentReadyPageEventTriggers = function() {
487
- return document.addEventListener('DOMContentLoaded', (function() {
488
- triggerEvent('page:change');
489
- return triggerEvent('page:update');
490
- }), true);
491
- };
492
-
493
- installJqueryAjaxSuccessPageUpdateTrigger = function() {
494
- if (typeof jQuery !== 'undefined') {
495
- return jQuery(document).on('ajaxSuccess', function(event, xhr, settings) {
496
- if (!jQuery.trim(xhr.responseText)) {
497
- return;
498
- }
499
- return triggerEvent('page:update');
500
- });
501
- }
502
- };
503
-
504
- historyStateIsDefined = window.history.state !== void 0 || navigator.userAgent.match(/Firefox\/2[6|7]/);
505
-
506
- browserSupportsPushState = window.history && window.history.pushState && window.history.replaceState && historyStateIsDefined;
507
-
508
- browserIsntBuggy = !navigator.userAgent.match(/CriOS\//);
509
-
510
- window.triggerEvent = function(name, data) {
511
- var event;
512
- event = document.createEvent('Events');
513
- if (data) {
514
- event.data = data;
515
- }
516
- event.initEvent(name, true, true);
517
- return document.dispatchEvent(event);
518
- };
519
-
520
- popCookie = function(name) {
521
- var value, _ref;
522
- value = ((_ref = document.cookie.match(new RegExp(name + "=(\\w+)"))) != null ? _ref[1].toUpperCase() : void 0) || '';
523
- document.cookie = name + '=; expires=Thu, 01-Jan-70 00:00:01 GMT; path=/';
524
- return value;
525
- };
526
-
527
- requestMethodIsSafe = (_ref = popCookie('request_method')) === 'GET' || _ref === '';
528
-
529
- browserSupportsTurbolinks = browserSupportsPushState && browserIsntBuggy && requestMethodIsSafe;
530
-
531
- browserSupportsCustomEvents = document.addEventListener && document.createEvent;
532
-
533
- if (browserSupportsCustomEvents) {
534
- installDocumentReadyPageEventTriggers();
535
- installJqueryAjaxSuccessPageUpdateTrigger();
536
- }
537
-
538
- window.Turbolinks = (function() {
539
- var browserCompatibleDocumentParser, bypassOnLoadPopstate, changePage, createDocument, currentState, deleteRefreshNeverNodes, executeScriptTag, executeScriptTags, extractTitleAndBody, fetch, fetchHistory, fetchReplacement, installHistoryChangeHandler, loadedAssets, pageCache, pageChangePrevented, processResponse, recallScrollPosition, referer, reflectNewUrl, reflectRedirectedUrl, refreshNodesWithKeys, rememberReferer, removeNoscriptTags, resetScrollPosition, transitionCacheFor, usePageCache;
540
-
541
- function Turbolinks() {}
542
-
543
- createDocument = null;
544
-
545
- currentState = null;
546
-
547
- loadedAssets = null;
548
-
549
- referer = null;
550
-
551
- usePageCache = false;
552
-
553
- Turbolinks.pageCache = pageCache = new PageCache();
554
-
555
- fetch = function(url, partialReplace, replaceContents, callback) {
556
- var cachedPage;
557
- if (partialReplace == null) {
558
- partialReplace = false;
559
- }
560
- if (replaceContents == null) {
561
- replaceContents = [];
562
- }
563
- url = new ComponentUrl(url);
564
- rememberReferer();
565
- if (usePageCache) {
566
- Turbolinks.cacheCurrentPage();
567
- }
568
- if (usePageCache && (cachedPage = transitionCacheFor(url.absolute))) {
569
- fetchHistory(cachedPage);
570
- return fetchReplacement(url, partialReplace, null, replaceContents);
571
- } else {
572
- return fetchReplacement(url, partialReplace, function() {
573
- if (!replaceContents.length) {
574
- resetScrollPosition();
575
- }
576
- return typeof callback === "function" ? callback() : void 0;
577
- }, replaceContents);
578
- }
579
- };
580
-
581
- Turbolinks.pageCacheEnabled = function() {
582
- return usePageCache;
583
- };
584
-
585
- Turbolinks.usePageCache = function(status) {
586
- return usePageCache = status;
587
- };
588
-
589
- transitionCacheFor = function(url) {
590
- var cachedPage;
591
- cachedPage = pageCache.get(url);
592
- if (cachedPage && !cachedPage.transitionCacheDisabled) {
593
- return cachedPage;
594
- }
595
- };
596
-
597
- Turbolinks.pushState = function(state, title, url) {
598
- return window.history.pushState(state, title, url);
599
- };
600
-
601
- Turbolinks.replaceState = function(state, title, url) {
602
- return window.history.replaceState(state, title, url);
603
- };
604
-
605
- fetchReplacement = function(url, partialReplace, onLoadFunction, replaceContents) {
606
- triggerEvent('page:fetch', {
607
- url: url.absolute
608
- });
609
- if (xhr != null) {
610
- xhr.abort();
611
- }
612
- xhr = new XMLHttpRequest;
613
- xhr.open('GET', url.withoutHashForIE10compatibility(), true);
614
- xhr.setRequestHeader('Accept', 'text/html, application/xhtml+xml, application/xml');
615
- xhr.setRequestHeader('X-XHR-Referer', referer);
616
- xhr.onload = function() {
617
- if (xhr.status >= 500) {
618
- return document.location.href = url.absolute;
619
- } else {
620
- return Turbolinks.loadPage(url, xhr, partialReplace, onLoadFunction, replaceContents);
621
- }
622
- };
623
- xhr.onloadend = function() {
624
- return xhr = null;
625
- };
626
- xhr.onerror = function() {
627
- return document.location.href = url.absolute;
628
- };
629
- xhr.send();
630
- };
631
-
632
- Turbolinks.loadPage = function(url, xhr, partialReplace, onLoadFunction, replaceContents) {
633
- var doc, nodes;
634
- if (partialReplace == null) {
635
- partialReplace = false;
636
- }
637
- if (onLoadFunction == null) {
638
- onLoadFunction = (function() {});
639
- }
640
- if (replaceContents == null) {
641
- replaceContents = [];
642
- }
643
- triggerEvent('page:receive');
644
- if (doc = processResponse(xhr, partialReplace)) {
645
- reflectNewUrl(url);
646
- nodes = changePage.apply(null, __slice.call(extractTitleAndBody(doc)).concat([partialReplace], [replaceContents]));
647
- reflectRedirectedUrl(xhr);
648
- triggerEvent('page:load', nodes);
649
- if (typeof onLoadFunction === "function") {
650
- onLoadFunction();
651
- }
652
- } else {
653
- document.location.href = url.absolute;
654
- }
655
- };
656
-
657
- fetchHistory = function(cachedPage) {
658
- if (xhr != null) {
659
- xhr.abort();
660
- }
661
- changePage(cachedPage.title, cachedPage.body, false);
662
- recallScrollPosition(cachedPage);
663
- return triggerEvent('page:restore');
664
- };
665
-
666
- Turbolinks.cacheCurrentPage = function() {
667
- var currentStateUrl;
668
- currentStateUrl = new ComponentUrl(currentState.url);
669
- pageCache.set(currentStateUrl.absolute, {
670
- url: currentStateUrl.relative,
671
- body: document.body,
672
- title: document.title,
673
- positionY: window.pageYOffset,
674
- positionX: window.pageXOffset,
675
- transitionCacheDisabled: document.querySelector('[data-no-transition-cache]') != null
676
- });
677
- };
678
-
679
- changePage = function(title, body, csrfToken, runScripts, partialReplace, replaceContents) {
680
- if (replaceContents == null) {
681
- replaceContents = [];
682
- }
683
- if (title) {
684
- document.title = title;
685
- }
686
- if (replaceContents.length) {
687
- return refreshNodesWithKeys(replaceContents, body);
688
- } else {
689
- deleteRefreshNeverNodes(body);
690
- triggerEvent('page:before-replace');
691
- document.documentElement.replaceChild(body, document.body);
692
- if (csrfToken != null) {
693
- CSRFToken.update(csrfToken);
694
- }
695
- if (runScripts) {
696
- executeScriptTags();
697
- }
698
- currentState = window.history.state;
699
- triggerEvent('page:change');
700
- triggerEvent('page:update');
701
- }
702
- };
703
-
704
- deleteRefreshNeverNodes = function(body) {
705
- var node, _i, _len, _ref1;
706
- _ref1 = body.querySelectorAll('[refresh-never]');
707
- for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
708
- node = _ref1[_i];
709
- node.parentNode.removeChild(node);
710
- }
711
- };
712
-
713
- refreshNodesWithKeys = function(keys, body) {
714
- var allNodesToBeRefreshed, existingNode, key, newNode, node, nodeId, parentIsRefreshing, refreshedNodes, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref1, _ref2;
715
- allNodesToBeRefreshed = [];
716
- _ref1 = document.querySelectorAll("[refresh-always]");
717
- for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
718
- node = _ref1[_i];
719
- allNodesToBeRefreshed.push(node);
720
- }
721
- for (_j = 0, _len1 = keys.length; _j < _len1; _j++) {
722
- key = keys[_j];
723
- _ref2 = document.querySelectorAll("[refresh=" + key + "]");
724
- for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) {
725
- node = _ref2[_k];
726
- allNodesToBeRefreshed.push(node);
727
- }
728
- }
729
- triggerEvent('page:before-partial-replace', allNodesToBeRefreshed);
730
- parentIsRefreshing = function(node) {
731
- var potentialParent, _l, _len3;
732
- for (_l = 0, _len3 = allNodesToBeRefreshed.length; _l < _len3; _l++) {
733
- potentialParent = allNodesToBeRefreshed[_l];
734
- if (node !== potentialParent) {
735
- if (potentialParent.contains(node)) {
736
- return true;
737
- }
738
- }
739
- }
740
- return false;
741
- };
742
- refreshedNodes = [];
743
- for (_l = 0, _len3 = allNodesToBeRefreshed.length; _l < _len3; _l++) {
744
- existingNode = allNodesToBeRefreshed[_l];
745
- if (parentIsRefreshing(existingNode)) {
746
- continue;
747
- }
748
- if (!(nodeId = existingNode.getAttribute('id'))) {
749
- throw new Error("Turbolinks refresh: Refresh key elements must have an id.");
750
- }
751
- if (newNode = body.querySelector("#" + nodeId)) {
752
- existingNode.parentNode.replaceChild(newNode, existingNode);
753
- if (newNode.nodeName === 'SCRIPT' && newNode.getAttribute("data-turbolinks-eval") !== "false") {
754
- executeScriptTag(newNode);
755
- } else {
756
- refreshedNodes.push(newNode);
757
- }
758
- } else if (existingNode.getAttribute("refresh-always") === null) {
759
- existingNode.parentNode.removeChild(existingNode);
760
- }
761
- }
762
- return refreshedNodes;
763
- };
764
-
765
- executeScriptTags = function() {
766
- var script, scripts, _i, _len, _ref1;
767
- scripts = Array.prototype.slice.call(document.body.querySelectorAll('script:not([data-turbolinks-eval="false"])'));
768
- for (_i = 0, _len = scripts.length; _i < _len; _i++) {
769
- script = scripts[_i];
770
- if ((_ref1 = script.type) === '' || _ref1 === 'text/javascript') {
771
- executeScriptTag(script);
772
- }
773
- }
774
- };
775
-
776
- executeScriptTag = function(script) {
777
- var attr, copy, nextSibling, parentNode, _i, _len, _ref1;
778
- copy = document.createElement('script');
779
- _ref1 = script.attributes;
780
- for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
781
- attr = _ref1[_i];
782
- copy.setAttribute(attr.name, attr.value);
783
- }
784
- copy.appendChild(document.createTextNode(script.innerHTML));
785
- parentNode = script.parentNode, nextSibling = script.nextSibling;
786
- parentNode.removeChild(script);
787
- parentNode.insertBefore(copy, nextSibling);
788
- };
789
-
790
- removeNoscriptTags = function(node) {
791
- node.innerHTML = node.innerHTML.replace(/<noscript[\S\s]*?<\/noscript>/ig, '');
792
- return node;
793
- };
794
-
795
- reflectNewUrl = function(url) {
796
- if ((url = new ComponentUrl(url)).absolute !== referer) {
797
- Turbolinks.pushState({
798
- turbolinks: true,
799
- url: url.absolute
800
- }, '', url.absolute);
801
- }
802
- };
803
-
804
- reflectRedirectedUrl = function(xhr) {
805
- var location, preservedHash;
806
- if (location = xhr.getResponseHeader('X-XHR-Redirected-To')) {
807
- location = new ComponentUrl(location);
808
- preservedHash = location.hasNoHash() ? document.location.hash : '';
809
- Turbolinks.replaceState(currentState, '', location.href + preservedHash);
810
- }
811
- };
812
-
813
- rememberReferer = function() {
814
- return referer = document.location.href;
815
- };
816
-
817
- Turbolinks.rememberCurrentUrl = function() {
818
- return Turbolinks.replaceState({
819
- turbolinks: true,
820
- url: document.location.href
821
- }, '', document.location.href);
822
- };
823
-
824
- Turbolinks.rememberCurrentState = function() {
825
- return currentState = window.history.state;
826
- };
827
-
828
- recallScrollPosition = function(page) {
829
- return window.scrollTo(page.positionX, page.positionY);
830
- };
831
-
832
- resetScrollPosition = function() {
833
- if (document.location.hash) {
834
- return document.location.href = document.location.href;
835
- } else {
836
- return window.scrollTo(0, 0);
837
- }
838
- };
839
-
840
- pageChangePrevented = function() {
841
- return !triggerEvent('page:before-change');
842
- };
843
-
844
- processResponse = function(xhr, partial) {
845
- var assetsChanged, changed, clientOrServerError, doc, extractTrackAssets, intersection, validContent;
846
- if (partial == null) {
847
- partial = false;
848
- }
849
- clientOrServerError = function() {
850
- var _ref1;
851
- if (xhr.status === 422) {
852
- return false;
853
- }
854
- return (400 <= (_ref1 = xhr.status) && _ref1 < 600);
855
- };
856
- validContent = function() {
857
- return xhr.getResponseHeader('Content-Type').match(/^(?:text\/html|application\/xhtml\+xml|application\/xml)(?:;|$)/);
858
- };
859
- extractTrackAssets = function(doc) {
860
- var node, _i, _len, _ref1, _results;
861
- _ref1 = doc.head.childNodes;
862
- _results = [];
863
- for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
864
- node = _ref1[_i];
865
- if ((typeof node.getAttribute === "function" ? node.getAttribute('data-turbolinks-track') : void 0) != null) {
866
- _results.push(node.getAttribute('src') || node.getAttribute('href'));
867
- }
868
- }
869
- return _results;
870
- };
871
- assetsChanged = function(doc) {
872
- var fetchedAssets;
873
- loadedAssets || (loadedAssets = extractTrackAssets(document));
874
- fetchedAssets = extractTrackAssets(doc);
875
- return fetchedAssets.length !== loadedAssets.length || intersection(fetchedAssets, loadedAssets).length !== loadedAssets.length;
876
- };
877
- intersection = function(a, b) {
878
- var value, _i, _len, _ref1, _results;
879
- if (a.length > b.length) {
880
- _ref1 = [b, a], a = _ref1[0], b = _ref1[1];
881
- }
882
- _results = [];
883
- for (_i = 0, _len = a.length; _i < _len; _i++) {
884
- value = a[_i];
885
- if (__indexOf.call(b, value) >= 0) {
886
- _results.push(value);
887
- }
888
- }
889
- return _results;
890
- };
891
- if (!clientOrServerError() && validContent()) {
892
- doc = createDocument(xhr.responseText);
893
- changed = assetsChanged(doc);
894
- if (doc && (!changed || partial)) {
895
- return doc;
896
- }
897
- }
898
- };
899
-
900
- extractTitleAndBody = function(doc) {
901
- var title;
902
- title = doc.querySelector('title');
903
- return [title != null ? title.textContent : void 0, removeNoscriptTags(doc.body), CSRFToken.get(doc).token, 'runScripts'];
904
- };
905
-
906
- installHistoryChangeHandler = function(event) {
907
- var cachedPage, _ref1;
908
- if ((_ref1 = event.state) != null ? _ref1.turbolinks : void 0) {
909
- if (cachedPage = pageCache.get((new ComponentUrl(event.state.url)).absolute)) {
910
- Turbolinks.cacheCurrentPage();
911
- return fetchHistory(cachedPage);
912
- } else {
913
- return Turbolinks.visit(event.target.location.href);
914
- }
915
- }
916
- };
917
-
918
- bypassOnLoadPopstate = function(fn) {
919
- return setTimeout(fn, 500);
920
- };
921
-
922
- browserCompatibleDocumentParser = function() {
923
- var createDocumentUsingDOM, createDocumentUsingParser, createDocumentUsingWrite, e, testDoc, _ref1;
924
- createDocumentUsingParser = function(html) {
925
- return (new DOMParser).parseFromString(html, 'text/html');
926
- };
927
- createDocumentUsingDOM = function(html) {
928
- var doc;
929
- doc = document.implementation.createHTMLDocument('');
930
- doc.documentElement.innerHTML = html;
931
- return doc;
932
- };
933
- createDocumentUsingWrite = function(html) {
934
- var doc;
935
- doc = document.implementation.createHTMLDocument('');
936
- doc.open('replace');
937
- doc.write(html);
938
- doc.close();
939
- return doc;
940
- };
941
- try {
942
- if (window.DOMParser) {
943
- testDoc = createDocumentUsingParser('<html><body><p>test');
944
- return createDocumentUsingParser;
945
- }
946
- } catch (_error) {
947
- e = _error;
948
- testDoc = createDocumentUsingDOM('<html><body><p>test');
949
- return createDocumentUsingDOM;
950
- } finally {
951
- if ((testDoc != null ? (_ref1 = testDoc.body) != null ? _ref1.childNodes.length : void 0 : void 0) !== 1) {
952
- return createDocumentUsingWrite;
953
- }
954
- }
955
- };
956
-
957
- if (browserSupportsTurbolinks) {
958
- Turbolinks.visit = fetch;
959
- Turbolinks.rememberCurrentUrl();
960
- Turbolinks.rememberCurrentState();
961
- createDocument = browserCompatibleDocumentParser();
962
- document.addEventListener('click', Click.installHandlerLast, true);
963
- bypassOnLoadPopstate(function() {
964
- return window.addEventListener('popstate', installHistoryChangeHandler, false);
965
- });
966
- } else {
967
- Turbolinks.visit = function(url) {
968
- return document.location.href = url;
969
- };
970
- }
971
-
972
- return Turbolinks;
973
-
974
- })();
975
-
976
-
977
-
978
- },{}]},{},[1,2,3,5,6,7,9,4,8]);