| Index: third_party/polymer/components/core-ajax/core-ajax.html
|
| diff --git a/third_party/polymer/components/core-ajax/core-ajax.html b/third_party/polymer/components/core-ajax/core-ajax.html
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..db841dcd8b2a875b6beeca7ee713ecbde7a67629
|
| --- /dev/null
|
| +++ b/third_party/polymer/components/core-ajax/core-ajax.html
|
| @@ -0,0 +1,323 @@
|
| +<!--
|
| +Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
|
| +This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
|
| +The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
|
| +The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
|
| +Code distributed by Google as part of the polymer project is also
|
| +subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
|
| +-->
|
| +
|
| +<!--
|
| +@group Polymer Core Elements
|
| +
|
| +The `core-ajax` element exposes `XMLHttpRequest` functionality.
|
| +
|
| + <core-ajax
|
| + auto
|
| + url="http://gdata.youtube.com/feeds/api/videos/"
|
| + params='{"alt":"json", "q":"chrome"}'
|
| + handleAs="json"
|
| + on-core-response="{{handleResponse}}"></core-ajax>
|
| +
|
| +With `auto` set to `true`, the element performs a request whenever
|
| +its `url` or `params` properties are changed.
|
| +
|
| +Note: The `params` attribute must be double quoted JSON.
|
| +
|
| +You can trigger a request explicitly by calling `go` on the
|
| +element.
|
| +
|
| +@element core-ajax
|
| +@status beta
|
| +@homepage github.io
|
| +-->
|
| +<link rel="import" href="core-xhr.html">
|
| +<polymer-element name="core-ajax" hidden attributes="url handleAs auto params response method headers body contentType withCredentials">
|
| +<script>
|
| +
|
| + Polymer('core-ajax', {
|
| + /**
|
| + * Fired when a response is received.
|
| + *
|
| + * @event core-response
|
| + */
|
| +
|
| + /**
|
| + * Fired when an error is received.
|
| + *
|
| + * @event core-error
|
| + */
|
| +
|
| + /**
|
| + * Fired whenever a response or an error is received.
|
| + *
|
| + * @event core-complete
|
| + */
|
| +
|
| + /**
|
| + * The URL target of the request.
|
| + *
|
| + * @attribute url
|
| + * @type string
|
| + * @default ''
|
| + */
|
| + url: '',
|
| +
|
| + /**
|
| + * Specifies what data to store in the `response` property, and
|
| + * to deliver as `event.response` in `response` events.
|
| + *
|
| + * One of:
|
| + *
|
| + * `text`: uses `XHR.responseText`.
|
| + *
|
| + * `xml`: uses `XHR.responseXML`.
|
| + *
|
| + * `json`: uses `XHR.responseText` parsed as JSON.
|
| + *
|
| + * `arraybuffer`: uses `XHR.response`.
|
| + *
|
| + * `blob`: uses `XHR.response`.
|
| + *
|
| + * `document`: uses `XHR.response`.
|
| + *
|
| + * @attribute handleAs
|
| + * @type string
|
| + * @default 'text'
|
| + */
|
| + handleAs: '',
|
| +
|
| + /**
|
| + * If true, automatically performs an Ajax request when either `url` or `params` changes.
|
| + *
|
| + * @attribute auto
|
| + * @type boolean
|
| + * @default false
|
| + */
|
| + auto: false,
|
| +
|
| + /**
|
| + * Parameters to send to the specified URL, as JSON.
|
| + *
|
| + * @attribute params
|
| + * @type string (JSON)
|
| + * @default ''
|
| + */
|
| + params: '',
|
| +
|
| + /**
|
| + * Returns the response object.
|
| + *
|
| + * @attribute response
|
| + * @type Object
|
| + * @default null
|
| + */
|
| + response: null,
|
| +
|
| + /**
|
| + * The HTTP method to use such as 'GET', 'POST', 'PUT', or 'DELETE'.
|
| + * Default is 'GET'.
|
| + *
|
| + * @attribute method
|
| + * @type string
|
| + * @default ''
|
| + */
|
| + method: '',
|
| +
|
| + /**
|
| + * HTTP request headers to send.
|
| + *
|
| + * Example:
|
| + *
|
| + * <core-ajax
|
| + * auto
|
| + * url="http://somesite.com"
|
| + * headers='{"X-Requested-With": "XMLHttpRequest"}'
|
| + * handleAs="json"
|
| + * on-core-response="{{handleResponse}}"></core-ajax>
|
| + *
|
| + * @attribute headers
|
| + * @type Object
|
| + * @default null
|
| + */
|
| + headers: null,
|
| +
|
| + /**
|
| + * Optional raw body content to send when method === "POST".
|
| + *
|
| + * Example:
|
| + *
|
| + * <core-ajax method="POST" auto url="http://somesite.com"
|
| + * body='{"foo":1, "bar":2}'>
|
| + * </core-ajax>
|
| + *
|
| + * @attribute body
|
| + * @type Object
|
| + * @default null
|
| + */
|
| + body: null,
|
| +
|
| + /**
|
| + * Content type to use when sending data.
|
| + *
|
| + * @attribute contentType
|
| + * @type string
|
| + * @default 'application/x-www-form-urlencoded'
|
| + */
|
| + contentType: 'application/x-www-form-urlencoded',
|
| +
|
| + /**
|
| + * Set the withCredentials flag on the request.
|
| + *
|
| + * @attribute withCredentials
|
| + * @type boolean
|
| + * @default false
|
| + */
|
| + withCredentials: false,
|
| +
|
| + /**
|
| + * Additional properties to send to core-xhr.
|
| + *
|
| + * Can be set to an object containing default properties
|
| + * to send as arguments to the `core-xhr.request()` method
|
| + * which implements the low-level communication.
|
| + *
|
| + * @property xhrArgs
|
| + * @type Object
|
| + * @default null
|
| + */
|
| + xhrArgs: null,
|
| +
|
| + ready: function() {
|
| + this.xhr = document.createElement('core-xhr');
|
| + },
|
| +
|
| + receive: function(response, xhr) {
|
| + if (this.isSuccess(xhr)) {
|
| + this.processResponse(xhr);
|
| + } else {
|
| + this.error(xhr);
|
| + }
|
| + this.complete(xhr);
|
| + },
|
| +
|
| + isSuccess: function(xhr) {
|
| + var status = xhr.status || 0;
|
| + return !status || (status >= 200 && status < 300);
|
| + },
|
| +
|
| + processResponse: function(xhr) {
|
| + var response = this.evalResponse(xhr);
|
| + this.response = response;
|
| + this.fire('core-response', {response: response, xhr: xhr});
|
| + },
|
| +
|
| + error: function(xhr) {
|
| + var response = xhr.status + ': ' + xhr.responseText;
|
| + this.fire('core-error', {response: response, xhr: xhr});
|
| + },
|
| +
|
| + complete: function(xhr) {
|
| + this.fire('core-complete', {response: xhr.status, xhr: xhr});
|
| + },
|
| +
|
| + evalResponse: function(xhr) {
|
| + return this[(this.handleAs || 'text') + 'Handler'](xhr);
|
| + },
|
| +
|
| + xmlHandler: function(xhr) {
|
| + return xhr.responseXML;
|
| + },
|
| +
|
| + textHandler: function(xhr) {
|
| + return xhr.responseText;
|
| + },
|
| +
|
| + jsonHandler: function(xhr) {
|
| + var r = xhr.responseText;
|
| + try {
|
| + return JSON.parse(r);
|
| + } catch (x) {
|
| + console.warn('core-ajax caught an exception trying to parse reponse as JSON:');
|
| + console.warn('url:', this.url);
|
| + console.warn(x);
|
| + return r;
|
| + }
|
| + },
|
| +
|
| + documentHandler: function(xhr) {
|
| + return xhr.response;
|
| + },
|
| +
|
| + blobHandler: function(xhr) {
|
| + return xhr.response;
|
| + },
|
| +
|
| + arraybufferHandler: function(xhr) {
|
| + return xhr.response;
|
| + },
|
| +
|
| + urlChanged: function() {
|
| + if (!this.handleAs) {
|
| + var ext = String(this.url).split('.').pop();
|
| + switch (ext) {
|
| + case 'json':
|
| + this.handleAs = 'json';
|
| + break;
|
| + }
|
| + }
|
| + this.autoGo();
|
| + },
|
| +
|
| + paramsChanged: function() {
|
| + this.autoGo();
|
| + },
|
| +
|
| + autoChanged: function() {
|
| + this.autoGo();
|
| + },
|
| +
|
| + // TODO(sorvell): multiple side-effects could call autoGo
|
| + // during one micro-task, use a job to have only one action
|
| + // occur
|
| + autoGo: function() {
|
| + if (this.auto) {
|
| + this.goJob = this.job(this.goJob, this.go, 0);
|
| + }
|
| + },
|
| +
|
| + /**
|
| + * Performs an Ajax request to the specified URL.
|
| + *
|
| + * @method go
|
| + */
|
| + go: function() {
|
| + var args = this.xhrArgs || {};
|
| + // TODO(sjmiles): we may want XHR to default to POST if body is set
|
| + args.body = this.body || args.body;
|
| + args.params = this.params || args.params;
|
| + if (args.params && typeof(args.params) == 'string') {
|
| + args.params = JSON.parse(args.params);
|
| + }
|
| + args.headers = this.headers || args.headers || {};
|
| + if (args.headers && typeof(args.headers) == 'string') {
|
| + args.headers = JSON.parse(args.headers);
|
| + }
|
| + if (this.contentType) {
|
| + args.headers['content-type'] = this.contentType;
|
| + }
|
| + if (this.handleAs === 'arraybuffer' || this.handleAs === 'blob' ||
|
| + this.handleAs === 'document') {
|
| + args.responseType = this.handleAs;
|
| + }
|
| + args.withCredentials = this.withCredentials;
|
| + args.callback = this.receive.bind(this);
|
| + args.url = this.url;
|
| + args.method = this.method;
|
| + return args.url && this.xhr.request(args);
|
| + }
|
| +
|
| + });
|
| +
|
| +</script>
|
| +</polymer-element>
|
|
|