| OLD | NEW |
| 1 <import src="/mojo/public/sky/core.sky" as="core" /> | 1 <import src="/mojo/public/sky/core.sky" as="core" /> |
| 2 <import src="/mojo/public/sky/unicode.sky" as="unicode" /> | 2 <import src="/mojo/public/sky/unicode.sky" as="unicode" /> |
| 3 <import src="/mojo/services/public/interfaces/network/network_service.mojom.sky"
as="net" /> | 3 <import src="/mojo/services/public/interfaces/network/network_service.mojom.sky"
as="net" /> |
| 4 <import src="/mojo/services/public/interfaces/network/url_loader.mojom.sky" as="
loader" /> | 4 <import src="/mojo/services/public/interfaces/network/url_loader.mojom.sky" as="
loader" /> |
| 5 <import src="shell.sky" as="shell" /> | 5 <import src="shell.sky" as="shell" /> |
| 6 <script> | 6 <script> |
| 7 // XHR keeps itself alive. | 7 // XHR keeps itself alive. |
| 8 var outstandingRequests = new Set(); | 8 var outstandingRequests = new Set(); |
| 9 | 9 |
| 10 const kPrivate = Symbol("XMLHttpRequestPrivate"); |
| 11 |
| 12 class Private { |
| 13 constructor() { |
| 14 this.networkService = shell.connectToService( |
| 15 "mojo:network_service", net.NetworkService); |
| 16 this.request = null; |
| 17 this.loader = null; |
| 18 this.headers = new Map(); |
| 19 } |
| 20 } |
| 21 |
| 10 class XMLHttpRequest { | 22 class XMLHttpRequest { |
| 11 constructor() { | 23 constructor() { |
| 24 this[kPrivate] = new Private; |
| 12 this.responseText = null; | 25 this.responseText = null; |
| 13 | |
| 14 this.networkService_ = shell.connectToService( | |
| 15 "mojo:network_service", net.NetworkService); | |
| 16 this.request_ = null; | |
| 17 this.loader_ = null; | |
| 18 this.headers_ = new Map(); | |
| 19 } | 26 } |
| 20 | 27 |
| 21 onload() { | 28 onload() { |
| 22 } | 29 } |
| 23 | 30 |
| 24 onerror(error) { | 31 onerror(error) { |
| 25 } | 32 } |
| 26 | 33 |
| 27 open(method, url) { | 34 open(method, url) { |
| 28 this.request_ = new loader.URLRequest(); | 35 var request = new loader.URLRequest(); |
| 29 this.request_.url = new URL(url, document.URL); | 36 request.url = new URL(url, document.URL); |
| 30 this.request_.method = method; | 37 request.method = method; |
| 31 this.request_.auto_follow_redirects = true; | 38 request.auto_follow_redirects = true; |
| 32 this.headers_.clear(); | 39 |
| 40 var priv = this[kPrivate]; |
| 41 priv.request = request; |
| 42 priv.headers.clear(); |
| 33 } | 43 } |
| 34 | 44 |
| 35 setRequestHeader(header, value) { | 45 setRequestHeader(header, value) { |
| 36 this.headers_.set(header, value); | 46 this[kPrivate].headers.set(header, value); |
| 37 } | 47 } |
| 38 | 48 |
| 39 send() { | 49 send() { |
| 50 var priv = this[kPrivate]; |
| 40 var requestHeaders = []; | 51 var requestHeaders = []; |
| 41 this.headers_.forEach(function(value, key) { | 52 priv.headers.forEach(function(value, key) { |
| 42 requestHeaders.push(key + ': ' + value); | 53 requestHeaders.push(key + ': ' + value); |
| 43 }); | 54 }); |
| 44 this.request_.headers = requestHeaders; | 55 priv.request.headers = requestHeaders; |
| 45 | 56 |
| 46 // FIXME: Factor this into the JS bindings. | 57 // FIXME: Factor this into the JS bindings. |
| 47 var pipe = new core.createMessagePipe(); | 58 var pipe = new core.createMessagePipe(); |
| 48 this.networkService_.createURLLoader(pipe.handle1); | 59 priv.networkService.createURLLoader(pipe.handle1); |
| 49 this.loader_ = shell.wrapHandle(pipe.handle0, loader.URLLoader); | 60 priv.loader = shell.wrapHandle(pipe.handle0, loader.URLLoader); |
| 50 | 61 |
| 51 var self = this; | 62 var self = this; |
| 52 outstandingRequests.add(this); | 63 outstandingRequests.add(this); |
| 53 this.loader_.start(this.request_).then(function(result) { | 64 priv.loader.start(priv.request).then(function(result) { |
| 54 return core.drainData(result.response.body).then(function(result) { | 65 return core.drainData(result.response.body).then(function(result) { |
| 55 outstandingRequests.delete(self); | 66 outstandingRequests.delete(self); |
| 56 self.responseText = unicode.decodeUtf8String(new Uint8Array(result.buffe
r)); | 67 self.responseText = unicode.decodeUtf8String(new Uint8Array(result.buffe
r)); |
| 57 self.onload(); | 68 self.onload(); |
| 58 }); | 69 }); |
| 59 }).catch(function(error) { | 70 }).catch(function(error) { |
| 60 outstandingRequests.delete(self); | 71 outstandingRequests.delete(self); |
| 61 self.onerror(error); | 72 self.onerror(error); |
| 62 }); | 73 }); |
| 63 } | 74 } |
| 64 } | 75 } |
| 65 | 76 |
| 66 module.exports = XMLHttpRequest; | 77 module.exports = XMLHttpRequest; |
| 67 </script> | 78 </script> |
| OLD | NEW |