root / ui / static / snf / js / tests / jquery.mockjax.js @ 859a4609
History | View | Annotate | Download (11.7 kB)
1 | 8d08f18a | Kostas Papadimitriou | /*!
|
---|---|---|---|
2 | 8d08f18a | Kostas Papadimitriou | * MockJax - jQuery Plugin to Mock Ajax requests
|
3 | 8d08f18a | Kostas Papadimitriou | *
|
4 | 8d08f18a | Kostas Papadimitriou | * Version: 1.4.0
|
5 | 8d08f18a | Kostas Papadimitriou | * Released: 2011-02-04
|
6 | 8d08f18a | Kostas Papadimitriou | * Source: http://github.com/appendto/jquery-mockjax
|
7 | 8d08f18a | Kostas Papadimitriou | * Docs: http://enterprisejquery.com/2010/07/mock-your-ajax-requests-with-mockjax-for-rapid-development
|
8 | 8d08f18a | Kostas Papadimitriou | * Plugin: mockjax
|
9 | 8d08f18a | Kostas Papadimitriou | * Author: Jonathan Sharp (http://jdsharp.com)
|
10 | 8d08f18a | Kostas Papadimitriou | * License: MIT,GPL
|
11 | 8d08f18a | Kostas Papadimitriou | *
|
12 | 8d08f18a | Kostas Papadimitriou | * Copyright (c) 2010 appendTo LLC.
|
13 | 8d08f18a | Kostas Papadimitriou | * Dual licensed under the MIT or GPL licenses.
|
14 | 8d08f18a | Kostas Papadimitriou | * http://appendto.com/open-source-licenses
|
15 | 8d08f18a | Kostas Papadimitriou | */
|
16 | 8d08f18a | Kostas Papadimitriou | (function($) { |
17 | 8d08f18a | Kostas Papadimitriou | var _ajax = $.ajax, |
18 | 8d08f18a | Kostas Papadimitriou | mockHandlers = []; |
19 | 8d08f18a | Kostas Papadimitriou | |
20 | 8d08f18a | Kostas Papadimitriou | function parseXML(xml) { |
21 | 8d08f18a | Kostas Papadimitriou | if ( window['DOMParser'] == undefined && window.ActiveXObject ) { |
22 | 8d08f18a | Kostas Papadimitriou | DOMParser = function() { }; |
23 | 8d08f18a | Kostas Papadimitriou | DOMParser.prototype.parseFromString = function( xmlString ) { |
24 | 8d08f18a | Kostas Papadimitriou | var doc = new ActiveXObject('Microsoft.XMLDOM'); |
25 | 8d08f18a | Kostas Papadimitriou | doc.async = 'false';
|
26 | 8d08f18a | Kostas Papadimitriou | doc.loadXML( xmlString ); |
27 | 8d08f18a | Kostas Papadimitriou | return doc;
|
28 | 8d08f18a | Kostas Papadimitriou | }; |
29 | 8d08f18a | Kostas Papadimitriou | } |
30 | 8d08f18a | Kostas Papadimitriou | |
31 | 8d08f18a | Kostas Papadimitriou | try {
|
32 | 8d08f18a | Kostas Papadimitriou | var xmlDoc = ( new DOMParser() ).parseFromString( xml, 'text/xml' ); |
33 | 8d08f18a | Kostas Papadimitriou | if ( $.isXMLDoc( xmlDoc ) ) { |
34 | 8d08f18a | Kostas Papadimitriou | var err = $('parsererror', xmlDoc); |
35 | 8d08f18a | Kostas Papadimitriou | if ( err.length == 1 ) { |
36 | 8d08f18a | Kostas Papadimitriou | throw('Error: ' + $(xmlDoc).text() ); |
37 | 8d08f18a | Kostas Papadimitriou | } |
38 | 8d08f18a | Kostas Papadimitriou | } else {
|
39 | 8d08f18a | Kostas Papadimitriou | throw('Unable to parse XML'); |
40 | 8d08f18a | Kostas Papadimitriou | } |
41 | 8d08f18a | Kostas Papadimitriou | } catch( e ) {
|
42 | 8d08f18a | Kostas Papadimitriou | var msg = ( e.name == undefined ? e : e.name + ': ' + e.message ); |
43 | 8d08f18a | Kostas Papadimitriou | $(document).trigger('xmlParseError', [ msg ]); |
44 | 8d08f18a | Kostas Papadimitriou | return undefined; |
45 | 8d08f18a | Kostas Papadimitriou | } |
46 | 8d08f18a | Kostas Papadimitriou | return xmlDoc;
|
47 | 8d08f18a | Kostas Papadimitriou | } |
48 | 8d08f18a | Kostas Papadimitriou | |
49 | 8d08f18a | Kostas Papadimitriou | $.extend({
|
50 | 8d08f18a | Kostas Papadimitriou | ajax: function(origSettings) { |
51 | 8d08f18a | Kostas Papadimitriou | var s = jQuery.extend(true, {}, jQuery.ajaxSettings, origSettings), |
52 | 8d08f18a | Kostas Papadimitriou | mock = false;
|
53 | 8d08f18a | Kostas Papadimitriou | // Iterate over our mock handlers (in registration order) until we find
|
54 | 8d08f18a | Kostas Papadimitriou | // one that is willing to intercept the request
|
55 | 8d08f18a | Kostas Papadimitriou | $.each(mockHandlers, function(k, v) { |
56 | 8d08f18a | Kostas Papadimitriou | if ( !mockHandlers[k] ) {
|
57 | 8d08f18a | Kostas Papadimitriou | return;
|
58 | 8d08f18a | Kostas Papadimitriou | } |
59 | 8d08f18a | Kostas Papadimitriou | var m = null; |
60 | 8d08f18a | Kostas Papadimitriou | // If the mock was registered with a function, let the function decide if we
|
61 | 8d08f18a | Kostas Papadimitriou | // want to mock this request
|
62 | 8d08f18a | Kostas Papadimitriou | if ( $.isFunction(mockHandlers[k]) ) { |
63 | 8d08f18a | Kostas Papadimitriou | m = mockHandlers[k](s); |
64 | 8d08f18a | Kostas Papadimitriou | } else {
|
65 | 8d08f18a | Kostas Papadimitriou | m = mockHandlers[k]; |
66 | 8d08f18a | Kostas Papadimitriou | // Inspect the URL of the request and check if the mock handler's url
|
67 | 8d08f18a | Kostas Papadimitriou | // matches the url for this ajax request
|
68 | 8d08f18a | Kostas Papadimitriou | if ( $.isFunction(m.url.test) ) { |
69 | 8d08f18a | Kostas Papadimitriou | // The user provided a regex for the url, test it
|
70 | 8d08f18a | Kostas Papadimitriou | if ( !m.url.test( s.url ) ) {
|
71 | 8d08f18a | Kostas Papadimitriou | m = null;
|
72 | 8d08f18a | Kostas Papadimitriou | } |
73 | 8d08f18a | Kostas Papadimitriou | } else {
|
74 | 8d08f18a | Kostas Papadimitriou | // Look for a simple wildcard '*' or a direct URL match
|
75 | 8d08f18a | Kostas Papadimitriou | var star = m.url.indexOf('*'); |
76 | 8d08f18a | Kostas Papadimitriou | if ( ( m.url != '*' && m.url != s.url && star == -1 ) || |
77 | 8d08f18a | Kostas Papadimitriou | ( star > -1 && m.url.substr(0, star) != s.url.substr(0, star) ) ) { |
78 | 8d08f18a | Kostas Papadimitriou | // The url we tested did not match the wildcard *
|
79 | 8d08f18a | Kostas Papadimitriou | m = null;
|
80 | 8d08f18a | Kostas Papadimitriou | } |
81 | 8d08f18a | Kostas Papadimitriou | } |
82 | 8d08f18a | Kostas Papadimitriou | if ( m ) {
|
83 | 8d08f18a | Kostas Papadimitriou | // Inspect the data submitted in the request (either POST body or GET query string)
|
84 | 8d08f18a | Kostas Papadimitriou | if ( m.data && s.data ) {
|
85 | 8d08f18a | Kostas Papadimitriou | var identical = false; |
86 | 8d08f18a | Kostas Papadimitriou | // Deep inspect the identity of the objects
|
87 | 8d08f18a | Kostas Papadimitriou | (function ident(mock, live) { |
88 | 8d08f18a | Kostas Papadimitriou | // Test for situations where the data is a querystring (not an object)
|
89 | 8d08f18a | Kostas Papadimitriou | if (typeof live === 'string') { |
90 | 8d08f18a | Kostas Papadimitriou | // Querystring may be a regex
|
91 | 8d08f18a | Kostas Papadimitriou | identical = $.isFunction( mock.test ) ? mock.test(live) : mock == live;
|
92 | 8d08f18a | Kostas Papadimitriou | return identical;
|
93 | 8d08f18a | Kostas Papadimitriou | } |
94 | 8d08f18a | Kostas Papadimitriou | $.each(mock, function(k, v) { |
95 | 8d08f18a | Kostas Papadimitriou | if ( live[k] === undefined ) { |
96 | 8d08f18a | Kostas Papadimitriou | identical = false;
|
97 | 8d08f18a | Kostas Papadimitriou | return false; |
98 | 8d08f18a | Kostas Papadimitriou | } else {
|
99 | 8d08f18a | Kostas Papadimitriou | identical = true;
|
100 | 8d08f18a | Kostas Papadimitriou | if ( typeof live[k] == 'object' ) { |
101 | 8d08f18a | Kostas Papadimitriou | return ident(mock[k], live[k]);
|
102 | 8d08f18a | Kostas Papadimitriou | } else {
|
103 | 8d08f18a | Kostas Papadimitriou | if ( $.isFunction( mock[k].test ) ) { |
104 | 8d08f18a | Kostas Papadimitriou | identical = mock[k].test(live[k]); |
105 | 8d08f18a | Kostas Papadimitriou | } else {
|
106 | 8d08f18a | Kostas Papadimitriou | identical = ( mock[k] == live[k] ); |
107 | 8d08f18a | Kostas Papadimitriou | } |
108 | 8d08f18a | Kostas Papadimitriou | return identical;
|
109 | 8d08f18a | Kostas Papadimitriou | } |
110 | 8d08f18a | Kostas Papadimitriou | } |
111 | 8d08f18a | Kostas Papadimitriou | }); |
112 | 8d08f18a | Kostas Papadimitriou | })(m.data, s.data); |
113 | 8d08f18a | Kostas Papadimitriou | // They're not identical, do not mock this request
|
114 | 8d08f18a | Kostas Papadimitriou | if ( identical == false ) { |
115 | 8d08f18a | Kostas Papadimitriou | m = null;
|
116 | 8d08f18a | Kostas Papadimitriou | } |
117 | 8d08f18a | Kostas Papadimitriou | } |
118 | 8d08f18a | Kostas Papadimitriou | // Inspect the request type
|
119 | 8d08f18a | Kostas Papadimitriou | if ( m && m.type && m.type != s.type ) {
|
120 | 8d08f18a | Kostas Papadimitriou | // The request type doesn't match (GET vs. POST)
|
121 | 8d08f18a | Kostas Papadimitriou | m = null;
|
122 | 8d08f18a | Kostas Papadimitriou | } |
123 | 8d08f18a | Kostas Papadimitriou | } |
124 | 8d08f18a | Kostas Papadimitriou | } |
125 | 8d08f18a | Kostas Papadimitriou | if ( m ) {
|
126 | 8d08f18a | Kostas Papadimitriou | mock = true;
|
127 | 8d08f18a | Kostas Papadimitriou | |
128 | 8d08f18a | Kostas Papadimitriou | // Handle console logging
|
129 | 8d08f18a | Kostas Papadimitriou | var c = $.extend({}, $.mockjaxSettings, m); |
130 | 8d08f18a | Kostas Papadimitriou | if ( c.log && $.isFunction(c.log) ) { |
131 | 8d08f18a | Kostas Papadimitriou | c.log('MOCK ' + s.type.toUpperCase() + ': ' + s.url, $.extend({}, s)); |
132 | 8d08f18a | Kostas Papadimitriou | } |
133 | 8d08f18a | Kostas Papadimitriou | |
134 | 8d08f18a | Kostas Papadimitriou | var jsre = /=\?(&|$)/, jsc = (new Date()).getTime(); |
135 | 8d08f18a | Kostas Papadimitriou | |
136 | 8d08f18a | Kostas Papadimitriou | // Handle JSONP Parameter Callbacks, we need to replicate some of the jQuery core here
|
137 | 8d08f18a | Kostas Papadimitriou | // because there isn't an easy hook for the cross domain script tag of jsonp
|
138 | 8d08f18a | Kostas Papadimitriou | if ( s.dataType === "jsonp" ) { |
139 | 8d08f18a | Kostas Papadimitriou | if ( s.type.toUpperCase() === "GET" ) { |
140 | 8d08f18a | Kostas Papadimitriou | if ( !jsre.test( s.url ) ) {
|
141 | 8d08f18a | Kostas Papadimitriou | s.url += (rquery.test( s.url ) ? "&" : "?") + (s.jsonp || "callback") + "=?"; |
142 | 8d08f18a | Kostas Papadimitriou | } |
143 | 8d08f18a | Kostas Papadimitriou | } else if ( !s.data || !jsre.test(s.data) ) { |
144 | 8d08f18a | Kostas Papadimitriou | s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?"; |
145 | 8d08f18a | Kostas Papadimitriou | } |
146 | 8d08f18a | Kostas Papadimitriou | s.dataType = "json";
|
147 | 8d08f18a | Kostas Papadimitriou | } |
148 | 8d08f18a | Kostas Papadimitriou | |
149 | 8d08f18a | Kostas Papadimitriou | // Build temporary JSONP function
|
150 | 8d08f18a | Kostas Papadimitriou | if ( s.dataType === "json" && (s.data && jsre.test(s.data) || jsre.test(s.url)) ) { |
151 | 8d08f18a | Kostas Papadimitriou | jsonp = s.jsonpCallback || ("jsonp" + jsc++);
|
152 | 8d08f18a | Kostas Papadimitriou | |
153 | 8d08f18a | Kostas Papadimitriou | // Replace the =? sequence both in the query string and the data
|
154 | 8d08f18a | Kostas Papadimitriou | if ( s.data ) {
|
155 | 8d08f18a | Kostas Papadimitriou | s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1"); |
156 | 8d08f18a | Kostas Papadimitriou | } |
157 | 8d08f18a | Kostas Papadimitriou | |
158 | 8d08f18a | Kostas Papadimitriou | s.url = s.url.replace(jsre, "=" + jsonp + "$1"); |
159 | 8d08f18a | Kostas Papadimitriou | |
160 | 8d08f18a | Kostas Papadimitriou | // We need to make sure
|
161 | 8d08f18a | Kostas Papadimitriou | // that a JSONP style response is executed properly
|
162 | 8d08f18a | Kostas Papadimitriou | s.dataType = "script";
|
163 | 8d08f18a | Kostas Papadimitriou | |
164 | 8d08f18a | Kostas Papadimitriou | // Handle JSONP-style loading
|
165 | 8d08f18a | Kostas Papadimitriou | window[ jsonp ] = window[ jsonp ] || function( tmp ) {
|
166 | 8d08f18a | Kostas Papadimitriou | data = tmp; |
167 | 8d08f18a | Kostas Papadimitriou | success(); |
168 | 8d08f18a | Kostas Papadimitriou | complete(); |
169 | 8d08f18a | Kostas Papadimitriou | // Garbage collect
|
170 | 8d08f18a | Kostas Papadimitriou | window[ jsonp ] = undefined;
|
171 | 8d08f18a | Kostas Papadimitriou | |
172 | 8d08f18a | Kostas Papadimitriou | try {
|
173 | 8d08f18a | Kostas Papadimitriou | delete window[ jsonp ];
|
174 | 8d08f18a | Kostas Papadimitriou | } catch(e) {}
|
175 | 8d08f18a | Kostas Papadimitriou | |
176 | 8d08f18a | Kostas Papadimitriou | if ( head ) {
|
177 | 8d08f18a | Kostas Papadimitriou | head.removeChild( script ); |
178 | 8d08f18a | Kostas Papadimitriou | } |
179 | 8d08f18a | Kostas Papadimitriou | }; |
180 | 8d08f18a | Kostas Papadimitriou | } |
181 | 8d08f18a | Kostas Papadimitriou | |
182 | 8d08f18a | Kostas Papadimitriou | var rurl = /^(\w+:)?\/\/([^\/?#]+)/, |
183 | 8d08f18a | Kostas Papadimitriou | parts = rurl.exec( s.url ), |
184 | 8d08f18a | Kostas Papadimitriou | remote = parts && (parts[1] && parts[1] !== location.protocol || parts[2] !== location.host); |
185 | 8d08f18a | Kostas Papadimitriou | |
186 | 8d08f18a | Kostas Papadimitriou | // Test if we are going to create a script tag (if so, intercept & mock)
|
187 | 8d08f18a | Kostas Papadimitriou | if ( s.dataType === "script" && s.type.toUpperCase() === "GET" && remote ) { |
188 | 8d08f18a | Kostas Papadimitriou | // Synthesize the mock request for adding a script tag
|
189 | 8d08f18a | Kostas Papadimitriou | var callbackContext = origSettings && origSettings.context || s;
|
190 | 8d08f18a | Kostas Papadimitriou | |
191 | 8d08f18a | Kostas Papadimitriou | function success() { |
192 | 8d08f18a | Kostas Papadimitriou | // If a local callback was specified, fire it and pass it the data
|
193 | 8d08f18a | Kostas Papadimitriou | if ( s.success ) {
|
194 | 8d08f18a | Kostas Papadimitriou | s.success.call( callbackContext, ( m.response ? m.response.toString() : m.responseText || ''), status, {} );
|
195 | 8d08f18a | Kostas Papadimitriou | } |
196 | 8d08f18a | Kostas Papadimitriou | |
197 | 8d08f18a | Kostas Papadimitriou | // Fire the global callback
|
198 | 8d08f18a | Kostas Papadimitriou | if ( s.global ) {
|
199 | 8d08f18a | Kostas Papadimitriou | trigger( "ajaxSuccess", [{}, s] );
|
200 | 8d08f18a | Kostas Papadimitriou | } |
201 | 8d08f18a | Kostas Papadimitriou | } |
202 | 8d08f18a | Kostas Papadimitriou | |
203 | 8d08f18a | Kostas Papadimitriou | function complete() { |
204 | 8d08f18a | Kostas Papadimitriou | // Process result
|
205 | 8d08f18a | Kostas Papadimitriou | if ( s.complete ) {
|
206 | 8d08f18a | Kostas Papadimitriou | s.complete.call( callbackContext, {} , status ); |
207 | 8d08f18a | Kostas Papadimitriou | } |
208 | 8d08f18a | Kostas Papadimitriou | |
209 | 8d08f18a | Kostas Papadimitriou | // The request was completed
|
210 | 8d08f18a | Kostas Papadimitriou | if ( s.global ) {
|
211 | 8d08f18a | Kostas Papadimitriou | trigger( "ajaxComplete", [{}, s] );
|
212 | 8d08f18a | Kostas Papadimitriou | } |
213 | 8d08f18a | Kostas Papadimitriou | |
214 | 8d08f18a | Kostas Papadimitriou | // Handle the global AJAX counter
|
215 | 8d08f18a | Kostas Papadimitriou | if ( s.global && ! --jQuery.active ) {
|
216 | 8d08f18a | Kostas Papadimitriou | jQuery.event.trigger( "ajaxStop" );
|
217 | 8d08f18a | Kostas Papadimitriou | } |
218 | 8d08f18a | Kostas Papadimitriou | } |
219 | 8d08f18a | Kostas Papadimitriou | |
220 | 8d08f18a | Kostas Papadimitriou | function trigger(type, args) { |
221 | 8d08f18a | Kostas Papadimitriou | (s.context ? jQuery(s.context) : jQuery.event).trigger(type, args); |
222 | 8d08f18a | Kostas Papadimitriou | } |
223 | 8d08f18a | Kostas Papadimitriou | |
224 | 8d08f18a | Kostas Papadimitriou | if ( m.response && $.isFunction(m.response) ) { |
225 | 8d08f18a | Kostas Papadimitriou | m.response(origSettings); |
226 | 8d08f18a | Kostas Papadimitriou | } else {
|
227 | 8d08f18a | Kostas Papadimitriou | $.globalEval(m.responseText);
|
228 | 8d08f18a | Kostas Papadimitriou | } |
229 | 8d08f18a | Kostas Papadimitriou | success(); |
230 | 8d08f18a | Kostas Papadimitriou | complete(); |
231 | 8d08f18a | Kostas Papadimitriou | return false; |
232 | 8d08f18a | Kostas Papadimitriou | } |
233 | 8d08f18a | Kostas Papadimitriou | mock = _ajax.call($, $.extend(true, {}, origSettings, { |
234 | 8d08f18a | Kostas Papadimitriou | // Mock the XHR object
|
235 | 8d08f18a | Kostas Papadimitriou | xhr: function() { |
236 | 8d08f18a | Kostas Papadimitriou | // Extend with our default mockjax settings
|
237 | 8d08f18a | Kostas Papadimitriou | m = $.extend({}, $.mockjaxSettings, m); |
238 | 8d08f18a | Kostas Papadimitriou | |
239 | 8d08f18a | Kostas Papadimitriou | if ( m.contentType ) {
|
240 | 8d08f18a | Kostas Papadimitriou | m.headers['content-type'] = m.contentType;
|
241 | 8d08f18a | Kostas Papadimitriou | } |
242 | 8d08f18a | Kostas Papadimitriou | |
243 | 8d08f18a | Kostas Papadimitriou | // Return our mock xhr object
|
244 | 8d08f18a | Kostas Papadimitriou | return {
|
245 | 8d08f18a | Kostas Papadimitriou | status: m.status,
|
246 | 8d08f18a | Kostas Papadimitriou | readyState: 1, |
247 | 8d08f18a | Kostas Papadimitriou | open: function() { }, |
248 | 8d08f18a | Kostas Papadimitriou | send: function() { |
249 | 8d08f18a | Kostas Papadimitriou | // This is a substitute for < 1.4 which lacks $.proxy
|
250 | 8d08f18a | Kostas Papadimitriou | var process = (function(that) { |
251 | 8d08f18a | Kostas Papadimitriou | return function() { |
252 | 8d08f18a | Kostas Papadimitriou | return (function() { |
253 | 8d08f18a | Kostas Papadimitriou | // The request has returned
|
254 | 8d08f18a | Kostas Papadimitriou | this.status = m.status;
|
255 | 8d08f18a | Kostas Papadimitriou | this.readyState = 4; |
256 | 8d08f18a | Kostas Papadimitriou | |
257 | 8d08f18a | Kostas Papadimitriou | // We have an executable function, call it to give
|
258 | 8d08f18a | Kostas Papadimitriou | // the mock handler a chance to update it's data
|
259 | 8d08f18a | Kostas Papadimitriou | if ( $.isFunction(m.response) ) { |
260 | 8d08f18a | Kostas Papadimitriou | m.response(origSettings); |
261 | 8d08f18a | Kostas Papadimitriou | } |
262 | 8d08f18a | Kostas Papadimitriou | // Copy over our mock to our xhr object before passing control back to
|
263 | 8d08f18a | Kostas Papadimitriou | // jQuery's onreadystatechange callback
|
264 | 8d08f18a | Kostas Papadimitriou | if ( s.dataType == 'json' && ( typeof m.responseText == 'object' ) ) { |
265 | 8d08f18a | Kostas Papadimitriou | this.responseText = JSON.stringify(m.responseText);
|
266 | 8d08f18a | Kostas Papadimitriou | } else if ( s.dataType == 'xml' ) { |
267 | 8d08f18a | Kostas Papadimitriou | if ( typeof m.responseXML == 'string' ) { |
268 | 8d08f18a | Kostas Papadimitriou | this.responseXML = parseXML(m.responseXML);
|
269 | 8d08f18a | Kostas Papadimitriou | } else {
|
270 | 8d08f18a | Kostas Papadimitriou | this.responseXML = m.responseXML;
|
271 | 8d08f18a | Kostas Papadimitriou | } |
272 | 8d08f18a | Kostas Papadimitriou | } else {
|
273 | 8d08f18a | Kostas Papadimitriou | this.responseText = m.responseText;
|
274 | 8d08f18a | Kostas Papadimitriou | } |
275 | 8d08f18a | Kostas Papadimitriou | // jQuery < 1.4 doesn't have onreadystate change for xhr
|
276 | 8d08f18a | Kostas Papadimitriou | if ( $.isFunction(this.onreadystatechange) ) { |
277 | 8d08f18a | Kostas Papadimitriou | this.onreadystatechange( m.isTimeout ? 'timeout' : undefined ); |
278 | 8d08f18a | Kostas Papadimitriou | } |
279 | 8d08f18a | Kostas Papadimitriou | }).apply(that); |
280 | 8d08f18a | Kostas Papadimitriou | }; |
281 | 8d08f18a | Kostas Papadimitriou | })(this);
|
282 | 8d08f18a | Kostas Papadimitriou | |
283 | 8d08f18a | Kostas Papadimitriou | if ( m.proxy ) {
|
284 | 8d08f18a | Kostas Papadimitriou | // We're proxying this request and loading in an external file instead
|
285 | 8d08f18a | Kostas Papadimitriou | _ajax({ |
286 | 8d08f18a | Kostas Papadimitriou | global: false, |
287 | 8d08f18a | Kostas Papadimitriou | url: m.proxy,
|
288 | 8d08f18a | Kostas Papadimitriou | type: m.proxyType,
|
289 | 8d08f18a | Kostas Papadimitriou | data: m.data,
|
290 | 8d08f18a | Kostas Papadimitriou | dataType: s.dataType,
|
291 | 8d08f18a | Kostas Papadimitriou | complete: function(xhr, txt) { |
292 | 8d08f18a | Kostas Papadimitriou | m.responseXML = xhr.responseXML; |
293 | 8d08f18a | Kostas Papadimitriou | m.responseText = xhr.responseText; |
294 | 8d08f18a | Kostas Papadimitriou | this.responseTimer = setTimeout(process, m.responseTime || 0); |
295 | 8d08f18a | Kostas Papadimitriou | } |
296 | 8d08f18a | Kostas Papadimitriou | }); |
297 | 8d08f18a | Kostas Papadimitriou | } else {
|
298 | 8d08f18a | Kostas Papadimitriou | // type == 'POST' || 'GET' || 'DELETE'
|
299 | 8d08f18a | Kostas Papadimitriou | if ( s.async === false ) { |
300 | 8d08f18a | Kostas Papadimitriou | // TODO: Blocking delay
|
301 | 8d08f18a | Kostas Papadimitriou | process(); |
302 | 8d08f18a | Kostas Papadimitriou | } else {
|
303 | 8d08f18a | Kostas Papadimitriou | this.responseTimer = setTimeout(process, m.responseTime || 50); |
304 | 8d08f18a | Kostas Papadimitriou | } |
305 | 8d08f18a | Kostas Papadimitriou | } |
306 | 8d08f18a | Kostas Papadimitriou | }, |
307 | 8d08f18a | Kostas Papadimitriou | abort: function() { |
308 | 8d08f18a | Kostas Papadimitriou | clearTimeout(this.responseTimer);
|
309 | 8d08f18a | Kostas Papadimitriou | }, |
310 | 8d08f18a | Kostas Papadimitriou | setRequestHeader: function() { }, |
311 | 8d08f18a | Kostas Papadimitriou | getResponseHeader: function(header) { |
312 | 8d08f18a | Kostas Papadimitriou | // 'Last-modified', 'Etag', 'content-type' are all checked by jQuery
|
313 | 8d08f18a | Kostas Papadimitriou | if ( m.headers && m.headers[header] ) {
|
314 | 8d08f18a | Kostas Papadimitriou | // Return arbitrary headers
|
315 | 8d08f18a | Kostas Papadimitriou | return m.headers[header];
|
316 | 8d08f18a | Kostas Papadimitriou | } else if ( header.toLowerCase() == 'last-modified' ) { |
317 | 8d08f18a | Kostas Papadimitriou | return m.lastModified || (new Date()).toString(); |
318 | 8d08f18a | Kostas Papadimitriou | } else if ( header.toLowerCase() == 'etag' ) { |
319 | 8d08f18a | Kostas Papadimitriou | return m.etag || ''; |
320 | 8d08f18a | Kostas Papadimitriou | } else if ( header.toLowerCase() == 'content-type' ) { |
321 | 8d08f18a | Kostas Papadimitriou | return m.contentType || 'text/plain'; |
322 | 8d08f18a | Kostas Papadimitriou | } |
323 | 8d08f18a | Kostas Papadimitriou | }, |
324 | 8d08f18a | Kostas Papadimitriou | getAllResponseHeaders: function() { |
325 | 8d08f18a | Kostas Papadimitriou | var headers = ''; |
326 | 8d08f18a | Kostas Papadimitriou | $.each(m.headers, function(k, v) { |
327 | 8d08f18a | Kostas Papadimitriou | headers += k + ': ' + v + "\n"; |
328 | 8d08f18a | Kostas Papadimitriou | }); |
329 | 8d08f18a | Kostas Papadimitriou | return headers;
|
330 | 8d08f18a | Kostas Papadimitriou | } |
331 | 8d08f18a | Kostas Papadimitriou | }; |
332 | 8d08f18a | Kostas Papadimitriou | } |
333 | 8d08f18a | Kostas Papadimitriou | })); |
334 | 8d08f18a | Kostas Papadimitriou | return false; |
335 | 8d08f18a | Kostas Papadimitriou | } |
336 | 8d08f18a | Kostas Papadimitriou | }); |
337 | 8d08f18a | Kostas Papadimitriou | // We don't have a mock request, trigger a normal request
|
338 | 8d08f18a | Kostas Papadimitriou | if ( !mock ) {
|
339 | 8d08f18a | Kostas Papadimitriou | return _ajax.apply($, arguments); |
340 | 8d08f18a | Kostas Papadimitriou | } else {
|
341 | 8d08f18a | Kostas Papadimitriou | return mock;
|
342 | 8d08f18a | Kostas Papadimitriou | } |
343 | 8d08f18a | Kostas Papadimitriou | } |
344 | 8d08f18a | Kostas Papadimitriou | }); |
345 | 8d08f18a | Kostas Papadimitriou | |
346 | 8d08f18a | Kostas Papadimitriou | $.mockjaxSettings = {
|
347 | 8d08f18a | Kostas Papadimitriou | //url: null,
|
348 | 8d08f18a | Kostas Papadimitriou | //type: 'GET',
|
349 | 8d08f18a | Kostas Papadimitriou | log: function(msg) { |
350 | 8d08f18a | Kostas Papadimitriou | window['console'] && window.console.log && window.console.log(msg);
|
351 | 8d08f18a | Kostas Papadimitriou | }, |
352 | 8d08f18a | Kostas Papadimitriou | status: 200, |
353 | 8d08f18a | Kostas Papadimitriou | responseTime: 500, |
354 | 8d08f18a | Kostas Papadimitriou | isTimeout: false, |
355 | 8d08f18a | Kostas Papadimitriou | contentType: 'text/plain', |
356 | 8d08f18a | Kostas Papadimitriou | response: '', |
357 | 8d08f18a | Kostas Papadimitriou | responseText: '', |
358 | 8d08f18a | Kostas Papadimitriou | responseXML: '', |
359 | 8d08f18a | Kostas Papadimitriou | proxy: '', |
360 | 8d08f18a | Kostas Papadimitriou | proxyType: 'GET', |
361 | 8d08f18a | Kostas Papadimitriou | |
362 | 8d08f18a | Kostas Papadimitriou | lastModified: null, |
363 | 8d08f18a | Kostas Papadimitriou | etag: '', |
364 | 8d08f18a | Kostas Papadimitriou | headers: {
|
365 | 8d08f18a | Kostas Papadimitriou | etag: 'IJF@H#@923uf8023hFO@I#H#', |
366 | 8d08f18a | Kostas Papadimitriou | 'content-type' : 'text/plain' |
367 | 8d08f18a | Kostas Papadimitriou | } |
368 | 8d08f18a | Kostas Papadimitriou | }; |
369 | 8d08f18a | Kostas Papadimitriou | |
370 | 8d08f18a | Kostas Papadimitriou | $.mockjax = function(settings) { |
371 | 8d08f18a | Kostas Papadimitriou | var i = mockHandlers.length;
|
372 | 8d08f18a | Kostas Papadimitriou | mockHandlers[i] = settings; |
373 | 8d08f18a | Kostas Papadimitriou | return i;
|
374 | 8d08f18a | Kostas Papadimitriou | }; |
375 | 8d08f18a | Kostas Papadimitriou | $.mockjaxClear = function(i) { |
376 | 8d08f18a | Kostas Papadimitriou | if ( arguments.length == 1 ) { |
377 | 8d08f18a | Kostas Papadimitriou | mockHandlers[i] = null;
|
378 | 8d08f18a | Kostas Papadimitriou | } else {
|
379 | 8d08f18a | Kostas Papadimitriou | mockHandlers = []; |
380 | 8d08f18a | Kostas Papadimitriou | } |
381 | 8d08f18a | Kostas Papadimitriou | }; |
382 | 8d08f18a | Kostas Papadimitriou | })(jQuery); |