summaryrefslogtreecommitdiff
path: root/includes/js/dojo/_base/xhr.js
diff options
context:
space:
mode:
Diffstat (limited to 'includes/js/dojo/_base/xhr.js')
-rw-r--r--includes/js/dojo/_base/xhr.js730
1 files changed, 0 insertions, 730 deletions
diff --git a/includes/js/dojo/_base/xhr.js b/includes/js/dojo/_base/xhr.js
deleted file mode 100644
index f6e7f1a..0000000
--- a/includes/js/dojo/_base/xhr.js
+++ /dev/null
@@ -1,730 +0,0 @@
-if(!dojo._hasResource["dojo._base.xhr"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo._base.xhr"] = true;
-dojo.provide("dojo._base.xhr");
-dojo.require("dojo._base.Deferred");
-dojo.require("dojo._base.json");
-dojo.require("dojo._base.lang");
-dojo.require("dojo._base.query");
-
-(function(){
- var _d = dojo;
- function setValue(/*Object*/obj, /*String*/name, /*String*/value){
- //summary:
- // For the nameed property in object, set the value. If a value
- // already exists and it is a string, convert the value to be an
- // array of values.
- var val = obj[name];
- if(_d.isString(val)){
- obj[name] = [val, value];
- }else if(_d.isArray(val)){
- val.push(value);
- }else{
- obj[name] = value;
- }
- }
-
- dojo.formToObject = function(/*DOMNode||String*/ formNode){
- // summary:
- // dojo.formToObject returns the values encoded in an HTML form as
- // string properties in an object which it then returns. Disabled form
- // elements, buttons, and other non-value form elements are skipped.
- // Multi-select elements are returned as an array of string values.
- // description:
- // This form:
- //
- // | <form id="test_form">
- // | <input type="text" name="blah" value="blah">
- // | <input type="text" name="no_value" value="blah" disabled>
- // | <input type="button" name="no_value2" value="blah">
- // | <select type="select" multiple name="multi" size="5">
- // | <option value="blah">blah</option>
- // | <option value="thud" selected>thud</option>
- // | <option value="thonk" selected>thonk</option>
- // | </select>
- // | </form>
- //
- // yields this object structure as the result of a call to
- // formToObject():
- //
- // | {
- // | blah: "blah",
- // | multi: [
- // | "thud",
- // | "thonk"
- // | ]
- // | };
-
- var ret = {};
- var iq = "input:not([type=file]):not([type=submit]):not([type=image]):not([type=reset]):not([type=button]), select, textarea";
- _d.query(iq, formNode).filter(function(node){
- return !node.disabled && node.name;
- }).forEach(function(item){
- var _in = item.name;
- var type = (item.type||"").toLowerCase();
- if(type == "radio" || type == "checkbox"){
- if(item.checked){ setValue(ret, _in, item.value); }
- }else if(item.multiple){
- ret[_in] = [];
- _d.query("option", item).forEach(function(opt){
- if(opt.selected){
- setValue(ret, _in, opt.value);
- }
- });
- }else{
- setValue(ret, _in, item.value);
- if(type == "image"){
- ret[_in+".x"] = ret[_in+".y"] = ret[_in].x = ret[_in].y = 0;
- }
- }
- });
- return ret; // Object
- }
-
- dojo.objectToQuery = function(/*Object*/ map){
- // summary:
- // takes a name/value mapping object and returns a string representing
- // a URL-encoded version of that object.
- // example:
- // this object:
- //
- // | {
- // | blah: "blah",
- // | multi: [
- // | "thud",
- // | "thonk"
- // | ]
- // | };
- //
- // yields the following query string:
- //
- // | "blah=blah&multi=thud&multi=thonk"
-
- // FIXME: need to implement encodeAscii!!
- var enc = encodeURIComponent;
- var pairs = [];
- var backstop = {};
- for(var name in map){
- var value = map[name];
- if(value != backstop[name]){
- var assign = enc(name) + "=";
- if(_d.isArray(value)){
- for(var i=0; i < value.length; i++){
- pairs.push(assign + enc(value[i]));
- }
- }else{
- pairs.push(assign + enc(value));
- }
- }
- }
- return pairs.join("&"); // String
- }
-
- dojo.formToQuery = function(/*DOMNode||String*/ formNode){
- // summary:
- // Returns a URL-encoded string representing the form passed as either a
- // node or string ID identifying the form to serialize
- return _d.objectToQuery(_d.formToObject(formNode)); // String
- }
-
- dojo.formToJson = function(/*DOMNode||String*/ formNode, /*Boolean?*/prettyPrint){
- // summary:
- // return a serialized JSON string from a form node or string
- // ID identifying the form to serialize
- return _d.toJson(_d.formToObject(formNode), prettyPrint); // String
- }
-
- dojo.queryToObject = function(/*String*/ str){
- // summary:
- // returns an object representing a de-serialized query section of a
- // URL. Query keys with multiple values are returned in an array.
- // description:
- // This string:
- //
- // | "foo=bar&foo=baz&thinger=%20spaces%20=blah&zonk=blarg&"
- //
- // results in this object structure:
- //
- // | {
- // | foo: [ "bar", "baz" ],
- // | thinger: " spaces =blah",
- // | zonk: "blarg"
- // | }
- //
- // Note that spaces and other urlencoded entities are correctly
- // handled.
-
- // FIXME: should we grab the URL string if we're not passed one?
- var ret = {};
- var qp = str.split("&");
- var dec = decodeURIComponent;
- _d.forEach(qp, function(item){
- if(item.length){
- var parts = item.split("=");
- var name = dec(parts.shift());
- var val = dec(parts.join("="));
- if(_d.isString(ret[name])){
- ret[name] = [ret[name]];
- }
- if(_d.isArray(ret[name])){
- ret[name].push(val);
- }else{
- ret[name] = val;
- }
- }
- });
- return ret; // Object
- }
-
- /*
- from refactor.txt:
-
- all bind() replacement APIs take the following argument structure:
-
- {
- url: "blah.html",
-
- // all below are optional, but must be supported in some form by
- // every IO API
- timeout: 1000, // milliseconds
- handleAs: "text", // replaces the always-wrong "mimetype"
- content: {
- key: "value"
- },
-
- // browser-specific, MAY be unsupported
- sync: true, // defaults to false
- form: dojo.byId("someForm")
- }
- */
-
- // need to block async callbacks from snatching this thread as the result
- // of an async callback might call another sync XHR, this hangs khtml forever
- // must checked by watchInFlight()
-
- dojo._blockAsync = false;
-
- dojo._contentHandlers = {
- "text": function(xhr){ return xhr.responseText; },
- "json": function(xhr){
- if(!dojo.config.usePlainJson){
- console.warn("Consider using mimetype:text/json-comment-filtered"
- + " to avoid potential security issues with JSON endpoints"
- + " (use djConfig.usePlainJson=true to turn off this message)");
- }
- return (xhr.status == 204) ? undefined : _d.fromJson(xhr.responseText);
- },
- "json-comment-filtered": function(xhr){
- // NOTE: we provide the json-comment-filtered option as one solution to
- // the "JavaScript Hijacking" issue noted by Fortify and others. It is
- // not appropriate for all circumstances.
-
- var value = xhr.responseText;
- var cStartIdx = value.indexOf("\/*");
- var cEndIdx = value.lastIndexOf("*\/");
- if(cStartIdx == -1 || cEndIdx == -1){
- throw new Error("JSON was not comment filtered");
- }
- return (xhr.status == 204) ? undefined :
- _d.fromJson(value.substring(cStartIdx+2, cEndIdx));
- },
- "javascript": function(xhr){
- // FIXME: try Moz and IE specific eval variants?
- return _d.eval(xhr.responseText);
- },
- "xml": function(xhr){
- var result = xhr.responseXML;
- if(_d.isIE && (!result || window.location.protocol == "file:")){
- _d.forEach(["MSXML2", "Microsoft", "MSXML", "MSXML3"], function(prefix){
- try{
- var dom = new ActiveXObject(prefix + ".XMLDOM");
- dom.async = false;
- dom.loadXML(xhr.responseText);
- result = dom;
- }catch(e){ /* Not available. Squelch and try next one. */ }
- });
- }
- return result; // DOMDocument
- }
- };
-
- dojo._contentHandlers["json-comment-optional"] = function(xhr){
- var handlers = _d._contentHandlers;
- try{
- return handlers["json-comment-filtered"](xhr);
- }catch(e){
- return handlers["json"](xhr);
- }
- };
-
- /*=====
- dojo.__IoArgs = function(){
- // url: String
- // URL to server endpoint.
- // content: Object?
- // Contains properties with string values. These
- // properties will be serialized as name1=value2 and
- // passed in the request.
- // timeout: Integer?
- // Milliseconds to wait for the response. If this time
- // passes, the then error callbacks are called.
- // form: DOMNode?
- // DOM node for a form. Used to extract the form values
- // and send to the server.
- // preventCache: Boolean?
- // Default is false. If true, then a
- // "dojo.preventCache" parameter is sent in the request
- // with a value that changes with each request
- // (timestamp). Useful only with GET-type requests.
- // handleAs: String?
- // Acceptable values depend on the type of IO
- // transport (see specific IO calls for more information).
- // load: Function?
- // function(response, ioArgs){}. response is an Object, ioArgs
- // is of type dojo.__IoCallbackArgs. The load function will be
- // called on a successful response.
- // error: Function?
- // function(response, ioArgs){}. response is an Object, ioArgs
- // is of type dojo.__IoCallbackArgs. The error function will
- // be called in an error case.
- // handle: Function?
- // function(response, ioArgs){}. response is an Object, ioArgs
- // is of type dojo.__IoCallbackArgs. The handle function will
- // be called in either the successful or error case. For
- // the load, error and handle functions, the ioArgs object
- // will contain the following properties:
- this.url = url;
- this.content = content;
- this.timeout = timeout;
- this.form = form;
- this.preventCache = preventCache;
- this.handleAs = handleAs;
- this.load = load;
- this.error = error;
- this.handle = handle;
- }
- =====*/
-
- /*=====
- dojo.__IoCallbackArgs = function(args, xhr, url, query, handleAs, id, canDelete, json){
- // args: Object
- // the original object argument to the IO call.
- // xhr: XMLHttpRequest
- // For XMLHttpRequest calls only, the
- // XMLHttpRequest object that was used for the
- // request.
- // url: String
- // The final URL used for the call. Many times it
- // will be different than the original args.url
- // value.
- // query: String
- // For non-GET requests, the
- // name1=value1&name2=value2 parameters sent up in
- // the request.
- // handleAs: String
- // The final indicator on how the response will be
- // handled.
- // id: String
- // For dojo.io.script calls only, the internal
- // script ID used for the request.
- // canDelete: Boolean
- // For dojo.io.script calls only, indicates
- // whether the script tag that represents the
- // request can be deleted after callbacks have
- // been called. Used internally to know when
- // cleanup can happen on JSONP-type requests.
- // json: Object
- // For dojo.io.script calls only: holds the JSON
- // response for JSONP-type requests. Used
- // internally to hold on to the JSON responses.
- // You should not need to access it directly --
- // the same object should be passed to the success
- // callbacks directly.
- this.args = args;
- this.xhr = xhr;
- this.url = url;
- this.query = query;
- this.handleAs = handleAs;
- this.id = id;
- this.canDelete = canDelete;
- this.json = json;
- }
- =====*/
-
-
-
- dojo._ioSetArgs = function(/*dojo.__IoArgs*/args,
- /*Function*/canceller,
- /*Function*/okHandler,
- /*Function*/errHandler){
- // summary:
- // sets up the Deferred and ioArgs property on the Deferred so it
- // can be used in an io call.
- // args:
- // The args object passed into the public io call. Recognized properties on
- // the args object are:
- // canceller:
- // The canceller function used for the Deferred object. The function
- // will receive one argument, the Deferred object that is related to the
- // canceller.
- // okHandler:
- // The first OK callback to be registered with Deferred. It has the opportunity
- // to transform the OK response. It will receive one argument -- the Deferred
- // object returned from this function.
- // errHandler:
- // The first error callback to be registered with Deferred. It has the opportunity
- // to do cleanup on an error. It will receive two arguments: error (the
- // Error object) and dfd, the Deferred object returned from this function.
-
- var ioArgs = {args: args, url: args.url};
-
- //Get values from form if requestd.
- var formObject = null;
- if(args.form){
- var form = _d.byId(args.form);
- //IE requires going through getAttributeNode instead of just getAttribute in some form cases,
- //so use it for all. See #2844
- var actnNode = form.getAttributeNode("action");
- ioArgs.url = ioArgs.url || (actnNode ? actnNode.value : null);
- formObject = _d.formToObject(form);
- }
-
- // set up the query params
- var miArgs = [{}];
-
- if(formObject){
- // potentially over-ride url-provided params w/ form values
- miArgs.push(formObject);
- }
- if(args.content){
- // stuff in content over-rides what's set by form
- miArgs.push(args.content);
- }
- if(args.preventCache){
- miArgs.push({"dojo.preventCache": new Date().valueOf()});
- }
- ioArgs.query = _d.objectToQuery(_d.mixin.apply(null, miArgs));
-
- // .. and the real work of getting the deferred in order, etc.
- ioArgs.handleAs = args.handleAs || "text";
- var d = new _d.Deferred(canceller);
- d.addCallbacks(okHandler, function(error){
- return errHandler(error, d);
- });
-
- //Support specifying load, error and handle callback functions from the args.
- //For those callbacks, the "this" object will be the args object.
- //The callbacks will get the deferred result value as the
- //first argument and the ioArgs object as the second argument.
- var ld = args.load;
- if(ld && _d.isFunction(ld)){
- d.addCallback(function(value){
- return ld.call(args, value, ioArgs);
- });
- }
- var err = args.error;
- if(err && _d.isFunction(err)){
- d.addErrback(function(value){
- return err.call(args, value, ioArgs);
- });
- }
- var handle = args.handle;
- if(handle && _d.isFunction(handle)){
- d.addBoth(function(value){
- return handle.call(args, value, ioArgs);
- });
- }
-
- d.ioArgs = ioArgs;
-
- // FIXME: need to wire up the xhr object's abort method to something
- // analagous in the Deferred
- return d;
- }
-
- var _deferredCancel = function(/*Deferred*/dfd){
- //summary: canceller function for dojo._ioSetArgs call.
-
- dfd.canceled = true;
- var xhr = dfd.ioArgs.xhr;
- var _at = typeof xhr.abort;
- if(_at == "function" || _at == "unknown"){
- xhr.abort();
- }
- var err = new Error("xhr cancelled");
- err.dojoType = "cancel";
- return err;
- }
- var _deferredOk = function(/*Deferred*/dfd){
- //summary: okHandler function for dojo._ioSetArgs call.
-
- return _d._contentHandlers[dfd.ioArgs.handleAs](dfd.ioArgs.xhr);
- }
- var _deferError = function(/*Error*/error, /*Deferred*/dfd){
- //summary: errHandler function for dojo._ioSetArgs call.
-
- // console.debug("xhr error in:", dfd.ioArgs.xhr);
- console.debug(error);
- return error;
- }
-
- var _makeXhrDeferred = function(/*dojo.__XhrArgs*/args){
- //summary: makes the Deferred object for this xhr request.
- var dfd = _d._ioSetArgs(args, _deferredCancel, _deferredOk, _deferError);
- //Pass the args to _xhrObj, to allow xhr iframe proxy interceptions.
- dfd.ioArgs.xhr = _d._xhrObj(dfd.ioArgs.args);
- return dfd;
- }
-
- // avoid setting a timer per request. It degrades performance on IE
- // something fierece if we don't use unified loops.
- var _inFlightIntvl = null;
- var _inFlight = [];
- var _watchInFlight = function(){
- //summary:
- // internal method that checks each inflight XMLHttpRequest to see
- // if it has completed or if the timeout situation applies.
-
- var now = (new Date()).getTime();
- // make sure sync calls stay thread safe, if this callback is called
- // during a sync call and this results in another sync call before the
- // first sync call ends the browser hangs
- if(!_d._blockAsync){
- // we need manual loop because we often modify _inFlight (and therefore 'i') while iterating
- // note: the second clause is an assigment on purpose, lint may complain
- for(var i = 0, tif; i < _inFlight.length && (tif = _inFlight[i]); i++){
- var dfd = tif.dfd;
- try{
- if(!dfd || dfd.canceled || !tif.validCheck(dfd)){
- _inFlight.splice(i--, 1);
- }else if(tif.ioCheck(dfd)){
- _inFlight.splice(i--, 1);
- tif.resHandle(dfd);
- }else if(dfd.startTime){
- //did we timeout?
- if(dfd.startTime + (dfd.ioArgs.args.timeout || 0) < now){
- _inFlight.splice(i--, 1);
- var err = new Error("timeout exceeded");
- err.dojoType = "timeout";
- dfd.errback(err);
- //Cancel the request so the io module can do appropriate cleanup.
- dfd.cancel();
- }
- }
- }catch(e){
- // FIXME: make sure we errback! (fixed? remove console.debug?)
- console.debug(e);
- dfd.errback(new Error("_watchInFlightError!"));
- }
- }
- }
-
- if(!_inFlight.length){
- clearInterval(_inFlightIntvl);
- _inFlightIntvl = null;
- return;
- }
-
- }
-
- dojo._ioCancelAll = function(){
- //summary: Cancels all pending IO requests, regardless of IO type
- //(xhr, script, iframe).
- try{
- _d.forEach(_inFlight, function(i){
- i.dfd.cancel();
- });
- }catch(e){/*squelch*/}
- }
-
- //Automatically call cancel all io calls on unload
- //in IE for trac issue #2357.
- if(_d.isIE){
- _d.addOnUnload(_d._ioCancelAll);
- }
-
- _d._ioWatch = function(/*Deferred*/dfd,
- /*Function*/validCheck,
- /*Function*/ioCheck,
- /*Function*/resHandle){
- //summary: watches the io request represented by dfd to see if it completes.
- //dfd:
- // The Deferred object to watch.
- //validCheck:
- // Function used to check if the IO request is still valid. Gets the dfd
- // object as its only argument.
- //ioCheck:
- // Function used to check if basic IO call worked. Gets the dfd
- // object as its only argument.
- //resHandle:
- // Function used to process response. Gets the dfd
- // object as its only argument.
- if(dfd.ioArgs.args.timeout){
- dfd.startTime = (new Date()).getTime();
- }
- _inFlight.push({dfd: dfd, validCheck: validCheck, ioCheck: ioCheck, resHandle: resHandle});
- if(!_inFlightIntvl){
- _inFlightIntvl = setInterval(_watchInFlight, 50);
- }
- _watchInFlight(); // handle sync requests
- }
-
- var _defaultContentType = "application/x-www-form-urlencoded";
-
- var _validCheck = function(/*Deferred*/dfd){
- return dfd.ioArgs.xhr.readyState; //boolean
- }
- var _ioCheck = function(/*Deferred*/dfd){
- return 4 == dfd.ioArgs.xhr.readyState; //boolean
- }
- var _resHandle = function(/*Deferred*/dfd){
- var xhr = dfd.ioArgs.xhr;
- if(_d._isDocumentOk(xhr)){
- dfd.callback(dfd);
- }else{
- var err = new Error("Unable to load " + dfd.ioArgs.url + " status:" + xhr.status);
- err.status = xhr.status;
- err.responseText = xhr.responseText;
- dfd.errback(err);
- }
- }
-
- var _doIt = function(/*String*/type, /*Deferred*/dfd){
- // IE 6 is a steaming pile. It won't let you call apply() on the native function (xhr.open).
- // workaround for IE6's apply() "issues"
- var ioArgs = dfd.ioArgs;
- var args = ioArgs.args;
- var xhr = ioArgs.xhr;
- xhr.open(type, ioArgs.url, args.sync !== true, args.user || undefined, args.password || undefined);
- if(args.headers){
- for(var hdr in args.headers){
- if(hdr.toLowerCase() === "content-type" && !args.contentType){
- args.contentType = args.headers[hdr];
- }else{
- xhr.setRequestHeader(hdr, args.headers[hdr]);
- }
- }
- }
- // FIXME: is this appropriate for all content types?
- xhr.setRequestHeader("Content-Type", args.contentType || _defaultContentType);
- if(!args.headers || !args.headers["X-Requested-With"]){
- xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
- }
- // FIXME: set other headers here!
- try{
- xhr.send(ioArgs.query);
- }catch(e){
- dfd.cancel();
- }
- _d._ioWatch(dfd, _validCheck, _ioCheck, _resHandle);
- xhr = null;
- return dfd; //Deferred
- }
-
- dojo._ioAddQueryToUrl = function(/*dojo.__IoCallbackArgs*/ioArgs){
- //summary: Adds query params discovered by the io deferred construction to the URL.
- //Only use this for operations which are fundamentally GET-type operations.
- if(ioArgs.query.length){
- ioArgs.url += (ioArgs.url.indexOf("?") == -1 ? "?" : "&") + ioArgs.query;
- ioArgs.query = null;
- }
- }
-
- /*=====
- dojo.declare("dojo.__XhrArgs", dojo.__IoArgs, {
- constructor: function(){
- // summary:
- // In addition to the properties listed for the dojo._IoArgs type,
- // the following properties are allowed for dojo.xhr* methods.
- // handleAs: String?
- // Acceptable values are: text (default), json, json-comment-optional,
- // json-comment-filtered, javascript, xml
- // sync: Boolean?
- // false is default. Indicates whether the request should
- // be a synchronous (blocking) request.
- // headers: Object?
- // Additional HTTP headers to send in the request.
- this.handleAs = handleAs;
- this.sync = sync;
- this.headers = headers;
- }
- });
- =====*/
-
- dojo.xhr = function(/*String*/ method, /*dojo.__XhrArgs*/ args, /*Boolean?*/ hasBody){
- // summary:
- // Sends an HTTP request with the given method. If the request has an
- // HTTP body, then pass true for hasBody. The method argument should be uppercase.
- // Also look at dojo.xhrGet(), xhrPost(), xhrPut() and dojo.xhrDelete() for shortcuts
- // for those HTTP methods. There are also methods for "raw" PUT and POST methods
- // via dojo.rawXhrPut() and dojo.rawXhrPost() respectively.
- var dfd = _makeXhrDeferred(args);
- if(!hasBody){
- _d._ioAddQueryToUrl(dfd.ioArgs);
- }
- return _doIt(method, dfd); // dojo.Deferred
- }
-
- dojo.xhrGet = function(/*dojo.__XhrArgs*/ args){
- // summary:
- // Sends an HTTP GET request to the server.
- return _d.xhr("GET", args); //dojo.Deferred
- }
-
- dojo.xhrPost = function(/*dojo.__XhrArgs*/ args){
- //summary:
- // Sends an HTTP POST request to the server.
- return _d.xhr("POST", args, true); // dojo.Deferred
- }
-
- dojo.rawXhrPost = function(/*dojo.__XhrArgs*/ args){
- // summary:
- // Sends an HTTP POST request to the server. In addtion to the properties
- // listed for the dojo.__XhrArgs type, the following property is allowed:
- // postData:
- // String. The raw data to send in the body of the POST request.
- var dfd = _makeXhrDeferred(args);
- dfd.ioArgs.query = args.postData;
- return _doIt("POST", dfd); // dojo.Deferred
- }
-
- dojo.xhrPut = function(/*dojo.__XhrArgs*/ args){
- // summary:
- // Sends an HTTP PUT request to the server.
- return _d.xhr("PUT", args, true); // dojo.Deferred
- }
-
- dojo.rawXhrPut = function(/*dojo.__XhrArgs*/ args){
- // summary:
- // Sends an HTTP PUT request to the server. In addtion to the properties
- // listed for the dojo.__XhrArgs type, the following property is allowed:
- // putData:
- // String. The raw data to send in the body of the PUT request.
- var dfd = _makeXhrDeferred(args);
- var ioArgs = dfd.ioArgs;
- if(args.putData){
- ioArgs.query = args.putData;
- args.putData = null;
- }
- return _doIt("PUT", dfd); // dojo.Deferred
- }
-
- dojo.xhrDelete = function(/*dojo.__XhrArgs*/ args){
- // summary:
- // Sends an HTTP DELETE request to the server.
- return _d.xhr("DELETE", args); //dojo.Deferred
- }
-
- /*
- dojo.wrapForm = function(formNode){
- //summary:
- // A replacement for FormBind, but not implemented yet.
-
- // FIXME: need to think harder about what extensions to this we might
- // want. What should we allow folks to do w/ this? What events to
- // set/send?
- throw new Error("dojo.wrapForm not yet implemented");
- }
- */
-})();
-
-}