blob: 75a7a4795a5c2f62f3df065421813edbd9216534 [file] [log] [blame]
<import src="/mojo/public/sky/core.sky" as="core" />
<import src="/mojo/public/sky/unicode.sky" as="unicode" />
<import src="/mojo/services/public/interfaces/network/network_service.mojom.sky" as="net" />
<import src="/mojo/services/public/interfaces/network/url_loader.mojom.sky" as="loader" />
<import src="shell.sky" as="shell" />
<script>
// XHR keeps itself alive.
var outstandingRequests = new Set();
const kPrivate = Symbol("XMLHttpRequestPrivate");
class Private {
constructor() {
this.networkService = shell.connectToService(
"mojo:network_service", net.NetworkService);
this.request = null;
this.loader = null;
this.headers = new Map();
this.responseText = "";
}
}
class XMLHttpRequest {
constructor() {
this[kPrivate] = new Private;
}
onload() {
}
onerror(error) {
}
get responseText() {
return this[kPrivate].responseText;
}
open(method, url) {
var request = new loader.URLRequest();
request.url = new URL(url, document.URL);
request.method = method;
request.auto_follow_redirects = true;
var priv = this[kPrivate];
priv.request = request;
priv.headers.clear();
}
setRequestHeader(header, value) {
this[kPrivate].headers.set(header, value);
}
send() {
var priv = this[kPrivate];
var requestHeaders = [];
priv.headers.forEach(function(value, key) {
requestHeaders.push(key + ': ' + value);
});
priv.request.headers = requestHeaders;
// FIXME: Factor this into the JS bindings.
var pipe = new core.createMessagePipe();
priv.networkService.createURLLoader(pipe.handle1);
priv.loader = shell.wrapHandle(pipe.handle0, loader.URLLoader);
var self = this;
outstandingRequests.add(this);
priv.loader.start(priv.request).then(function(result) {
return core.drainData(result.response.body).then(function(result) {
outstandingRequests.delete(self);
priv.responseText = unicode.decodeUtf8String(new Uint8Array(result.buffer));
self.onload();
});
}).catch(function(error) {
outstandingRequests.delete(self);
self.onerror(error);
});
}
}
module.exports = XMLHttpRequest;
</script>