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 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
81 } | 81 } |
82 return [ 'list', id, values ]; | 82 return [ 'list', id, values ]; |
83 }); | 83 }); |
84 } else if (message instanceof LocalSendPortSync) { | 84 } else if (message instanceof LocalSendPortSync) { |
85 return [ 'sendport', 'nativejs', message.receivePort.id ]; | 85 return [ 'sendport', 'nativejs', message.receivePort.id ]; |
86 } else if (message instanceof DartSendPortSync) { | 86 } else if (message instanceof DartSendPortSync) { |
87 return [ 'sendport', 'dart', message.isolateId, message.portId ]; | 87 return [ 'sendport', 'dart', message.isolateId, message.portId ]; |
88 } else if (message instanceof Function) { | 88 } else if (message instanceof Function) { |
89 return [ 'funcref', functionRefTable.makeRef(message), | 89 return [ 'funcref', functionRefTable.makeRef(message), |
90 doSerialize(functionRefTable.sendPort) ]; | 90 doSerialize(functionRefTable.sendPort) ]; |
| 91 } else if (message instanceof HTMLElement) { |
| 92 var id = elementId(message); |
| 93 // Verify that the element is connected to the document. |
| 94 // Otherwise, we will not be able to find it on the other side. |
| 95 getElement(id); |
| 96 return [ 'element', id ]; |
91 } else if (message instanceof DartProxy) { | 97 } else if (message instanceof DartProxy) { |
92 return [ 'objref', message._id, doSerialize(message._port) ]; | 98 return [ 'objref', message._id, doSerialize(message._port) ]; |
93 } else if (message.__proto__ != {}.__proto__) { | 99 } else if (message.__proto__ != {}.__proto__) { |
94 // TODO(vsm): Is the above portable and what we want? | 100 // TODO(vsm): Is the above portable and what we want? |
95 // Proxy non-map Objects. | 101 // Proxy non-map Objects. |
96 return [ 'objref', jsRefTable.makeRef(message), | 102 return [ 'objref', jsRefTable.makeRef(message), |
97 doSerialize(jsRefTable.sendPort) ]; | 103 doSerialize(jsRefTable.sendPort) ]; |
98 } else { | 104 } else { |
99 return checkedSerialization(message, function(id) { | 105 return checkedSerialization(message, function(id) { |
100 var keys = Object.getOwnPropertyNames(message); | 106 var keys = Object.getOwnPropertyNames(message); |
(...skipping 18 matching lines...) Expand all Loading... |
119 typeof(message) == 'number' || | 125 typeof(message) == 'number' || |
120 typeof(message) == 'boolean') { | 126 typeof(message) == 'boolean') { |
121 return message; | 127 return message; |
122 } | 128 } |
123 switch (message[0]) { | 129 switch (message[0]) { |
124 case 'map': return deserializeMap(message); | 130 case 'map': return deserializeMap(message); |
125 case 'sendport': return deserializeSendPort(message); | 131 case 'sendport': return deserializeSendPort(message); |
126 case 'list': return deserializeList(message); | 132 case 'list': return deserializeList(message); |
127 case 'funcref': return deserializeFunction(message); | 133 case 'funcref': return deserializeFunction(message); |
128 case 'objref': return deserializeProxy(message); | 134 case 'objref': return deserializeProxy(message); |
| 135 case 'element': return deserializeElement(message); |
129 default: throw 'unimplemented'; | 136 default: throw 'unimplemented'; |
130 } | 137 } |
131 } | 138 } |
132 | 139 |
133 function deserializeMap(message) { | 140 function deserializeMap(message) { |
134 var result = { }; | 141 var result = { }; |
135 var id = message[1]; | 142 var id = message[1]; |
136 var keys = message[2]; | 143 var keys = message[2]; |
137 var values = message[3]; | 144 var values = message[3]; |
138 for (var i = 0, length = keys.length; i < length; i++) { | 145 for (var i = 0, length = keys.length; i < length; i++) { |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
180 var id = message[1]; | 187 var id = message[1]; |
181 var port = deserializeSendPort(message[2]); | 188 var port = deserializeSendPort(message[2]); |
182 if (port instanceof LocalSendPortSync) { | 189 if (port instanceof LocalSendPortSync) { |
183 return jsRefTable.map[id]; | 190 return jsRefTable.map[id]; |
184 } else if (port instanceof DartSendPortSync) { | 191 } else if (port instanceof DartSendPortSync) { |
185 return new DartProxy(port, id); | 192 return new DartProxy(port, id); |
186 } | 193 } |
187 throw 'Illegal proxy object: ' + message; | 194 throw 'Illegal proxy object: ' + message; |
188 } | 195 } |
189 | 196 |
| 197 function deserializeElement(message) { |
| 198 var id = message[1]; |
| 199 return getElement(id); |
| 200 } |
| 201 |
190 window.registerPort = function(name, port) { | 202 window.registerPort = function(name, port) { |
191 var stringified = JSON.stringify(serialize(port)); | 203 var stringified = JSON.stringify(serialize(port)); |
192 window.localStorage['dart-port:' + name] = stringified; | 204 window.localStorage['dart-port:' + name] = stringified; |
193 }; | 205 }; |
194 | 206 |
195 window.lookupPort = function(name) { | 207 window.lookupPort = function(name) { |
196 var stringified = window.localStorage['dart-port:' + name]; | 208 var stringified = window.localStorage['dart-port:' + name]; |
197 return deserialize(JSON.parse(stringified)); | 209 return deserialize(JSON.parse(stringified)); |
198 }; | 210 }; |
199 | 211 |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
369 this._id = id; | 381 this._id = id; |
370 } | 382 } |
371 | 383 |
372 // Leaking implementation. | 384 // Leaking implementation. |
373 // TODO(vsm): provide proper, backend-specific implementation. | 385 // TODO(vsm): provide proper, backend-specific implementation. |
374 function _makeFunctionFromRef(ref, sendPort) { | 386 function _makeFunctionFromRef(ref, sendPort) { |
375 return function() { | 387 return function() { |
376 return sendPort.callSync([ref, Array.prototype.slice.call(arguments)]); | 388 return sendPort.callSync([ref, Array.prototype.slice.call(arguments)]); |
377 } | 389 } |
378 } | 390 } |
| 391 |
| 392 var localNextElementId = 0; |
| 393 var _DART_ID = 'data-dart_id'; |
| 394 |
| 395 function elementId(e) { |
| 396 if (e.hasAttribute(_DART_ID)) return e.getAttribute(_DART_ID); |
| 397 var id = (localNextElementId++).toString(); |
| 398 e.setAttribute(_DART_ID, id); |
| 399 return id; |
| 400 } |
| 401 |
| 402 function getElement(id) { |
| 403 var list = document.querySelectorAll('[' + _DART_ID + '="' + id + '"]'); |
| 404 |
| 405 if (list.length > 1) throw 'Non unique ID: ' + id; |
| 406 if (list.length == 0) { |
| 407 throw 'Element must be attached to the document: ' + id; |
| 408 } |
| 409 return list[0]; |
| 410 } |
379 })(); | 411 })(); |
OLD | NEW |