Index: remoting/webapp/crd/js/xhr.js |
diff --git a/remoting/webapp/crd/js/xhr.js b/remoting/webapp/crd/js/xhr.js |
deleted file mode 100644 |
index 1b7fa34591a667b38341474b1ceb921136b6b4e5..0000000000000000000000000000000000000000 |
--- a/remoting/webapp/crd/js/xhr.js |
+++ /dev/null |
@@ -1,395 +0,0 @@ |
-// 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 |
- * Utility class for making XHRs more pleasant. |
- * |
- * Note: a mock version of this API exists in mock_xhr.js. |
- */ |
- |
-/** @suppress {duplicate} */ |
-var remoting = remoting || {}; |
- |
-(function() { |
- |
-'use strict'; |
- |
-/** |
- * @constructor |
- * @param {remoting.Xhr.Params} params |
- */ |
-remoting.Xhr = function(params) { |
- remoting.Xhr.checkParams_(params); |
- |
- // Apply URL parameters. |
- var url = params.url; |
- var parameterString = ''; |
- if (typeof(params.urlParams) === 'string') { |
- parameterString = params.urlParams; |
- } else if (typeof(params.urlParams) === 'object') { |
- parameterString = remoting.Xhr.urlencodeParamHash( |
- base.copyWithoutNullFields(params.urlParams)); |
- } |
- if (parameterString) { |
- url += '?' + parameterString; |
- } |
- |
- // Prepare the build modified headers. |
- /** @const */ |
- this.headers_ = base.copyWithoutNullFields(params.headers); |
- |
- // Convert the content fields to a single text content variable. |
- /** @private {?string} */ |
- this.content_ = null; |
- if (params.textContent !== undefined) { |
- this.maybeSetContentType_('text/plain'); |
- this.content_ = params.textContent; |
- } else if (params.formContent !== undefined) { |
- this.maybeSetContentType_('application/x-www-form-urlencoded'); |
- this.content_ = remoting.Xhr.urlencodeParamHash(params.formContent); |
- } else if (params.jsonContent !== undefined) { |
- this.maybeSetContentType_('application/json'); |
- this.content_ = JSON.stringify(params.jsonContent); |
- } |
- |
- // Apply the oauthToken field. |
- if (params.oauthToken !== undefined) { |
- this.setAuthToken_(params.oauthToken); |
- } |
- |
- /** @private @const {boolean} */ |
- this.acceptJson_ = params.acceptJson || false; |
- if (this.acceptJson_) { |
- this.maybeSetHeader_('Accept', 'application/json'); |
- } |
- |
- // Apply useIdentity field. |
- /** @const {boolean} */ |
- this.useIdentity_ = params.useIdentity || false; |
- |
- /** @private @const {!XMLHttpRequest} */ |
- this.nativeXhr_ = new XMLHttpRequest(); |
- this.nativeXhr_.onreadystatechange = this.onReadyStateChange_.bind(this); |
- this.nativeXhr_.withCredentials = params.withCredentials || false; |
- this.nativeXhr_.open(params.method, url, true); |
- |
- /** @private {base.Deferred<!remoting.Xhr.Response>} */ |
- this.deferred_ = null; |
-}; |
- |
-/** |
- * Starts and HTTP request and gets a promise that is resolved when |
- * the request completes. |
- * |
- * Any error that prevents sending the request causes the promise to |
- * be rejected. |
- * |
- * NOTE: Calling this method more than once will return the same |
- * promise and not start a new request, despite what the name |
- * suggests. |
- * |
- * @return {!Promise<!remoting.Xhr.Response>} |
- */ |
-remoting.Xhr.prototype.start = function() { |
- if (this.deferred_ == null) { |
- this.deferred_ = new base.Deferred(); |
- |
- // Send the XHR, possibly after getting an OAuth token. |
- var that = this; |
- if (this.useIdentity_) { |
- remoting.identity.getToken().then(function(token) { |
- base.debug.assert(that.nativeXhr_.readyState == 1); |
- that.setAuthToken_(token); |
- that.sendXhr_(); |
- }).catch(function(error) { |
- that.deferred_.reject(error); |
- }); |
- } else { |
- this.sendXhr_(); |
- } |
- } |
- return this.deferred_.promise(); |
-}; |
- |
-/** |
- * The set of possible fields in remoting.Xhr.Params. |
- * @const |
- */ |
-var ALLOWED_PARAMS = [ |
- 'method', |
- 'url', |
- 'urlParams', |
- 'textContent', |
- 'formContent', |
- 'jsonContent', |
- 'headers', |
- 'withCredentials', |
- 'oauthToken', |
- 'useIdentity', |
- 'acceptJson' |
-]; |
- |
-/** |
- * @param {remoting.Xhr.Params} params |
- * @throws {Error} if params are invalid |
- * @private |
- */ |
-remoting.Xhr.checkParams_ = function(params) { |
- // Provide a sensible error message when the user misspells a |
- // parameter name, since the compiler won't catch it. |
- for (var field in params) { |
- if (ALLOWED_PARAMS.indexOf(field) == -1) { |
- throw new Error('unknow parameter: ' + field); |
- } |
- } |
- |
- if (params.urlParams) { |
- if (params.url.indexOf('?') != -1) { |
- throw new Error('URL may not contain "?" when urlParams is set'); |
- } |
- if (params.url.indexOf('#') != -1) { |
- throw new Error('URL may not contain "#" when urlParams is set'); |
- } |
- } |
- |
- if ((Number(params.textContent !== undefined) + |
- Number(params.formContent !== undefined) + |
- Number(params.jsonContent !== undefined)) > 1) { |
- throw new Error( |
- 'may only specify one of textContent, formContent, and jsonContent'); |
- } |
- |
- if (params.useIdentity && params.oauthToken !== undefined) { |
- throw new Error('may not specify both useIdentity and oauthToken'); |
- } |
- |
- if ((params.useIdentity || params.oauthToken !== undefined) && |
- params.headers && |
- params.headers['Authorization'] != null) { |
- throw new Error( |
- 'may not specify useIdentity or oauthToken ' + |
- 'with an Authorization header'); |
- } |
-}; |
- |
-/** |
- * @param {string} token |
- * @private |
- */ |
-remoting.Xhr.prototype.setAuthToken_ = function(token) { |
- this.setHeader_('Authorization', 'Bearer ' + token); |
-}; |
- |
-/** |
- * @param {string} type |
- * @private |
- */ |
-remoting.Xhr.prototype.maybeSetContentType_ = function(type) { |
- this.maybeSetHeader_('Content-type', type + '; charset=UTF-8'); |
-}; |
- |
-/** |
- * @param {string} key |
- * @param {string} value |
- * @private |
- */ |
-remoting.Xhr.prototype.setHeader_ = function(key, value) { |
- var wasSet = this.maybeSetHeader_(key, value); |
- base.debug.assert(wasSet); |
-}; |
- |
-/** |
- * @param {string} key |
- * @param {string} value |
- * @return {boolean} |
- * @private |
- */ |
-remoting.Xhr.prototype.maybeSetHeader_ = function(key, value) { |
- if (!(key in this.headers_)) { |
- this.headers_[key] = value; |
- return true; |
- } |
- return false; |
-}; |
- |
-/** @private */ |
-remoting.Xhr.prototype.sendXhr_ = function() { |
- for (var key in this.headers_) { |
- this.nativeXhr_.setRequestHeader( |
- key, /** @type {string} */ (this.headers_[key])); |
- } |
- this.nativeXhr_.send(this.content_); |
- this.content_ = null; // for gc |
-}; |
- |
-/** |
- * @private |
- */ |
-remoting.Xhr.prototype.onReadyStateChange_ = function() { |
- var xhr = this.nativeXhr_; |
- if (xhr.readyState == 4) { |
- // See comments at remoting.Xhr.Response. |
- this.deferred_.resolve(remoting.Xhr.Response.fromXhr_( |
- xhr, this.acceptJson_)); |
- } |
-}; |
- |
-/** |
- * The response-related parts of an XMLHttpRequest. Note that this |
- * class is not just a facade for XMLHttpRequest; it saves the value |
- * of the |responseText| field becuase once onReadyStateChange_ |
- * (above) returns, the value of |responseText| is reset to the empty |
- * string! This is a documented anti-feature of the XMLHttpRequest |
- * API. |
- * |
- * @constructor |
- * @param {number} status |
- * @param {string} statusText |
- * @param {?string} url |
- * @param {string} text |
- * @param {boolean} allowJson |
- */ |
-remoting.Xhr.Response = function( |
- status, statusText, url, text, allowJson) { |
- /** |
- * The HTTP status code. |
- * @const {number} |
- */ |
- this.status = status; |
- |
- /** |
- * The HTTP status description. |
- * @const {string} |
- */ |
- this.statusText = statusText; |
- |
- /** |
- * The response URL, if any. |
- * @const {?string} |
- */ |
- this.url = url; |
- |
- /** @private {string} */ |
- this.text_ = text; |
- |
- /** @private @const */ |
- this.allowJson_ = allowJson; |
- |
- /** @private {*|undefined} */ |
- this.json_ = undefined; |
-}; |
- |
-/** |
- * @param {!XMLHttpRequest} xhr |
- * @param {boolean} allowJson |
- * @return {!remoting.Xhr.Response} |
- */ |
-remoting.Xhr.Response.fromXhr_ = function(xhr, allowJson) { |
- return new remoting.Xhr.Response( |
- xhr.status, |
- xhr.statusText, |
- xhr.responseURL, |
- xhr.responseText || '', |
- allowJson); |
-}; |
- |
-/** |
- * @return {boolean} True if the response code is outside the 200-299 |
- * range (i.e. success as defined by the HTTP protocol). |
- */ |
-remoting.Xhr.Response.prototype.isError = function() { |
- return this.status < 200 || this.status >= 300; |
-}; |
- |
-/** |
- * @return {string} The text content of the response. |
- */ |
-remoting.Xhr.Response.prototype.getText = function() { |
- return this.text_; |
-}; |
- |
-/** |
- * Get the JSON content of the response. Requires acceptJson to have |
- * been true in the request. |
- * @return {*} The parsed JSON content of the response. |
- */ |
-remoting.Xhr.Response.prototype.getJson = function() { |
- base.debug.assert(this.allowJson_); |
- if (this.json_ === undefined) { |
- this.json_ = JSON.parse(this.text_); |
- } |
- return this.json_; |
-}; |
- |
-/** |
- * Takes an associative array of parameters and urlencodes it. |
- * |
- * @param {Object<string,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) { |
- var value = paramHash[key]; |
- if (value != null) { |
- paramArray.push(encodeURIComponent(key) + |
- '=' + encodeURIComponent(value)); |
- } |
- } |
- if (paramArray.length > 0) { |
- return paramArray.join('&'); |
- } |
- return ''; |
-}; |
- |
-})(); |
- |
-/** |
- * Parameters for the 'start' function. Unless otherwise noted, all |
- * parameters are optional. |
- * |
- * method: (required) The HTTP method to use. |
- * |
- * url: (required) The URL to request. |
- * |
- * urlParams: Parameters to be appended to the URL. Null-valued |
- * parameters are omitted. |
- * |
- * textContent: Text to be sent as the request body. |
- * |
- * formContent: Data to be URL-encoded and sent as the request body. |
- * Causes Content-type header to be set appropriately. |
- * |
- * jsonContent: Data to be JSON-encoded and sent as the request body. |
- * Causes Content-type header to be set appropriately. |
- * |
- * headers: Additional request headers to be sent. Null-valued |
- * headers are omitted. |
- * |
- * withCredentials: Value of the XHR's withCredentials field. |
- * |
- * oauthToken: An OAuth2 token used to construct an Authentication |
- * header. |
- * |
- * useIdentity: Use identity API to get an OAuth2 token. |
- * |
- * acceptJson: If true, send an Accept header indicating that a JSON |
- * response is expected. |
- * |
- * @typedef {{ |
- * method: string, |
- * url:string, |
- * urlParams:(string|Object<string,?string>|undefined), |
- * textContent:(string|undefined), |
- * formContent:(Object|undefined), |
- * jsonContent:(*|undefined), |
- * headers:(Object<string,?string>|undefined), |
- * withCredentials:(boolean|undefined), |
- * oauthToken:(string|undefined), |
- * useIdentity:(boolean|undefined), |
- * acceptJson:(boolean|undefined) |
- * }} |
- */ |
-remoting.Xhr.Params; |