ajax 0.1.7 → 1.0.1
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.
- data/Rakefile +14 -6
- data/VERSION +1 -1
- data/lib/ajax/action_controller.rb +11 -2
- data/lib/ajax/helpers/request_helper.rb +11 -2
- data/lib/ajax/helpers/url_helper.rb +11 -2
- data/lib/rack-ajax.rb +4 -1
- data/lib/rack-ajax/decision_tree.rb +0 -1
- data/public/javascripts/ajax.js +80 -20
- metadata +3 -3
data/Rakefile
CHANGED
@@ -48,10 +48,18 @@ Rake::RDocTask.new(:rdoc) do |rdoc|
|
|
48
48
|
rdoc.rdoc_files.include('app/**/*.rb')
|
49
49
|
end
|
50
50
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
51
|
+
namespace :release do
|
52
|
+
|
53
|
+
desc "Release a new patch version"
|
54
|
+
task :patch do
|
55
|
+
Rake::Task['version:bump:patch'].invoke
|
56
|
+
Rake::Task['release:current'].invoke
|
57
|
+
end
|
58
|
+
|
59
|
+
desc "Release the current version (e.g. after a version bump). This rebuilds the gemspec, pushes the updated code, tags it and releases to RubyGems"
|
60
|
+
task :current do
|
61
|
+
Rake::Task['github:release'].invoke
|
62
|
+
Rake::Task['git:release'].invoke
|
63
|
+
Rake::Task['gemcutter:release'].invoke
|
64
|
+
end
|
57
65
|
end
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1
|
1
|
+
1.0.1
|
@@ -95,7 +95,7 @@ module Ajax
|
|
95
95
|
url = Ajax.hashed_url_from_traditional(url)
|
96
96
|
end
|
97
97
|
end
|
98
|
-
Ajax.logger.info("[ajax] rewrote redirect from #{original_url} to #{url}")
|
98
|
+
Ajax.logger.info("[ajax] rewrote redirect from #{original_url} to #{url}") unless original_url == url
|
99
99
|
|
100
100
|
# Don't store session[:redirected_to] if doing a special redirect otherwise
|
101
101
|
# when the next request for root comes in it will think we really want
|
@@ -107,8 +107,17 @@ module Ajax
|
|
107
107
|
else
|
108
108
|
session[:redirected_to] = url
|
109
109
|
if request.xhr?
|
110
|
-
|
110
|
+
Ajax.logger.info("[ajax] detecting we are xhr. soft redirect")
|
111
|
+
redirect_path = URI.parse(url).select(:fragment).first
|
112
|
+
Ajax.logger.info("[ajax] redirect path is #{redirect_path}")
|
113
|
+
Ajax.set_header(response, :soft_redirect, redirect_path)
|
114
|
+
render :text => <<-END
|
115
|
+
<script type="text/javascript">
|
116
|
+
window.location.href = #{url.to_json};
|
117
|
+
</script>
|
118
|
+
END
|
111
119
|
else
|
120
|
+
Ajax.logger.info("[ajax] not detecting we are xhr. Hard redirect!")
|
112
121
|
redirect_to_full_url_without_ajax(url, status)
|
113
122
|
end
|
114
123
|
end
|
@@ -85,16 +85,25 @@ module Ajax
|
|
85
85
|
#
|
86
86
|
# The string and regex paths are modified to match full URLs by prepending
|
87
87
|
# them with the appropriate regular expression.
|
88
|
-
def exclude_paths(paths=nil)
|
88
|
+
def exclude_paths(paths=nil, expand = true)
|
89
89
|
if !instance_variable_defined?(:@exclude_paths)
|
90
90
|
@exclude_paths = []
|
91
91
|
end
|
92
92
|
(paths || []).each do |path|
|
93
|
-
|
93
|
+
if expand
|
94
|
+
@exclude_paths << /^(\w+\:\/\/[^\/]+\/?)?#{path.to_s}$/
|
95
|
+
else
|
96
|
+
@exclude_paths << path
|
97
|
+
end
|
94
98
|
end
|
95
99
|
@exclude_paths
|
96
100
|
end
|
97
101
|
|
102
|
+
# Directly set regexes for one or more paths that can be accessed directly without the AJAX framework.
|
103
|
+
def exclude_regex(exclude_regex=nil)
|
104
|
+
exclude_paths(exclude_regex, false)
|
105
|
+
end
|
106
|
+
|
98
107
|
# Return a boolean indicating whether or not to exclude a path from the
|
99
108
|
# AJAX redirect.
|
100
109
|
def exclude_path?(path)
|
@@ -36,9 +36,18 @@ module Ajax
|
|
36
36
|
protected
|
37
37
|
|
38
38
|
def encode_and_parse_url(url)
|
39
|
-
|
39
|
+
if already_encoded?(url)
|
40
|
+
res = URI.parse(url.gsub("%23", "#")) rescue URI.parse('/')
|
41
|
+
else
|
42
|
+
res = URI.parse(URI.encode(url).gsub("%23", "#")) rescue URI.parse('/')
|
43
|
+
end
|
44
|
+
res
|
40
45
|
end
|
41
|
-
|
46
|
+
|
47
|
+
def already_encoded?(url)
|
48
|
+
URI.decode(url) != url rescue true
|
49
|
+
end
|
50
|
+
|
42
51
|
def url_host(url)
|
43
52
|
if url.match(/^(\w+\:\/\/[^\/]+)\/?/)
|
44
53
|
$1
|
data/lib/rack-ajax.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
require 'rack-ajax/decision_tree'
|
2
2
|
require 'rack-ajax/parser'
|
3
3
|
require 'json'
|
4
|
+
require 'yaml'
|
5
|
+
require 'yaml/encoding' unless RUBY_VERSION.to_f == 1.9
|
4
6
|
|
5
7
|
module Rack
|
6
8
|
class Ajax
|
@@ -34,6 +36,7 @@ module Rack
|
|
34
36
|
@parser = Parser.new(env)
|
35
37
|
rack_response = @parser.instance_eval(&@decision_tree)
|
36
38
|
|
39
|
+
|
37
40
|
# Clear the value of session[:redirected_to]
|
38
41
|
unless env['rack.session'].nil?
|
39
42
|
env['rack.session']['redirected_to'] = env['rack.session'][:redirected_to] = nil
|
@@ -49,7 +52,7 @@ module Rack
|
|
49
52
|
# The Ajax::Spec::Helpers module includes a helper
|
50
53
|
# method to test the result of a rewrite.
|
51
54
|
if ::Ajax.is_mocked?
|
52
|
-
rack_response.nil? ? Rack::Ajax::Parser.rack_response(env.to_yaml) : rack_response
|
55
|
+
rack_response.nil? ? Rack::Ajax::Parser.rack_response(env.to_yaml(:Encoding => :Utf8)) : rack_response
|
53
56
|
elsif !rack_response.nil?
|
54
57
|
rack_response
|
55
58
|
else
|
@@ -15,7 +15,6 @@ module Rack
|
|
15
15
|
# completeness.
|
16
16
|
def default_decision_tree
|
17
17
|
@@default_decision_tree ||= Proc.new do
|
18
|
-
::Ajax.logger.debug("[ajax] rack session #{@env['rack.session'].inspect}")
|
19
18
|
::Ajax.logger.debug("[ajax] Ajax-Info #{@env['Ajax-Info'].inspect}")
|
20
19
|
|
21
20
|
if !::Ajax.exclude_path?(@env['PATH_INFO'] || @env['REQUEST_URI'])
|
data/public/javascripts/ajax.js
CHANGED
@@ -330,6 +330,7 @@ var Ajax = function(options) {
|
|
330
330
|
self.addressChanged = function() {
|
331
331
|
if (document.location.pathname != '/') { return false; }
|
332
332
|
if (self.disable_next_address_intercept) {
|
333
|
+
console.log('skipping address intercept & resetting disable_next_address_intercept')
|
333
334
|
self.disable_next_address_intercept = false;
|
334
335
|
return false;
|
335
336
|
}
|
@@ -341,18 +342,21 @@ var Ajax = function(options) {
|
|
341
342
|
// Ensure that the URL ends with '#' if we are on root. This
|
342
343
|
// will not trigger addressChanged().
|
343
344
|
if (document.location.pathname == '/'
|
344
|
-
|
345
|
+
&& document.location.href.indexOf('#') == -1) {
|
345
346
|
document.location.href = document.location.href + '#';
|
346
347
|
}
|
347
348
|
|
348
349
|
// Clean up the URL before making the request. If the URL changes
|
349
350
|
// as a result of this, update it, which will trigger this
|
350
351
|
// callback again.
|
351
|
-
|
352
|
+
console.log('cleaning up the url');
|
353
|
+
var url = ($.address.value()).replace(/\/\//, '/');
|
352
354
|
if (url != $.address.value()) {
|
355
|
+
console.log('reloading because encoded uri ' + url + ' differs from current uri ' + $.address.value());
|
353
356
|
$.address.value(url);
|
354
357
|
return false;
|
355
358
|
} else {
|
359
|
+
console.log('going ahead with load');
|
356
360
|
self.loadPage({
|
357
361
|
url: url
|
358
362
|
});
|
@@ -380,21 +384,29 @@ var Ajax = function(options) {
|
|
380
384
|
document.location.href = options.url;
|
381
385
|
return true;
|
382
386
|
}
|
387
|
+
|
388
|
+
if (options.url === undefined) {
|
389
|
+
console.log('[ajax] no url supplied ');
|
390
|
+
return false;
|
391
|
+
};
|
392
|
+
|
383
393
|
self.loaded = false;
|
384
394
|
self.showLoadingImage();
|
395
|
+
console.log('[ajax] loadPage ' + options.url);
|
385
396
|
|
386
397
|
if (self.current_request !== undefined) {
|
387
|
-
|
388
|
-
self.current_request.abort();
|
389
|
-
console.log('[ajax] aborting current request');
|
390
|
-
} catch(e) {
|
391
|
-
console.log('[ajax] abort failed!', e);
|
392
|
-
}
|
398
|
+
self.abortCurrentRequest();
|
393
399
|
}
|
394
400
|
|
401
|
+
if ($.browser.msie) {
|
402
|
+
safe_url = encodeURI(options.url);
|
403
|
+
} else {
|
404
|
+
safe_url = options.url;
|
405
|
+
};
|
406
|
+
|
395
407
|
self.current_request = jQuery.ajax({
|
396
408
|
cache: false,
|
397
|
-
url:
|
409
|
+
url: safe_url,
|
398
410
|
method: options.method || 'GET',
|
399
411
|
beforeSend: self.setRequestHeaders,
|
400
412
|
success: self.responseHandler,
|
@@ -413,6 +425,21 @@ var Ajax = function(options) {
|
|
413
425
|
});
|
414
426
|
};
|
415
427
|
|
428
|
+
|
429
|
+
/**
|
430
|
+
* abortCurrentRequest
|
431
|
+
*
|
432
|
+
* Abort the current ajax request
|
433
|
+
*/
|
434
|
+
self.abortCurrentRequest = function() {
|
435
|
+
try {
|
436
|
+
console.log('[ajax] aborting current request for url ' + self.current_request.url);
|
437
|
+
self.current_request.abort();
|
438
|
+
} catch(e) {
|
439
|
+
console.log('[ajax] abort failed!', e);
|
440
|
+
};
|
441
|
+
};
|
442
|
+
|
416
443
|
/**
|
417
444
|
* setRequestHeaders
|
418
445
|
*
|
@@ -447,16 +474,42 @@ var Ajax = function(options) {
|
|
447
474
|
*
|
448
475
|
*/
|
449
476
|
self.linkClicked = function(event) {
|
477
|
+
// The deep link must be a path. A full URL shouldn't have
|
478
|
+
// made it through, but sometimes it can happen. In this
|
479
|
+
// case, strip off the host and protocol.
|
480
|
+
if ($(this).attr('href') == '#') return false;
|
481
|
+
ajax_url = $(this).attr('data-deep-link');
|
482
|
+
if (ajax_url.match(/^https?:\/\//)) {
|
483
|
+
ajax_url = ajax_url.replace(/(https?:\/\/[^\/]*\/(.*))/, '$2');
|
484
|
+
}
|
450
485
|
if (document.location.pathname != '/') {
|
451
|
-
var url = ('/#/' +
|
486
|
+
var url = ('/#/' + ajax_url).replace(/\/\//, '/');
|
487
|
+
console.log('linkClicked 1: going to ' + url);
|
452
488
|
document.location.href = url;
|
453
489
|
} else {
|
454
490
|
self.last_click_coords = { pageX: event.pageX, pageY: event.pageY };
|
455
|
-
|
491
|
+
encoded_url = ajax.safeURL(ajax_url);
|
492
|
+
console.log('linkClicked 2: going to ' + ajax_url);
|
493
|
+
console.log('untouched url is ' + ajax_url + ', encoded is ' + encoded_url);
|
494
|
+
if ($.browser.msie) {
|
495
|
+
$.address.value(encoded_url);
|
496
|
+
}
|
497
|
+
else {
|
498
|
+
$.address.value(ajax_url);
|
499
|
+
}
|
456
500
|
}
|
457
501
|
return false;
|
458
502
|
};
|
459
503
|
|
504
|
+
self.safeURL = function(url) {
|
505
|
+
if (decodeURI(url)==url) {
|
506
|
+
encoded_url = encodeURI(url);
|
507
|
+
} else {
|
508
|
+
encoded_url = url;
|
509
|
+
};
|
510
|
+
return encoded_url;
|
511
|
+
};
|
512
|
+
|
460
513
|
/**
|
461
514
|
* responseHandler
|
462
515
|
*
|
@@ -466,17 +519,19 @@ var Ajax = function(options) {
|
|
466
519
|
*/
|
467
520
|
self.responseHandler = function(responseText, textStatus, XMLHttpRequest) {
|
468
521
|
var data = self.processResponseHeaders(XMLHttpRequest);
|
469
|
-
var container = data.container === undefined ? $(self.default_container) : $(data.container);
|
470
522
|
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
return
|
475
|
-
}
|
523
|
+
if (data.soft_redirect !== undefined) {
|
524
|
+
console.log('**** data.soft_redirect is ' + data.soft_redirect)
|
525
|
+
$.address.value(data.soft_redirect);
|
526
|
+
return false;
|
527
|
+
};
|
476
528
|
|
529
|
+
var container = data.container === undefined ? $(self.default_container) : $(data.container);
|
477
530
|
/**
|
478
|
-
*
|
479
|
-
|
531
|
+
* Full page response. The best we can do is to extract the body
|
532
|
+
* and display that. Additionally, if the container to update
|
533
|
+
* is present in the response, just use that.
|
534
|
+
*/
|
480
535
|
if (responseText.search(/<\s*body[^>]*>/) != -1) {
|
481
536
|
var start = responseText.search(/<\s*body[^>]*>/);
|
482
537
|
start += responseText.match(/<\s*body[^>]*>/)[0].length;
|
@@ -484,6 +539,11 @@ var Ajax = function(options) {
|
|
484
539
|
|
485
540
|
console.log('Extracting body ['+start+'..'+end+'] chars');
|
486
541
|
responseText = responseText.substr(start, end - start);
|
542
|
+
|
543
|
+
var body = $(responseText);
|
544
|
+
if (body.size() > 0 && body.find(container.selector).size() > 0) {
|
545
|
+
responseText = body.find(container.selector).html();
|
546
|
+
}
|
487
547
|
}
|
488
548
|
|
489
549
|
// Handle special header instructions
|
@@ -724,7 +784,7 @@ var Ajax = function(options) {
|
|
724
784
|
};
|
725
785
|
|
726
786
|
self.teaser = function(callback) {
|
727
|
-
return new String(callback).slice(0,
|
787
|
+
return new String(callback).slice(0,200).replace(/\n/g, ' ');
|
728
788
|
};
|
729
789
|
|
730
790
|
/**
|
metadata
CHANGED
@@ -3,10 +3,10 @@ name: ajax
|
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
|
+
- 1
|
6
7
|
- 0
|
7
8
|
- 1
|
8
|
-
|
9
|
-
version: 0.1.7
|
9
|
+
version: 1.0.1
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Karl Varga
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-
|
17
|
+
date: 2010-07-15 00:00:00 -07:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|