providers/core/core.xhr.js
/*jshint node:true*/
var PromiseCompat = require('es6-promise').Promise;
var XhrClass = null;
var XhrProvider = function(cap, dispatchEvent) {
"use strict";
if (typeof window !== "undefined" &&
typeof window.XMLHttpRequest !== "undefined" &&
XhrClass === null) { // freedom
XhrClass = window.XMLHttpRequest;
} else if (typeof XMLHttpRequest !== "undefined" &&
XhrClass === null) { // freedom-for-firefox
XhrClass = XMLHttpRequest;
} else if (XhrClass === null) {
console.error("Platform does not support XMLHttpRequest");
}
this._dispatchEvent = dispatchEvent;
this._xhr = new XhrClass();
setTimeout(cap.provider.onClose.bind(
cap.provider,
this,
this.abort.bind(this)
), 0);
this._events = [
"loadstart",
"progress",
"abort",
"error",
"load",
"timeout",
"loadend",
"readystatechange"
];
this._setupListeners();
};
XhrProvider.prototype.open = function(method, url, async, user, password) {
"use strict";
if (typeof async !== "undefined" && async !== true) {
return PromiseCompat.reject({
errcode: "InvalidAccessError",
message: "async should always be set to true"
});
}
// Force async to be true. undefined can lead to async=false in Chrome packaged apps
this._xhr.open(method, url, true, user, password);
return PromiseCompat.resolve();
};
XhrProvider.prototype.send = function(data) {
"use strict";
if (!(data instanceof Object)) {
this._xhr.send();
} else if (data.hasOwnProperty("string")) {
this._xhr.send(data.string);
} else if (data.hasOwnProperty("buffer")) {
this._xhr.send(data.buffer);
} else if (data.hasOwnProperty("blob")) {
this._xhr.send(data.blob);
} else {
this._xhr.send();
}
return PromiseCompat.resolve();
};
XhrProvider.prototype.abort = function() {
"use strict";
this._xhr.abort();
return PromiseCompat.resolve();
};
XhrProvider.prototype.getResponseHeader = function(header) {
"use strict";
return PromiseCompat.resolve(this._xhr.getResponseHeader(header));
};
XhrProvider.prototype.getAllResponseHeaders = function() {
"use strict";
return PromiseCompat.resolve(this._xhr.getAllResponseHeaders());
};
XhrProvider.prototype.setRequestHeader = function(header, value) {
"use strict";
this._xhr.setRequestHeader(header, value);
return PromiseCompat.resolve();
};
XhrProvider.prototype.overrideMimeType = function(mime) {
"use strict";
this._xhr.overrideMimeType(mime);
return PromiseCompat.resolve();
};
XhrProvider.prototype.getReadyState = function() {
"use strict";
return PromiseCompat.resolve(this._xhr.readyState);
};
XhrProvider.prototype.getResponse = function() {
"use strict";
if (this._xhr.response === null) {
return PromiseCompat.resolve(null);
} else if (this._xhr.responseType === "text" || this._xhr.responseType === "") {
return PromiseCompat.resolve({ string: this._xhr.response });
} else if (this._xhr.responseType === "arraybuffer") {
return PromiseCompat.resolve({ buffer: this._xhr.response });
} else if (this._xhr.responseType === "json") {
return PromiseCompat.resolve({ object: this._xhr.response });
}
return PromiseCompat.reject("core.xhr cannot determine type of response");
};
XhrProvider.prototype.getResponseText = function() {
"use strict";
return PromiseCompat.resolve(this._xhr.responseText);
};
XhrProvider.prototype.getResponseURL = function() {
"use strict";
return PromiseCompat.resolve(this._xhr.responseURL);
};
XhrProvider.prototype.getResponseType = function() {
"use strict";
return PromiseCompat.resolve(this._xhr.responseType);
};
XhrProvider.prototype.setResponseType = function(type) {
"use strict";
this._xhr.responseType = type;
return PromiseCompat.resolve();
};
XhrProvider.prototype.getStatus = function() {
"use strict";
return PromiseCompat.resolve(this._xhr.status);
};
XhrProvider.prototype.getStatusText = function() {
"use strict";
return PromiseCompat.resolve(this._xhr.statusText);
};
XhrProvider.prototype.getTimeout = function() {
"use strict";
return PromiseCompat.resolve(this._xhr.timeout);
};
XhrProvider.prototype.setTimeout = function(timeout) {
"use strict";
this._xhr.timeout = timeout;
return PromiseCompat.resolve();
};
XhrProvider.prototype.getWithCredentials = function() {
"use strict";
return PromiseCompat.resolve(this._xhr.withCredentials);
};
XhrProvider.prototype.setWithCredentials = function(wc) {
"use strict";
this._xhr.withCredentials = wc;
return PromiseCompat.resolve();
};
XhrProvider.prototype._setupListeners = function() {
"use strict";
// Download events
this._events.forEach(function (eventName) {
this._xhr.addEventListener(eventName, function(eventName, event) {
this._dispatchEvent("on" + eventName, event);
}.bind(this, eventName), false);
}.bind(this));
// Upload events
this._events.forEach(function (eventName) {
this._xhr.upload.addEventListener(eventName, function(eventName, event) {
this._dispatchEvent("onupload" + eventName, event);
}.bind(this, eventName), false);
}.bind(this));
};
exports.name = "core.xhr";
exports.provider = XhrProvider;
exports.style = "providePromises";
exports.flags = { provider: true };
exports.setImpl = function(impl) {
"use strict";
XhrClass = impl;
};