/usr/share/javascript/yui3/jsonp/jsonp.js is in libjs-yui3-full 3.5.1-1ubuntu3.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 | /*
YUI 3.5.1 (build 22)
Copyright 2012 Yahoo! Inc. All rights reserved.
Licensed under the BSD License.
http://yuilibrary.com/license/
*/
YUI.add('jsonp', function(Y) {
var isFunction = Y.Lang.isFunction;
/**
* <p>Provides a JSONPRequest class for repeated JSONP calls, and a convenience
* method Y.jsonp(url, callback) to instantiate and send a JSONP request.</p>
*
* <p>Both the constructor as well as the convenience function take two
* parameters: a url string and a callback.</p>
*
* <p>The url provided must include the placeholder string
* "{callback}" which will be replaced by a dynamically
* generated routing function to pass the data to your callback function.
* An example url might look like
* "http://example.com/service?callback={callback}".</p>
*
* <p>The second parameter can be a callback function that accepts the JSON
* payload as its argument, or a configuration object supporting the keys:</p>
* <ul>
* <li>on - map of callback subscribers
* <ul>
* <li>success - function handler for successful transmission</li>
* <li>failure - function handler for failed transmission</li>
* <li>timeout - function handler for transactions that timeout</li>
* </ul>
* </li>
* <li>format - override function for inserting the proxy name in the url</li>
* <li>timeout - the number of milliseconds to wait before giving up</li>
* <li>context - becomes <code>this</code> in the callbacks</li>
* <li>args - array of subsequent parameters to pass to the callbacks</li>
* <li>allowCache - use the same proxy name for all requests? (boolean)</li>
* </ul>
*
* @module jsonp
* @class JSONPRequest
* @constructor
* @param url {String} the url of the JSONP service
* @param callback {Object|Function} the default callback configuration or
* success handler
*/
function JSONPRequest() {
this._init.apply(this, arguments);
}
JSONPRequest.prototype = {
/**
* Set up the success and failure handlers and the regex pattern used
* to insert the temporary callback name in the url.
*
* @method _init
* @param url {String} the url of the JSONP service
* @param callback {Object|Function} Optional success callback or config
* object containing success and failure functions and
* the url regex.
* @protected
*/
_init : function (url, callback) {
this.url = url;
/**
* Map of the number of requests currently pending responses per
* generated proxy. Used to ensure the proxy is not flushed if the
* request times out and there is a timeout handler and success
* handler, and used by connections configured to allowCache to make
* sure the proxy isn't deleted until the last response has returned.
*
* @property _requests
* @private
* @type {Object}
*/
this._requests = {};
/**
* Map of the number of timeouts received from the destination url
* by generated proxy. Used to ensure the proxy is not flushed if the
* request times out and there is a timeout handler and success
* handler, and used by connections configured to allowCache to make
* sure the proxy isn't deleted until the last response has returned.
*
* @property _timeouts
* @private
* @type {Object}
*/
this._timeouts = {};
// Accept a function, an object, or nothing
callback = (isFunction(callback)) ?
{ on: { success: callback } } :
callback || {};
var subs = callback.on || {};
if (!subs.success) {
subs.success = this._defaultCallback(url, callback);
}
// Apply defaults and store
this._config = Y.merge({
context: this,
args : [],
format : this._format,
allowCache: false
}, callback, { on: subs });
},
/**
* Override this method to provide logic to default the success callback if
* it is not provided at construction. This is overridden by jsonp-url to
* parse the callback from the url string.
*
* @method _defaultCallback
* @param url {String} the url passed at construction
* @param config {Object} (optional) the config object passed at
* construction
* @return {Function}
*/
_defaultCallback: function () {},
/**
* Issues the JSONP request.
*
* @method send
* @param args* {any} any additional arguments to pass to the url formatter
* beyond the base url and the proxy function name
* @chainable
*/
send : function () {
var self = this,
args = Y.Array(arguments, 0, true),
config = self._config,
proxy = self._proxy || Y.guid(),
url;
// TODO: support allowCache as time value
if (config.allowCache) {
self._proxy = proxy;
}
if (self._requests[proxy] === undefined) {
self._requests[proxy] = 0;
}
if (self._timeouts[proxy] === undefined) {
self._timeouts[proxy] = 0;
}
self._requests[proxy]++;
args.unshift(self.url, 'YUI.Env.JSONP.' + proxy);
url = config.format.apply(self, args);
if (!config.on.success) {
return self;
}
function wrap(fn, isTimeout) {
return (isFunction(fn)) ?
function (data) {
var execute = true,
counter = '_requests';
//if (config.allowCache) {
// A lot of wrangling to make sure timeouts result in
// fewer success callbacks, but the proxy is properly
// cleaned up.
if (isTimeout) {
++self._timeouts[proxy];
--self._requests[proxy];
} else {
if (!self._requests[proxy]) {
execute = false;
counter = '_timeouts';
}
--self[counter][proxy];
}
//}
if (!self._requests[proxy] && !self._timeouts[proxy]) {
delete YUI.Env.JSONP[proxy];
}
if (execute) {
fn.apply(config.context, [data].concat(config.args));
}
} :
null;
}
// Temporary un-sandboxed function alias
// TODO: queuing
YUI.Env.JSONP[proxy] = wrap(config.on.success);
Y.Get.script(url, {
onFailure : wrap(config.on.failure),
onTimeout : wrap(config.on.timeout, true),
timeout : config.timeout,
charset : config.charset,
attributes: config.attributes
});
return self;
},
/**
* Default url formatter. Looks for callback= in the url and appends it
* if not present. The supplied proxy name will be assigned to the query
* param. Override this method by passing a function as the
* "format" property in the config object to the constructor.
*
* @method _format
* @param url { String } the original url
* @param proxy {String} the function name that will be used as a proxy to
* the configured callback methods.
* @param args* {any} additional args passed to send()
* @return {String} fully qualified JSONP url
* @protected
*/
_format: function (url, proxy) {
return url.replace(/\{callback\}/, proxy);
}
};
Y.JSONPRequest = JSONPRequest;
/**
*
* @method jsonp
* @param url {String} the url of the JSONP service with the {callback}
* placeholder where the callback function name typically goes.
* @param c {Function|Object} Callback function accepting the JSON payload
* as its argument, or a configuration object (see above).
* @param args* {any} additional arguments to pass to send()
* @return {JSONPRequest}
* @static
* @for YUI
*/
Y.jsonp = function (url,c) {
var req = new Y.JSONPRequest(url,c);
return req.send.apply(req, Y.Array(arguments, 2, true));
};
if (!YUI.Env.JSONP) {
YUI.Env.JSONP = {};
}
}, '3.5.1' ,{requires:['get','oop']});
|