Add an exponential backoff to rechecking the app list doodle.
[chromium-blink-merge.git] / third_party / polymer / components-chromium / core-ajax / core-xhr-extracted.js
blobadb0e58c35073b24421a1ab8ad04cd293fdda739
3     Polymer('core-xhr', {
5       /**
6        * Sends a HTTP request to the server and returns the XHR object.
7        *
8        * @method request
9        * @param {Object} inOptions
10        *    @param {String} inOptions.url The url to which the request is sent.
11        *    @param {String} inOptions.method The HTTP method to use, default is GET.
12        *    @param {boolean} inOptions.sync By default, all requests are sent asynchronously. To send synchronous requests, set to true.
13        *    @param {Object} inOptions.params Data to be sent to the server.
14        *    @param {Object} inOptions.body The content for the request body for POST method.
15        *    @param {Object} inOptions.headers HTTP request headers.
16        *    @param {String} inOptions.responseType The response type. Default is 'text'.
17        *    @param {boolean} inOptions.withCredentials Whether or not to send credentials on the request. Default is false.
18        *    @param {Object} inOptions.callback Called when request is completed.
19        * @returns {Object} XHR object.
20        */
21       request: function(options) {
22         var xhr = new XMLHttpRequest();
23         var url = options.url;
24         var method = options.method || 'GET';
25         var async = !options.sync;
26         //
27         var params = this.toQueryString(options.params);
28         if (params && method == 'GET') {
29           url += (url.indexOf('?') > 0 ? '&' : '?') + params;
30         }
31         var xhrParams = this.isBodyMethod(method) ? (options.body || params) : null;
32         //
33         xhr.open(method, url, async);
34         if (options.responseType) {
35           xhr.responseType = options.responseType;
36         }
37         if (options.withCredentials) {
38           xhr.withCredentials = true;
39         }
40         this.makeReadyStateHandler(xhr, options.callback);
41         this.setRequestHeaders(xhr, options.headers);
42         xhr.send(xhrParams);
43         if (!async) {
44           xhr.onreadystatechange(xhr);
45         }
46         return xhr;
47       },
48     
49       toQueryString: function(params) {
50         var r = [];
51         for (var n in params) {
52           var v = params[n];
53           n = encodeURIComponent(n);
54           r.push(v == null ? n : (n + '=' + encodeURIComponent(v)));
55         }
56         return r.join('&');
57       },
59       isBodyMethod: function(method) {
60         return this.bodyMethods[(method || '').toUpperCase()];
61       },
62       
63       bodyMethods: {
64         POST: 1,
65         PUT: 1,
66         PATCH: 1,
67         DELETE: 1
68       },
70       makeReadyStateHandler: function(xhr, callback) {
71         xhr.onreadystatechange = function() {
72           if (xhr.readyState == 4) {
73             callback && callback.call(null, xhr.response, xhr);
74           }
75         };
76       },
78       setRequestHeaders: function(xhr, headers) {
79         if (headers) {
80           for (var name in headers) {
81             xhr.setRequestHeader(name, headers[name]);
82           }
83         }
84       }
86     });
88