Index: sky/framework/xmlhttprequest.sky |
diff --git a/sky/framework/xmlhttprequest.sky b/sky/framework/xmlhttprequest.sky |
deleted file mode 100644 |
index 7df72b17532d6681a50e1d1f266688921c33a6d2..0000000000000000000000000000000000000000 |
--- a/sky/framework/xmlhttprequest.sky |
+++ /dev/null |
@@ -1,132 +0,0 @@ |
-<import src="/gen/mojo/public/sky/core.sky" as="core" /> |
-<import src="/gen/mojo/public/sky/unicode.sky" as="unicode" /> |
-<import src="/gen/mojo/services/network/public/interfaces/network_service.mojom.sky" as="net" /> |
-<import src="/gen/mojo/services/network/public/interfaces/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.responseArrayBuffer = null; |
- this.responseText = null; // Cached to avoid re-decoding each access. |
- } |
-} |
- |
-// https://xhr.spec.whatwg.org |
-class XMLHttpRequest { |
- constructor() { |
- this[kPrivate] = new Private; |
- this.responseType = ''; // Only text and arraybuffer support for now. |
- this.status = null; |
- this.statusText = null; |
- } |
- |
- onload() { |
- } |
- |
- onerror(error) { |
- } |
- |
- get responseText() { |
- if (this.responseType !== '' && this.responseType !== 'text') |
- throw 'Non-text responseType ' + this.responseType; |
- if (this[kPrivate].responseArrayBuffer === null) |
- return null; |
- if (this[kPrivate].responseText === null) { |
- var intArray = new Uint8Array(this[kPrivate].responseArrayBuffer); |
- this[kPrivate].responseText = unicode.decodeUtf8String(intArray); |
- } |
- return this[kPrivate].responseText; |
- } |
- |
- get response() { |
- if (this.responseType === 'text' || this.responseType == '') |
- return this.responseText; |
- else if (this.responseType === 'arraybuffer') |
- return this[kPrivate].responseArrayBuffer; |
- throw 'Unknown responseType ' + this.responseType; |
- } |
- |
- open(method, url) { |
- var request = new loader.URLRequest(); |
- request.url = String(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(body) { |
- var priv = this[kPrivate]; |
- // Handle the body before the headers as it can affect Content-Type. |
- if (body) { |
- var bodyAsBufferView = null; |
- if (typeof(body) === "string") { |
- this.setRequestHeader("Content-Type", "text/plain;charset=UTF-8"); |
- var bodyAsBufferView = new Uint8Array(unicode.utf8Length(body)); |
- unicode.encodeUtf8String(body, bodyAsBufferView); |
- } else { |
- bodyAsBufferView = new Uint8Array(body); |
- } |
- var dataPipe = new core.createDataPipe(); |
- // FIXME: body is currently assumed to be an ArrayBuffer. |
- var writeResult = core.writeData(dataPipe.producerHandle, |
- bodyAsBufferView, core.WRITE_DATA_FLAG_ALL_OR_NONE); |
- core.close(dataPipe.producerHandle); |
- // FIXME: Much better error handling needed. |
- console.assert(writeResult.result === core.RESULT_OK); |
- console.assert(writeResult.numBytes === body.length); |
- // 'body' is actually an array of body segments. |
- priv.request.body = [dataPipe.consumerHandle]; |
- } |
- |
- var requestHeaders = []; |
- priv.headers.forEach(function(value, key) { |
- requestHeaders.push(key + ': ' + value); |
- }); |
- priv.request.headers = requestHeaders; |
- |
- priv.networkService.createURLLoader(function(urlLoaderProxy) { |
- priv.loader = urlLoaderProxy; |
- }); |
- |
- var self = this; |
- outstandingRequests.add(this); |
- priv.loader.start(priv.request).then(function(result) { |
- self.status = result.response.status_code; |
- self.statusText = result.response.status_line; |
- if (result.response.error) |
- throw new Error(result.response.error.description); |
- return core.drainData(result.response.body).then(function(result) { |
- outstandingRequests.delete(self); |
- priv.responseArrayBuffer = result.buffer; |
- // Use a setTimeout to avoid exceptions in onload tripping onerror. |
- window.setTimeout(function() { |
- self.onload(); |
- }); |
- }); |
- }).catch(function(error) { |
- outstandingRequests.delete(self); |
- // Technically this should throw a ProgressEvent. |
- self.onerror(error); |
- }); |
- } |
-} |
- |
-module.exports = XMLHttpRequest; |
-</script> |