OLD | NEW |
---|---|
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 // Bootstrap support for Dart scripts on the page as this script. | 5 // Bootstrap support for Dart scripts on the page as this script. |
6 if (navigator.webkitStartDart) { | 6 if (navigator.webkitStartDart) { |
7 if (!navigator.webkitStartDart()) { | 7 if (!navigator.webkitStartDart()) { |
8 document.body.innerHTML = 'This build has expired. Please download a new Da rtium at http://www.dartlang.org/dartium/index.html'; | 8 document.body.innerHTML = 'This build has expired. Please download a new Da rtium at http://www.dartlang.org/dartium/index.html'; |
9 } | 9 } |
10 } else { | 10 } else { |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
46 } | 46 } |
47 | 47 |
48 (function() { | 48 (function() { |
49 function serialize(message) { | 49 function serialize(message) { |
50 if (message == null) { | 50 if (message == null) { |
51 return null; // Convert undefined to null. | 51 return null; // Convert undefined to null. |
52 } else if (typeof(message) == 'string' || | 52 } else if (typeof(message) == 'string' || |
53 typeof(message) == 'number' || | 53 typeof(message) == 'number' || |
54 typeof(message) == 'boolean') { | 54 typeof(message) == 'boolean') { |
55 return message; | 55 return message; |
56 } else if (message instanceof Array) { | |
57 var values = new Array(message.length); | |
58 for (var i = 0; i < message.length; i++) { | |
59 values[i] = serialize(message[i]); | |
60 } | |
61 return [ 'list', message.length, values ]; | |
56 } else if (message instanceof LocalSendPortSync) { | 62 } else if (message instanceof LocalSendPortSync) { |
57 return [ 'sendport', 'nativejs', message.receivePort.id ]; | 63 return [ 'sendport', 'nativejs', message.receivePort.id ]; |
58 } else if (message instanceof DartSendPortSync) { | 64 } else if (message instanceof DartSendPortSync) { |
59 return [ 'sendport', 'dart', message.receivePort.isolateId, | 65 return [ 'sendport', 'dart', message.receivePort.isolateId, |
60 message.receivePort.portId ]; | 66 message.receivePort.portId ]; |
61 } else { | 67 } else { |
62 var id = 0; | 68 var id = 0; |
63 var keys = Object.getOwnPropertyNames(message); | 69 var keys = Object.getOwnPropertyNames(message); |
64 var values = new Array(keys.length); | 70 var values = new Array(keys.length); |
65 for (var i = 0; i < keys.length; i++) { | 71 for (var i = 0; i < keys.length; i++) { |
66 values[i] = message[keys[i]]; | 72 values[i] = serialize(message[keys[i]]); |
67 } | 73 } |
68 return [ 'map', id, keys, values ]; | 74 return [ 'map', id, keys, values ]; |
69 } | 75 } |
70 } | 76 } |
71 | 77 |
72 function deserialize(message) { | 78 function deserialize(message) { |
73 return deserializeHelper(message); | 79 return deserializeHelper(message); |
74 } | 80 } |
75 | 81 |
76 function deserializeHelper(x) { | 82 function deserializeHelper(x) { |
77 if (x == null || | 83 if (x == null || |
78 typeof(x) == 'string' || | 84 typeof(x) == 'string' || |
79 typeof(x) == 'number' || | 85 typeof(x) == 'number' || |
80 typeof(x) == 'boolean') { | 86 typeof(x) == 'boolean') { |
81 return x; | 87 return x; |
82 } | 88 } |
83 switch (x[0]) { | 89 switch (x[0]) { |
84 case 'map': return deserializeMap(x); | 90 case 'map': return deserializeMap(x); |
85 case 'sendport': return deserializeSendPort(x); | 91 case 'sendport': return deserializeSendPort(x); |
92 case 'list': return deserializeList(x); | |
86 default: throw 'unimplemented'; | 93 default: throw 'unimplemented'; |
87 } | 94 } |
88 } | 95 } |
89 | 96 |
90 function deserializeMap(x) { | 97 function deserializeMap(x) { |
91 var result = { }; | 98 var result = { }; |
92 var id = x[1]; | 99 var id = x[1]; |
93 var keys = x[2]; | 100 var keys = x[2]; |
94 var values = x[3]; | 101 var values = x[3]; |
95 for (var i = 0, length = keys.length; i < length; i++) { | 102 for (var i = 0, length = keys.length; i < length; i++) { |
96 var key = deserializeHelper(keys[i]); | 103 var key = deserializeHelper(keys[i]); |
97 var value = deserializeHelper(values[i]); | 104 var value = deserializeHelper(values[i]); |
98 result[key] = value; | 105 result[key] = value; |
99 } | 106 } |
100 return result; | 107 return result; |
101 } | 108 } |
102 | 109 |
103 function deserializeSendPort(x) { | 110 function deserializeSendPort(x) { |
104 var tag = x[1]; | 111 var tag = x[1]; |
105 switch (tag) { | 112 switch (tag) { |
106 case 'nativejs': | 113 case 'nativejs': |
107 var id = x[2]; | 114 var id = x[2]; |
108 return new LocalSendPortSync(id); | 115 return new LocalSendPortSync(ReceivePortSync.map[id]); |
sammccall
2012/07/06 16:01:41
I think this was just an oversight before?
| |
109 case 'dart': | 116 case 'dart': |
110 var isolateId = x[2]; | 117 var isolateId = x[2]; |
111 var portId = x[3]; | 118 var portId = x[3]; |
112 return new DartSendPortSync(isolateId, portId); | 119 return new DartSendPortSync(isolateId, portId); |
113 default: | 120 default: |
114 throw 'Illegal SendPortSync type: $tag'; | 121 throw 'Illegal SendPortSync type: $tag'; |
115 } | 122 } |
116 } | 123 } |
117 | 124 |
125 function deserializeList(x) { | |
126 var length = x[1]; | |
127 var values = x[2]; | |
128 var result = new Array(length); | |
129 for (var i = 0; i < length; i++) { | |
130 result[i] = values[i]; | |
131 } | |
132 return result; | |
133 } | |
134 | |
118 window.registerPort = function(name, port) { | 135 window.registerPort = function(name, port) { |
119 var stringified = JSON.stringify(serialize(port)); | 136 var stringified = JSON.stringify(serialize(port)); |
120 window.localStorage['dart-port:' + name] = stringified; | 137 window.localStorage['dart-port:' + name] = stringified; |
121 }; | 138 }; |
122 | 139 |
123 window.lookupPort = function(name) { | 140 window.lookupPort = function(name) { |
124 var stringified = window.localStorage['dart-port:' + name]; | 141 var stringified = window.localStorage['dart-port:' + name]; |
125 return deserialize(JSON.parse(stringified)); | 142 return deserialize(JSON.parse(stringified)); |
126 }; | 143 }; |
127 | 144 |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
192 var result = null; | 209 var result = null; |
193 var listener = function (e) { | 210 var listener = function (e) { |
194 result = JSON.parse(e.data); | 211 result = JSON.parse(e.data); |
195 }; | 212 }; |
196 window.addEventListener(source, listener, false); | 213 window.addEventListener(source, listener, false); |
197 dispatchEvent(target, [source, serialized]); | 214 dispatchEvent(target, [source, serialized]); |
198 window.removeEventListener(source, listener, false); | 215 window.removeEventListener(source, listener, false); |
199 return deserialize(result); | 216 return deserialize(result); |
200 } | 217 } |
201 })(); | 218 })(); |
OLD | NEW |