diff options
Diffstat (limited to 'remoting/webapp/xhr.js')
-rw-r--r-- | remoting/webapp/xhr.js | 187 |
1 files changed, 187 insertions, 0 deletions
diff --git a/remoting/webapp/xhr.js b/remoting/webapp/xhr.js new file mode 100644 index 0000000..2a48077 --- /dev/null +++ b/remoting/webapp/xhr.js @@ -0,0 +1,187 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview + * Simple utilities for making XHRs more pleasant. + */ + +'use strict'; + +/** @suppress {duplicate} */ +var remoting = remoting || {}; + +/** Namespace for XHR functions */ +/** @type {Object} */ +remoting.xhr = remoting.xhr || {}; + +/** + * Takes an associative array of parameters and urlencodes it. + * + * @param {Object.<string>} paramHash The parameter key/value pairs. + * @return {string} URLEncoded version of paramHash. + */ +remoting.xhr.urlencodeParamHash = function(paramHash) { + var paramArray = []; + for (var key in paramHash) { + paramArray.push(encodeURIComponent(key) + + '=' + encodeURIComponent(paramHash[key])); + } + if (paramArray.length > 0) { + return paramArray.join('&'); + } + return ''; +}; + +/** + * Execute an XHR GET asynchronously. + * + * @param {string} url The base URL to GET, excluding parameters. + * @param {function(XMLHttpRequest):void} onDone The function to call on + * completion. + * @param {(string|Object.<string>)=} opt_parameters The request parameters, + * either as an associative array, or a string. If it is a string, do + * not include the ? and be sure it is correctly URLEncoded. + * @param {Object.<string>=} opt_headers Additional headers to include on the + * request. + * @param {boolean=} opt_withCredentials Set the withCredentials flags in the + * XHR. + * @return {XMLHttpRequest} The request object. + */ +remoting.xhr.get = function(url, onDone, opt_parameters, opt_headers, + opt_withCredentials) { + return remoting.xhr.doMethod('GET', url, onDone, opt_parameters, + opt_headers, opt_withCredentials); +}; + +/** + * Execute an XHR POST asynchronously. + * + * @param {string} url The base URL to POST, excluding parameters. + * @param {function(XMLHttpRequest):void} onDone The function to call on + * completion. + * @param {(string|Object.<string>)=} opt_parameters The request parameters, + * either as an associative array, or a string. If it is a string, be + * sure it is correctly URLEncoded. + * @param {Object.<string>=} opt_headers Additional headers to include on the + * request. + * @param {boolean=} opt_withCredentials Set the withCredentials flags in the + * XHR. + * @return {XMLHttpRequest} The request object. + */ +remoting.xhr.post = function(url, onDone, opt_parameters, opt_headers, + opt_withCredentials) { + return remoting.xhr.doMethod('POST', url, onDone, opt_parameters, + opt_headers, opt_withCredentials); +}; + +/** + * Execute an XHR DELETE asynchronously. + * + * @param {string} url The base URL to DELETE, excluding parameters. + * @param {function(XMLHttpRequest):void} onDone The function to call on + * completion. + * @param {(string|Object.<string>)=} opt_parameters The request parameters, + * either as an associative array, or a string. If it is a string, be + * sure it is correctly URLEncoded. + * @param {Object.<string>=} opt_headers Additional headers to include on the + * request. + * @param {boolean=} opt_withCredentials Set the withCredentials flags in the + * XHR. + * @return {XMLHttpRequest} The request object. + */ +remoting.xhr.remove = function(url, onDone, opt_parameters, opt_headers, + opt_withCredentials) { + return remoting.xhr.doMethod('DELETE', url, onDone, opt_parameters, + opt_headers, opt_withCredentials); +}; + +/** + * Execute an XHR PUT asynchronously. + * + * @param {string} url The base URL to PUT, excluding parameters. + * @param {function(XMLHttpRequest):void} onDone The function to call on + * completion. + * @param {(string|Object.<string>)=} opt_parameters The request parameters, + * either as an associative array, or a string. If it is a string, be + * sure it is correctly URLEncoded. + * @param {Object.<string>=} opt_headers Additional headers to include on the + * request. + * @param {boolean=} opt_withCredentials Set the withCredentials flags in the + * XHR. + * @return {XMLHttpRequest} The request object. + */ +remoting.xhr.put = function(url, onDone, opt_parameters, opt_headers, + opt_withCredentials) { + return remoting.xhr.doMethod('PUT', url, onDone, opt_parameters, + opt_headers, opt_withCredentials); +}; + +/** + * Execute an arbitrary HTTP method asynchronously. + * + * @param {string} methodName The HTTP method name, e.g. "GET", "POST" etc. + * @param {string} url The base URL, excluding parameters. + * @param {function(XMLHttpRequest):void} onDone The function to call on + * completion. + * @param {(string|Object.<string>)=} opt_parameters The request parameters, + * either as an associative array, or a string. If it is a string, be + * sure it is correctly URLEncoded. + * @param {Object.<string>=} opt_headers Additional headers to include on the + * request. + * @param {boolean=} opt_withCredentials Set the withCredentials flags in the + * XHR. + * @return {XMLHttpRequest} The XMLHttpRequest object. + */ +remoting.xhr.doMethod = function(methodName, url, onDone, + opt_parameters, opt_headers, + opt_withCredentials) { + /** @type {XMLHttpRequest} */ + var xhr = new XMLHttpRequest(); + xhr.onreadystatechange = function() { + if (xhr.readyState != 4) { + return; + } + onDone(xhr); + }; + + var parameterString = ''; + if (typeof(opt_parameters) === 'string') { + parameterString = opt_parameters; + } else if (typeof(opt_parameters) === 'object') { + parameterString = remoting.xhr.urlencodeParamHash(opt_parameters); + } else if (opt_parameters === undefined) { + // No problem here. Do nothing. + } else { + throw 'opt_parameters must be string or associated array.'; + } + + var useBody = (methodName == 'POST') || (methodName == 'PUT'); + + if (!useBody && parameterString != '') { + url = url + '?' + parameterString; + } + + xhr.open(methodName, url, true); + if (methodName == 'POST') { + xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); + } + // Add in request headers. + if (typeof(opt_headers) === 'object') { + for (var key in opt_headers) { + xhr.setRequestHeader(key, opt_headers[key]); + } + } else if (opt_headers === undefined) { + // No problem here. Do nothing. + } else { + throw 'opt_headers must be associative array.'; + } + + if (opt_withCredentials) { + xhr.withCredentials = true; + } + + xhr.send(useBody ? parameterString : null); + return xhr; +}; |