| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280 | <!DOCTYPE html><html><head>  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  <title>The source code</title>  <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />  <script type="text/javascript" src="../resources/prettify/prettify.js"></script>  <style type="text/css">    .highlight { display: block; background-color: #ddd; }  </style>  <script type="text/javascript">    function highlight() {      document.getElementById(location.hash.replace(/#/, "")).className = "highlight";    }  </script></head><body onload="prettyPrint(); highlight();">  <pre class="prettyprint lang-js"><span id='Ext-data-JsonP'>/**</span> * @class Ext.data.JsonP * @singleton * This class is used to create JSONP requests. JSONP is a mechanism that allows for making * requests for data cross domain. More information is available <a href="http://en.wikipedia.org/wiki/JSONP">here</a>. */Ext.define('Ext.data.JsonP', {    /* Begin Definitions */    singleton: true,    /* End Definitions */<span id='Ext-data-JsonP-property-requestCount'>    /**</span>     * Number of requests done so far.     * @private     */    requestCount: 0,<span id='Ext-data-JsonP-property-requests'>    /**</span>     * Hash of pending requests.     * @private     */    requests: {},<span id='Ext-data-JsonP-property-timeout'>    /**</span>     * @property timeout     * @type Number     * A default timeout for any JsonP requests. If the request has not completed in this time the     * failure callback will be fired. The timeout is in ms. Defaults to <tt>30000</tt>.     */    timeout: 30000,<span id='Ext-data-JsonP-property-disableCaching'>    /**</span>     * @property disableCaching     * @type Boolean     * True to add a unique cache-buster param to requests. Defaults to <tt>true</tt>.     */    disableCaching: true,<span id='Ext-data-JsonP-property-disableCachingParam'>    /**</span>     * @property disableCachingParam     * @type String     * Change the parameter which is sent went disabling caching through a cache buster. Defaults to <tt>'_dc'</tt>.     */    disableCachingParam: '_dc',<span id='Ext-data-JsonP-property-callbackKey'>    /**</span>     * @property callbackKey     * @type String     * Specifies the GET parameter that will be sent to the server containing the function name to be executed when     * the request completes. Defaults to <tt>callback</tt>. Thus, a common request will be in the form of     * url?callback=Ext.data.JsonP.callback1     */    callbackKey: 'callback',<span id='Ext-data-JsonP-method-request'>    /**</span>     * Makes a JSONP request.     * @param {Object} options An object which may contain the following properties. Note that options will     * take priority over any defaults that are specified in the class.     * <ul>     * <li><b>url</b> : String <div class="sub-desc">The URL to request.</div></li>     * <li><b>params</b> : Object (Optional)<div class="sub-desc">An object containing a series of     * key value pairs that will be sent along with the request.</div></li>     * <li><b>timeout</b> : Number (Optional) <div class="sub-desc">See {@link #timeout}</div></li>     * <li><b>callbackKey</b> : String (Optional) <div class="sub-desc">See {@link #callbackKey}</div></li>     * <li><b>callbackName</b> : String (Optional) <div class="sub-desc">The function name to use for this request.     * By default this name will be auto-generated: Ext.data.JsonP.callback1, Ext.data.JsonP.callback2, etc.     * Setting this option to "my_name" will force the function name to be Ext.data.JsonP.my_name.     * Use this if you want deterministic behavior, but be careful - the callbackName should be different     * in each JsonP request that you make.</div></li>     * <li><b>disableCaching</b> : Boolean (Optional) <div class="sub-desc">See {@link #disableCaching}</div></li>     * <li><b>disableCachingParam</b> : String (Optional) <div class="sub-desc">See {@link #disableCachingParam}</div></li>     * <li><b>success</b> : Function (Optional) <div class="sub-desc">A function to execute if the request succeeds.</div></li>     * <li><b>failure</b> : Function (Optional) <div class="sub-desc">A function to execute if the request fails.</div></li>     * <li><b>callback</b> : Function (Optional) <div class="sub-desc">A function to execute when the request     * completes, whether it is a success or failure.</div></li>     * <li><b>scope</b> : Object (Optional)<div class="sub-desc">The scope in     * which to execute the callbacks: The "this" object for the callback function. Defaults to the browser window.</div></li>     * </ul>     * @return {Object} request An object containing the request details.     */    request: function(options){        options = Ext.apply({}, options);        //<debug>        if (!options.url) {            Ext.Error.raise('A url must be specified for a JSONP request.');        }        //</debug>        var me = this,            disableCaching = Ext.isDefined(options.disableCaching) ? options.disableCaching : me.disableCaching,            cacheParam = options.disableCachingParam || me.disableCachingParam,            id = ++me.requestCount,            callbackName = options.callbackName || 'callback' + id,            callbackKey = options.callbackKey || me.callbackKey,            timeout = Ext.isDefined(options.timeout) ? options.timeout : me.timeout,            params = Ext.apply({}, options.params),            url = options.url,            name = Ext.name,            request,            script;        params[callbackKey] = name + '.data.JsonP.' + callbackName;        if (disableCaching) {            params[cacheParam] = new Date().getTime();        }        script = me.createScript(url, params, options);        me.requests[id] = request = {            url: url,            params: params,            script: script,            id: id,            scope: options.scope,            success: options.success,            failure: options.failure,            callback: options.callback,            callbackKey: callbackKey,            callbackName: callbackName        };        if (timeout > 0) {            request.timeout = setTimeout(Ext.bind(me.handleTimeout, me, [request]), timeout);        }        me.setupErrorHandling(request);        me[callbackName] = Ext.bind(me.handleResponse, me, [request], true);        me.loadScript(request);        return request;    },<span id='Ext-data-JsonP-method-abort'>    /**</span>     * Abort a request. If the request parameter is not specified all open requests will     * be aborted.     * @param {Object/String} request (Optional) The request to abort     */    abort: function(request){        var me = this,            requests = me.requests,            key;        if (request) {            if (!request.id) {                request = requests[request];            }            me.handleAbort(request);        } else {            for (key in requests) {                if (requests.hasOwnProperty(key)) {                    me.abort(requests[key]);                }            }        }    },<span id='Ext-data-JsonP-method-setupErrorHandling'>    /**</span>     * Sets up error handling for the script     * @private     * @param {Object} request The request     */    setupErrorHandling: function(request){        request.script.onerror = Ext.bind(this.handleError, this, [request]);    },<span id='Ext-data-JsonP-method-handleAbort'>    /**</span>     * Handles any aborts when loading the script     * @private     * @param {Object} request The request     */    handleAbort: function(request){        request.errorType = 'abort';        this.handleResponse(null, request);    },<span id='Ext-data-JsonP-method-handleError'>    /**</span>     * Handles any script errors when loading the script     * @private     * @param {Object} request The request     */    handleError: function(request){        request.errorType = 'error';        this.handleResponse(null, request);    },<span id='Ext-data-JsonP-method-cleanupErrorHandling'>    /**</span>     * Cleans up anu script handling errors     * @private     * @param {Object} request The request     */    cleanupErrorHandling: function(request){        request.script.onerror = null;    },<span id='Ext-data-JsonP-method-handleTimeout'>    /**</span>     * Handle any script timeouts     * @private     * @param {Object} request The request     */    handleTimeout: function(request){        request.errorType = 'timeout';        this.handleResponse(null, request);    },<span id='Ext-data-JsonP-method-handleResponse'>    /**</span>     * Handle a successful response     * @private     * @param {Object} result The result from the request     * @param {Object} request The request     */    handleResponse: function(result, request){        var success = true;        if (request.timeout) {            clearTimeout(request.timeout);        }        delete this[request.callbackName];        delete this.requests[request.id];        this.cleanupErrorHandling(request);        Ext.fly(request.script).remove();        if (request.errorType) {            success = false;            Ext.callback(request.failure, request.scope, [request.errorType]);        } else {            Ext.callback(request.success, request.scope, [result]);        }        Ext.callback(request.callback, request.scope, [success, result, request.errorType]);    },<span id='Ext-data-JsonP-method-createScript'>    /**</span>     * Create the script tag given the specified url, params and options. The options     * parameter is passed to allow an override to access it.     * @private     * @param {String} url The url of the request     * @param {Object} params Any extra params to be sent     * @param {Object} options The object passed to {@link #request}.     */    createScript: function(url, params, options) {        var script = document.createElement('script');        script.setAttribute("src", Ext.urlAppend(url, Ext.Object.toQueryString(params)));        script.setAttribute("async", true);        script.setAttribute("type", "text/javascript");        return script;    },<span id='Ext-data-JsonP-method-loadScript'>    /**</span>     * Loads the script for the given request by appending it to the HEAD element. This is     * its own method so that users can override it (as well as {@link #createScript}).     * @private     * @param request The request object.     */    loadScript: function (request) {        Ext.getHead().appendChild(request.script);    }});</pre></body></html>
 |