ajax 0.1.7 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|