1 /** |
|
2 * XHR.js |
|
3 * |
|
4 * Copyright, Moxiecode Systems AB |
|
5 * Released under LGPL License. |
|
6 * |
|
7 * License: http://www.tinymce.com/license |
|
8 * Contributing: http://www.tinymce.com/contributing |
|
9 */ |
|
10 |
|
11 /** |
|
12 * This class enables you to send XMLHTTPRequests cross browser. |
|
13 * @class tinymce.util.XHR |
|
14 * @mixes tinymce.util.Observable |
|
15 * @static |
|
16 * @example |
|
17 * // Sends a low level Ajax request |
|
18 * tinymce.util.XHR.send({ |
|
19 * url: 'someurl', |
|
20 * success: function(text) { |
|
21 * console.debug(text); |
|
22 * } |
|
23 * }); |
|
24 * |
|
25 * // Add custom header to XHR request |
|
26 * tinymce.util.XHR.on('beforeSend', function(e) { |
|
27 * e.xhr.setRequestHeader('X-Requested-With', 'Something'); |
|
28 * }); |
|
29 */ |
|
30 define("tinymce/util/XHR", [ |
|
31 "tinymce/util/Observable", |
|
32 "tinymce/util/Tools" |
|
33 ], function(Observable, Tools) { |
|
34 var XHR = { |
|
35 /** |
|
36 * Sends a XMLHTTPRequest. |
|
37 * Consult the Wiki for details on what settings this method takes. |
|
38 * |
|
39 * @method send |
|
40 * @param {Object} settings Object will target URL, callbacks and other info needed to make the request. |
|
41 */ |
|
42 send: function(settings) { |
|
43 var xhr, count = 0; |
|
44 |
|
45 function ready() { |
|
46 if (!settings.async || xhr.readyState == 4 || count++ > 10000) { |
|
47 if (settings.success && count < 10000 && xhr.status == 200) { |
|
48 settings.success.call(settings.success_scope, '' + xhr.responseText, xhr, settings); |
|
49 } else if (settings.error) { |
|
50 settings.error.call(settings.error_scope, count > 10000 ? 'TIMED_OUT' : 'GENERAL', xhr, settings); |
|
51 } |
|
52 |
|
53 xhr = null; |
|
54 } else { |
|
55 setTimeout(ready, 10); |
|
56 } |
|
57 } |
|
58 |
|
59 // Default settings |
|
60 settings.scope = settings.scope || this; |
|
61 settings.success_scope = settings.success_scope || settings.scope; |
|
62 settings.error_scope = settings.error_scope || settings.scope; |
|
63 settings.async = settings.async === false ? false : true; |
|
64 settings.data = settings.data || ''; |
|
65 |
|
66 xhr = new XMLHttpRequest(); |
|
67 |
|
68 if (xhr) { |
|
69 if (xhr.overrideMimeType) { |
|
70 xhr.overrideMimeType(settings.content_type); |
|
71 } |
|
72 |
|
73 xhr.open(settings.type || (settings.data ? 'POST' : 'GET'), settings.url, settings.async); |
|
74 |
|
75 if (settings.crossDomain) { |
|
76 xhr.withCredentials = true; |
|
77 } |
|
78 |
|
79 if (settings.content_type) { |
|
80 xhr.setRequestHeader('Content-Type', settings.content_type); |
|
81 } |
|
82 |
|
83 xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); |
|
84 |
|
85 xhr = XHR.fire('beforeSend', {xhr: xhr, settings: settings}).xhr; |
|
86 xhr.send(settings.data); |
|
87 |
|
88 // Syncronous request |
|
89 if (!settings.async) { |
|
90 return ready(); |
|
91 } |
|
92 |
|
93 // Wait for response, onReadyStateChange can not be used since it leaks memory in IE |
|
94 setTimeout(ready, 10); |
|
95 } |
|
96 } |
|
97 }; |
|
98 |
|
99 Tools.extend(XHR, Observable); |
|
100 |
|
101 return XHR; |
|
102 }); |
|