blob: cef3252a82becbd1bc8a0a70a0db073644f68def [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();
function XMLHttpRequest() {
this.networkService_ = shell.connectToService(
"mojo:network_service", net.NetworkService);
this.request_ = null;
this.loader_ = null;
this.responseText = null;
this.headers_ = new Map();
};
XMLHttpRequest.prototype.onload = function() { };
XMLHttpRequest.prototype.onerror = function(error) { };
XMLHttpRequest.prototype.open = function(method, url) {
this.request_ = new loader.URLRequest();
this.request_.url = new URL(url, document.URL);
this.request_.method = method;
this.request_.auto_follow_redirects = true;
this.headers_.clear();
};
XMLHttpRequest.prototype.setRequestHeader = function(header, value) {
this.headers_.set(header, value);
};
XMLHttpRequest.prototype.send = function() {
var requestHeaders = [];
this.headers_.forEach(function(value, key) {
requestHeaders.push(key + ': ' + value);
});
this.request_.headers = requestHeaders;
// FIXME: Factor this into the JS bindings.
var pipe = new core.createMessagePipe();
this.networkService_.createURLLoader(pipe.handle1);
this.loader_ = shell.wrapHandle(pipe.handle0, loader.URLLoader);
var self = this;
outstandingRequests.add(this);
this.loader_.start(this.request_).then(function(result) {
return core.drainData(result.response.body).then(function(result) {
outstandingRequests.delete(self);
self.responseText = unicode.decodeUtf8String(new Uint8Array(result.buffer));
self.onload();
});
}).catch(function(error) {
outstandingRequests.delete(self);
self.onerror(error);
});
};
module.exports = XMLHttpRequest;
</script>