ajax 1.1.0 → 1.1.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/Gemfile.lock +1 -1
- data/README.rdoc +1 -0
- data/VERSION +1 -1
- data/lib/ajax/action_controller.rb +171 -160
- data/lib/ajax/action_view.rb +1 -1
- data/public/javascripts/ajax.js +3 -1
- metadata +4 -4
data/Gemfile.lock
CHANGED
data/README.rdoc
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.1.
|
1
|
+
1.1.1
|
@@ -5,7 +5,7 @@ module Ajax
|
|
5
5
|
extend MirrorMethods
|
6
6
|
include MirrorMethods
|
7
7
|
after_filter :serialize_ajax_info
|
8
|
-
include
|
8
|
+
include(Ajax.app.rails?(3) ? Rails3 : Rails2)
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
@@ -43,15 +43,11 @@ module Ajax
|
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
46
|
-
module
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
# those docs for info.
|
52
|
-
def redirect_to(url={}, status={})
|
53
|
-
super
|
54
|
-
self.location = nil if _ajax_redirect(url, status) # clear any location set by super
|
46
|
+
module Rails2
|
47
|
+
def self.included(klass)
|
48
|
+
klass.class_eval do
|
49
|
+
alias_method_chain :redirect_to_full_url, :ajax
|
50
|
+
alias_method_chain :render, :ajax
|
55
51
|
end
|
56
52
|
end
|
57
53
|
|
@@ -70,182 +66,197 @@ module Ajax
|
|
70
66
|
# redirect.
|
71
67
|
#
|
72
68
|
# This method only applies to Rails < 3
|
73
|
-
def
|
74
|
-
|
69
|
+
def redirect_to_full_url_with_ajax(url, status)
|
70
|
+
if !_ajax_redirect(url, status)
|
71
|
+
redirect_to_full_url_without_ajax(url, status)
|
72
|
+
end
|
75
73
|
end
|
76
74
|
|
77
|
-
#
|
78
|
-
#
|
79
|
-
#
|
80
|
-
def
|
81
|
-
return
|
82
|
-
|
83
|
-
special_redirect = false
|
84
|
-
original_url = url
|
75
|
+
#
|
76
|
+
# Intercept rendering to customize the headers and layout handling
|
77
|
+
#
|
78
|
+
def render_with_ajax(options = nil, extra_options = {}, &block)
|
79
|
+
return render_without_ajax(options, extra_options, &block) unless Ajax.is_enabled?
|
85
80
|
|
86
|
-
|
87
|
-
|
88
|
-
if url == request.headers["Referer"] && !request.headers['Ajax-Info'].blank?
|
89
|
-
url = request.headers['Ajax-Info']['referer']
|
90
|
-
Ajax.logger.debug("[ajax] using referer #{url} from Ajax-Info")
|
91
|
-
end
|
81
|
+
original_args = [options, extra_options]
|
82
|
+
if request.xhr?
|
92
83
|
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
84
|
+
# Options processing taken from ActionController::Base#render
|
85
|
+
if options.nil?
|
86
|
+
options = { :template => default_template, :layout => true }
|
87
|
+
elsif options == :update
|
88
|
+
options = extra_options.merge({ :update => true })
|
89
|
+
elsif options.is_a?(String) || options.is_a?(Symbol)
|
90
|
+
case options.to_s.index('/')
|
91
|
+
when 0
|
92
|
+
extra_options[:file] = options
|
93
|
+
when nil
|
94
|
+
extra_options[:action] = options
|
95
|
+
else
|
96
|
+
extra_options[:template] = options
|
106
97
|
end
|
98
|
+
options = extra_options
|
99
|
+
elsif !options.is_a?(Hash)
|
100
|
+
extra_options[:partial] = options
|
101
|
+
options = extra_options
|
107
102
|
end
|
108
103
|
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
if special_redirect
|
119
|
-
session[:redirected_to] = nil
|
120
|
-
Ajax.logger.info("[ajax] returning special redirect JS")
|
121
|
-
self.response_body = <<END
|
122
|
-
<script type="text/javascript">
|
123
|
-
var url = #{url.to_json};
|
124
|
-
var hash = document.location.hash;
|
125
|
-
|
126
|
-
// Remove leading # from the fragment
|
127
|
-
if (hash.charAt(0) == '#') {
|
128
|
-
hash = hash.substr(1);
|
129
|
-
}
|
130
|
-
|
131
|
-
// Remove leading / from the fragment if the URL already ends in a /
|
132
|
-
// This prevents double-slashes. Note we can't just replace all
|
133
|
-
// double-slashes because the protocol includes //.
|
134
|
-
if (url.charAt(url.length - 1) == '/' && hash.charAt(0) == '/') {
|
135
|
-
hash = hash.substr(1);
|
136
|
-
}
|
137
|
-
|
138
|
-
document.location.href = url + hash;
|
139
|
-
</script>
|
140
|
-
END
|
141
|
-
else
|
142
|
-
session[:redirected_to] = url
|
143
|
-
if request.xhr? && Ajax.is_hashed_url?(url)
|
144
|
-
Ajax.logger.info("[ajax] detecting we are xhr. soft redirect")
|
145
|
-
redirect_path = URI.parse(url).select(:fragment).first
|
146
|
-
Ajax.logger.info("[ajax] redirect path is #{redirect_path}")
|
147
|
-
Ajax.set_header(response, :soft_redirect, redirect_path)
|
148
|
-
self.response_body = <<END
|
149
|
-
<script type="text/javascript">
|
150
|
-
window.location.href = #{url.to_json};
|
151
|
-
</script>
|
152
|
-
END
|
153
|
-
else
|
154
|
-
Ajax.logger.info("[ajax] not detecting we are xhr. Hard redirect!")
|
155
|
-
return false
|
156
|
-
end
|
104
|
+
default = pick_layout(options)
|
105
|
+
default = default.path_without_format_and_extension unless default.nil?
|
106
|
+
ajax_layout = _layout_for_ajax(default)
|
107
|
+
ajax_layout = ajax_layout.path_without_format_and_extension unless ajax_layout.nil?
|
108
|
+
options[:layout] = ajax_layout unless ajax_layout.nil?
|
109
|
+
|
110
|
+
# Send the current layout and controller in a custom response header
|
111
|
+
Ajax.set_header(response, :layout, ajax_layout)
|
112
|
+
Ajax.set_header(response, :controller, self.class.controller_name)
|
157
113
|
end
|
158
|
-
|
114
|
+
render_without_ajax(options, extra_options, &block)
|
159
115
|
end
|
160
116
|
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
117
|
+
end
|
118
|
+
|
119
|
+
module Rails3
|
120
|
+
# Rails 3 hook. Rails < 3 is handled using redirect_to_full_url. See
|
121
|
+
# those docs for info.
|
122
|
+
def redirect_to(url={}, status={})
|
123
|
+
if !_ajax_redirect(url, status)
|
124
|
+
super
|
167
125
|
end
|
168
126
|
end
|
169
127
|
|
170
128
|
#
|
171
129
|
# Intercept rendering to customize the headers and layout handling
|
172
130
|
#
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
# Options processing taken from ActionController::Base#render
|
181
|
-
if options.nil?
|
182
|
-
options = { :template => default_template, :layout => true }
|
183
|
-
elsif options == :update
|
184
|
-
options = extra_options.merge({ :update => true })
|
185
|
-
elsif options.is_a?(String) || options.is_a?(Symbol)
|
186
|
-
case options.to_s.index('/')
|
187
|
-
when 0
|
188
|
-
extra_options[:file] = options
|
189
|
-
when nil
|
190
|
-
extra_options[:action] = options
|
191
|
-
else
|
192
|
-
extra_options[:template] = options
|
193
|
-
end
|
194
|
-
options = extra_options
|
195
|
-
elsif !options.is_a?(Hash)
|
196
|
-
extra_options[:partial] = options
|
197
|
-
options = extra_options
|
198
|
-
end
|
131
|
+
def render_to_body(options = {})
|
132
|
+
return super if !request.xhr? || !Ajax.is_enabled?
|
133
|
+
_process_options(options)
|
134
|
+
|
135
|
+
if ajax_layout = _layout_for_ajax(options[:layout])
|
136
|
+
options[:layout] = ajax_layout.virtual_path
|
137
|
+
end
|
199
138
|
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
139
|
+
# Send the current layout and controller in a custom response header
|
140
|
+
Ajax.set_header(response, :layout, options[:layout])
|
141
|
+
Ajax.set_header(response, :controller, self.class.controller_name)
|
142
|
+
|
143
|
+
_render_template(options)
|
144
|
+
end
|
145
|
+
end
|
205
146
|
|
206
|
-
|
207
|
-
|
208
|
-
|
147
|
+
protected
|
148
|
+
|
149
|
+
# Convert the Ajax-Info hash to JSON before the request is sent.
|
150
|
+
# Invoked as an after filter.
|
151
|
+
def serialize_ajax_info
|
152
|
+
case response.headers['Ajax-Info']
|
153
|
+
when Hash
|
154
|
+
response.headers['Ajax-Info'] = response.headers['Ajax-Info'].to_json
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
# Perform special processing on the response if we need to.
|
159
|
+
# Return true if an Ajax "redirect" was performed, and false
|
160
|
+
# otherwise.
|
161
|
+
def _ajax_redirect(url, status)
|
162
|
+
return false unless Ajax.is_enabled?
|
163
|
+
special_redirect = false
|
164
|
+
original_url = url
|
165
|
+
|
166
|
+
# If we have the full referrer in Ajax-Info, use that because it
|
167
|
+
# includes the fragment.
|
168
|
+
if url == request.headers["Referer"] && !request.headers['Ajax-Info'].blank?
|
169
|
+
url = request.headers['Ajax-Info']['referer']
|
170
|
+
Ajax.logger.debug("[ajax] using referer #{url} from Ajax-Info")
|
171
|
+
end
|
172
|
+
|
173
|
+
if !Ajax.exclude_path?(url)
|
174
|
+
# Never redirect to the Ajax framework path, redirect to /
|
175
|
+
if url =~ %r[#{Ajax.framework_path}]
|
176
|
+
url = url.sub(%r[#{Ajax.framework_path}], '/')
|
177
|
+
|
178
|
+
# Special case:
|
179
|
+
#
|
180
|
+
# Changing protocol forces a redirect from root to root.
|
181
|
+
# The full request URL (including the hashed part) is
|
182
|
+
# in the browser. So return JS to do the redirect and
|
183
|
+
# have it include the hashed part in the redirect URL.
|
184
|
+
if !request.xhr? && URI.parse(url).scheme != URI.parse(request.url).scheme
|
185
|
+
special_redirect = true
|
209
186
|
end
|
210
|
-
super(options, extra_options, &block)
|
211
187
|
end
|
212
|
-
else
|
213
|
-
def render_to_body(options = {})
|
214
|
-
return super if !request.xhr? || !Ajax.is_enabled?
|
215
|
-
_process_options(options)
|
216
188
|
|
217
|
-
|
218
|
-
|
219
|
-
|
189
|
+
if !Ajax.is_hashed_url?(url) and !Ajax.is_robot?(request.user_agent)
|
190
|
+
url = Ajax.hashed_url_from_traditional(url)
|
191
|
+
end
|
192
|
+
end
|
193
|
+
Ajax.logger.info("[ajax] rewrote redirect from #{original_url} to #{url}") unless original_url == url
|
220
194
|
|
221
|
-
|
222
|
-
|
223
|
-
|
195
|
+
# Don't store session[:redirected_to] if doing a special redirect otherwise
|
196
|
+
# when the next request for root comes in it will think we really want
|
197
|
+
# to display the home page.
|
198
|
+
if special_redirect
|
199
|
+
session[:redirected_to] = nil
|
200
|
+
Ajax.logger.info("[ajax] returning special redirect JS")
|
201
|
+
render :layout => false, :text => <<-END
|
202
|
+
<script type="text/javascript">
|
203
|
+
var url = #{url.to_json};
|
204
|
+
var hash = document.location.hash;
|
224
205
|
|
225
|
-
|
206
|
+
// Remove leading # from the fragment
|
207
|
+
if (hash.charAt(0) == '#') {
|
208
|
+
hash = hash.substr(1);
|
209
|
+
}
|
210
|
+
|
211
|
+
// Remove leading / from the fragment if the URL already ends in a /
|
212
|
+
// This prevents double-slashes. Note we can't just replace all
|
213
|
+
// double-slashes because the protocol includes //.
|
214
|
+
if (url.charAt(url.length - 1) == '/' && hash.charAt(0) == '/') {
|
215
|
+
hash = hash.substr(1);
|
216
|
+
}
|
217
|
+
|
218
|
+
document.location.href = url + hash;
|
219
|
+
</script>
|
220
|
+
END
|
221
|
+
else
|
222
|
+
session[:redirected_to] = url
|
223
|
+
if request.xhr? && Ajax.is_hashed_url?(url)
|
224
|
+
Ajax.logger.info("[ajax] detecting we are xhr. soft redirect")
|
225
|
+
redirect_path = URI.parse(url).select(:fragment).first
|
226
|
+
Ajax.logger.info("[ajax] redirect path is #{redirect_path}")
|
227
|
+
Ajax.set_header(response, :soft_redirect, redirect_path)
|
228
|
+
render :layout => false, :text => <<-END
|
229
|
+
<script type="text/javascript">
|
230
|
+
window.location.href = #{url.to_json};
|
231
|
+
</script>
|
232
|
+
END
|
233
|
+
else
|
234
|
+
Ajax.logger.info("[ajax] not detecting we are xhr. Hard redirect!")
|
235
|
+
return false
|
226
236
|
end
|
227
237
|
end
|
238
|
+
true
|
239
|
+
end
|
228
240
|
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
end
|
241
|
+
# Return the layout to use for an AJAX request, or nil if the default should be used.
|
242
|
+
#
|
243
|
+
# If no ajax_layout is set, look for the default layout in <tt>layouts/ajax</tt>.
|
244
|
+
# If the layout cannot be found, use the default.
|
245
|
+
def _layout_for_ajax(default) #:nodoc:
|
246
|
+
ajax_layout = self.class.read_inheritable_attribute(:ajax_layout)
|
247
|
+
ajax_layout = if ajax_layout.nil? && default.nil?
|
248
|
+
nil
|
249
|
+
elsif ajax_layout.nil? && !default.nil? # look for one with the default name in layouts/ajax
|
250
|
+
"layouts/ajax/#{default.sub(/layouts(\/)?/, '')}"
|
251
|
+
elsif ajax_layout && !(ajax_layout =~ /^layouts\/ajax/) # look for it in layouts/ajax
|
252
|
+
"layouts/ajax/#{ajax_layout}"
|
253
|
+
else # look as is
|
254
|
+
ajax_layout
|
255
|
+
end
|
256
|
+
Ajax.app.rails?(3) ? find_template(ajax_layout) : find_layout(ajax_layout, 'html') if !ajax_layout.nil?
|
257
|
+
rescue ::ActionView::MissingTemplate
|
258
|
+
Ajax.logger.info("[ajax] no layout found in layouts/ajax. Using #{default}.")
|
259
|
+
nil
|
249
260
|
end
|
250
261
|
end
|
251
262
|
end
|
data/lib/ajax/action_view.rb
CHANGED
data/public/javascripts/ajax.js
CHANGED
@@ -448,7 +448,9 @@ var Ajax = function(options) {
|
|
448
448
|
*/
|
449
449
|
self.abortCurrentRequest = function() {
|
450
450
|
try {
|
451
|
-
|
451
|
+
if (self.current_request.url) {
|
452
|
+
console.log('[ajax] aborting current request for url ' + self.current_request.url);
|
453
|
+
}
|
452
454
|
self.current_request.abort();
|
453
455
|
} catch(e) {
|
454
456
|
console.log('[ajax] abort failed!', e);
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ajax
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 17
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 1.1.
|
9
|
+
- 1
|
10
|
+
version: 1.1.1
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Karl Varga
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-04-
|
18
|
+
date: 2011-04-27 00:00:00 -07:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|