| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 /** | |
| 6 * @fileoverview | |
| 7 * Simple utilities for making XHRs more pleasant. | |
| 8 */ | |
| 9 | |
| 10 'use strict'; | |
| 11 | |
| 12 /** @suppress {duplicate} */ | |
| 13 var remoting = remoting || {}; | |
| 14 | |
| 15 /** Namespace for XHR functions */ | |
| 16 /** @type {Object} */ | |
| 17 remoting.xhr = remoting.xhr || {}; | |
| 18 | |
| 19 /** | |
| 20 * Takes an associative array of parameters and urlencodes it. | |
| 21 * | |
| 22 * @param {Object.<string>} paramHash The parameter key/value pairs. | |
| 23 * @return {string} URLEncoded version of paramHash. | |
| 24 */ | |
| 25 remoting.xhr.urlencodeParamHash = function(paramHash) { | |
| 26 var paramArray = []; | |
| 27 for (var key in paramHash) { | |
| 28 paramArray.push(encodeURIComponent(key) + | |
| 29 '=' + encodeURIComponent(paramHash[key])); | |
| 30 } | |
| 31 if (paramArray.length > 0) { | |
| 32 return paramArray.join('&'); | |
| 33 } | |
| 34 return ''; | |
| 35 }; | |
| 36 | |
| 37 /** | |
| 38 * Execute an XHR GET asynchronously. | |
| 39 * | |
| 40 * @param {string} url The base URL to GET, excluding parameters. | |
| 41 * @param {function(XMLHttpRequest):void} onDone The function to call on | |
| 42 * completion. | |
| 43 * @param {(string|Object.<string>)=} opt_parameters The request parameters, | |
| 44 * either as an associative array, or a string. If it is a string, do | |
| 45 * not include the ? and be sure it is correctly URLEncoded. | |
| 46 * @param {Object.<string>=} opt_headers Additional headers to include on the | |
| 47 * request. | |
| 48 * @param {boolean=} opt_withCredentials Set the withCredentials flags in the | |
| 49 * XHR. | |
| 50 * @return {XMLHttpRequest} The request object. | |
| 51 */ | |
| 52 remoting.xhr.get = function(url, onDone, opt_parameters, opt_headers, | |
| 53 opt_withCredentials) { | |
| 54 return remoting.xhr.doMethod('GET', url, onDone, opt_parameters, | |
| 55 opt_headers, opt_withCredentials); | |
| 56 }; | |
| 57 | |
| 58 /** | |
| 59 * Execute an XHR POST asynchronously. | |
| 60 * | |
| 61 * @param {string} url The base URL to POST, excluding parameters. | |
| 62 * @param {function(XMLHttpRequest):void} onDone The function to call on | |
| 63 * completion. | |
| 64 * @param {(string|Object.<string>)=} opt_parameters The request parameters, | |
| 65 * either as an associative array, or a string. If it is a string, be | |
| 66 * sure it is correctly URLEncoded. | |
| 67 * @param {Object.<string>=} opt_headers Additional headers to include on the | |
| 68 * request. | |
| 69 * @param {boolean=} opt_withCredentials Set the withCredentials flags in the | |
| 70 * XHR. | |
| 71 * @return {XMLHttpRequest} The request object. | |
| 72 */ | |
| 73 remoting.xhr.post = function(url, onDone, opt_parameters, opt_headers, | |
| 74 opt_withCredentials) { | |
| 75 return remoting.xhr.doMethod('POST', url, onDone, opt_parameters, | |
| 76 opt_headers, opt_withCredentials); | |
| 77 }; | |
| 78 | |
| 79 /** | |
| 80 * Execute an XHR DELETE asynchronously. | |
| 81 * | |
| 82 * @param {string} url The base URL to DELETE, excluding parameters. | |
| 83 * @param {function(XMLHttpRequest):void} onDone The function to call on | |
| 84 * completion. | |
| 85 * @param {(string|Object.<string>)=} opt_parameters The request parameters, | |
| 86 * either as an associative array, or a string. If it is a string, be | |
| 87 * sure it is correctly URLEncoded. | |
| 88 * @param {Object.<string>=} opt_headers Additional headers to include on the | |
| 89 * request. | |
| 90 * @param {boolean=} opt_withCredentials Set the withCredentials flags in the | |
| 91 * XHR. | |
| 92 * @return {XMLHttpRequest} The request object. | |
| 93 */ | |
| 94 remoting.xhr.remove = function(url, onDone, opt_parameters, opt_headers, | |
| 95 opt_withCredentials) { | |
| 96 return remoting.xhr.doMethod('DELETE', url, onDone, opt_parameters, | |
| 97 opt_headers, opt_withCredentials); | |
| 98 }; | |
| 99 | |
| 100 /** | |
| 101 * Execute an XHR PUT asynchronously. | |
| 102 * | |
| 103 * @param {string} url The base URL to PUT, excluding parameters. | |
| 104 * @param {function(XMLHttpRequest):void} onDone The function to call on | |
| 105 * completion. | |
| 106 * @param {(string|Object.<string>)=} opt_parameters The request parameters, | |
| 107 * either as an associative array, or a string. If it is a string, be | |
| 108 * sure it is correctly URLEncoded. | |
| 109 * @param {Object.<string>=} opt_headers Additional headers to include on the | |
| 110 * request. | |
| 111 * @param {boolean=} opt_withCredentials Set the withCredentials flags in the | |
| 112 * XHR. | |
| 113 * @return {XMLHttpRequest} The request object. | |
| 114 */ | |
| 115 remoting.xhr.put = function(url, onDone, opt_parameters, opt_headers, | |
| 116 opt_withCredentials) { | |
| 117 return remoting.xhr.doMethod('PUT', url, onDone, opt_parameters, | |
| 118 opt_headers, opt_withCredentials); | |
| 119 }; | |
| 120 | |
| 121 /** | |
| 122 * Execute an arbitrary HTTP method asynchronously. | |
| 123 * | |
| 124 * @param {string} methodName The HTTP method name, e.g. "GET", "POST" etc. | |
| 125 * @param {string} url The base URL, excluding parameters. | |
| 126 * @param {function(XMLHttpRequest):void} onDone The function to call on | |
| 127 * completion. | |
| 128 * @param {(string|Object.<string>)=} opt_parameters The request parameters, | |
| 129 * either as an associative array, or a string. If it is a string, be | |
| 130 * sure it is correctly URLEncoded. | |
| 131 * @param {Object.<string>=} opt_headers Additional headers to include on the | |
| 132 * request. | |
| 133 * @param {boolean=} opt_withCredentials Set the withCredentials flags in the | |
| 134 * XHR. | |
| 135 * @return {XMLHttpRequest} The XMLHttpRequest object. | |
| 136 */ | |
| 137 remoting.xhr.doMethod = function(methodName, url, onDone, | |
| 138 opt_parameters, opt_headers, | |
| 139 opt_withCredentials) { | |
| 140 /** @type {XMLHttpRequest} */ | |
| 141 var xhr = new XMLHttpRequest(); | |
| 142 xhr.onreadystatechange = function() { | |
| 143 if (xhr.readyState != 4) { | |
| 144 return; | |
| 145 } | |
| 146 onDone(xhr); | |
| 147 }; | |
| 148 | |
| 149 var parameterString = ''; | |
| 150 if (typeof(opt_parameters) === 'string') { | |
| 151 parameterString = opt_parameters; | |
| 152 } else if (typeof(opt_parameters) === 'object') { | |
| 153 parameterString = remoting.xhr.urlencodeParamHash(opt_parameters); | |
| 154 } else if (opt_parameters === undefined) { | |
| 155 // No problem here. Do nothing. | |
| 156 } else { | |
| 157 throw 'opt_parameters must be string or associated array.'; | |
| 158 } | |
| 159 | |
| 160 var useBody = (methodName == 'POST') || (methodName == 'PUT'); | |
| 161 | |
| 162 if (!useBody && parameterString != '') { | |
| 163 url = url + '?' + parameterString; | |
| 164 } | |
| 165 | |
| 166 xhr.open(methodName, url, true); | |
| 167 if (methodName == 'POST') { | |
| 168 xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); | |
| 169 } | |
| 170 // Add in request headers. | |
| 171 if (typeof(opt_headers) === 'object') { | |
| 172 for (var key in opt_headers) { | |
| 173 xhr.setRequestHeader(key, opt_headers[key]); | |
| 174 } | |
| 175 } else if (opt_headers === undefined) { | |
| 176 // No problem here. Do nothing. | |
| 177 } else { | |
| 178 throw 'opt_headers must be associative array.'; | |
| 179 } | |
| 180 | |
| 181 if (opt_withCredentials) { | |
| 182 xhr.withCredentials = true; | |
| 183 } | |
| 184 | |
| 185 xhr.send(useBody ? parameterString : null); | |
| 186 return xhr; | |
| 187 }; | |
| OLD | NEW |