Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(8)

Side by Side Diff: sky/framework/xmlhttprequest.sky

Issue 753473002: Hide XMLHttpRequest's private state using Symbol (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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>
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698