| 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 part of html; | 5 part of html; |
| 6 | 6 |
| 7 _serialize(var message) { | 7 _serialize(var message) { |
| 8 return new _JsSerializer().traverse(message); | 8 return new _JsSerializer().traverse(message); |
| 9 } | 9 } |
| 10 | 10 |
| 11 class _JsSerializer extends _Serializer { | 11 class _JsSerializer extends _Serializer { |
| 12 | 12 |
| 13 visitSendPortSync(SendPortSync x) { | 13 visitSendPortSync(SendPortSync x) { |
| 14 if (x is _JsSendPortSync) return visitJsSendPortSync(x); | 14 if (x is _JsSendPortSync) return visitJsSendPortSync(x); |
| 15 if (x is _LocalSendPortSync) return visitLocalSendPortSync(x); | 15 if (x is _LocalSendPortSync) return visitLocalSendPortSync(x); |
| 16 if (x is _RemoteSendPortSync) return visitRemoteSendPortSync(x); | 16 if (x is _RemoteSendPortSync) return visitRemoteSendPortSync(x); |
| 17 throw "Unknown port type $x"; | 17 throw "Unknown port type $x"; |
| 18 } | 18 } |
| 19 | 19 |
| 20 visitJsSendPortSync(_JsSendPortSync x) { | 20 visitJsSendPortSync(_JsSendPortSync x) { |
| 21 return [ 'sendport', 'nativejs', x._id ]; | 21 return [ 'sendport', 'nativejs', x._id ]; |
| 22 } | 22 } |
| 23 | 23 |
| 24 visitLocalSendPortSync(_LocalSendPortSync x) { | 24 visitLocalSendPortSync(_LocalSendPortSync x) { |
| 25 return [ 'sendport', 'dart', | 25 return [ 'sendport', 'dart', |
| 26 ReceivePortSync._isolateId, x._receivePort._portId ]; | 26 ReceivePortSync._isolateId, x._receivePort._portId ]; |
| 27 } | 27 } |
| 28 | 28 |
| 29 visitSendPort(SendPort x) { |
| 30 throw new UnimplementedError('Asynchronous send port not yet implemented.'); |
| 31 } |
| 32 |
| 29 visitRemoteSendPortSync(_RemoteSendPortSync x) { | 33 visitRemoteSendPortSync(_RemoteSendPortSync x) { |
| 30 return [ 'sendport', 'dart', | 34 return [ 'sendport', 'dart', x._isolateId, x._portId ]; |
| 31 x._receivePort._isolateId, x._receivePort._portId ]; | |
| 32 } | 35 } |
| 33 } | 36 } |
| 34 | 37 |
| 35 _deserialize(var message) { | 38 _deserialize(var message) { |
| 36 return new _JsDeserializer().deserialize(message); | 39 return new _JsDeserializer().deserialize(message); |
| 37 } | 40 } |
| 38 | 41 |
| 39 | 42 |
| 40 class _JsDeserializer extends _Deserializer { | 43 class _JsDeserializer extends _Deserializer { |
| 41 | 44 |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 79 int _portId; | 82 int _portId; |
| 80 _RemoteSendPortSync(this._isolateId, this._portId); | 83 _RemoteSendPortSync(this._isolateId, this._portId); |
| 81 | 84 |
| 82 callSync(var message) { | 85 callSync(var message) { |
| 83 var serialized = _serialize(message); | 86 var serialized = _serialize(message); |
| 84 var result = _call(_isolateId, _portId, serialized); | 87 var result = _call(_isolateId, _portId, serialized); |
| 85 return _deserialize(result); | 88 return _deserialize(result); |
| 86 } | 89 } |
| 87 | 90 |
| 88 static _call(int isolateId, int portId, var message) { | 91 static _call(int isolateId, int portId, var message) { |
| 89 var target = 'dart-port-$isolateId-$portId'; | 92 var target = 'dart-port-$isolateId-$portId'; |
| 90 // TODO(vsm): Make this re-entrant. | 93 // TODO(vsm): Make this re-entrant. |
| 91 // TODO(vsm): Set this up set once, on the first call. | 94 // TODO(vsm): Set this up set once, on the first call. |
| 92 var source = '$target-result'; | 95 var source = '$target-result'; |
| 93 var result = null; | 96 var result = null; |
| 94 var listener = (Event e) { | 97 var listener = (Event e) { |
| 95 result = JSON.parse(_getPortSyncEventData(e)); | 98 result = JSON.parse(_getPortSyncEventData(e)); |
| 96 }; | 99 }; |
| 97 window.on[source].add(listener); | 100 window.on[source].add(listener); |
| 98 _dispatchEvent(target, [source, message]); | 101 _dispatchEvent(target, [source, message]); |
| 99 window.on[source].remove(listener); | 102 window.on[source].remove(listener); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 144 _portIdCount = 0; | 147 _portIdCount = 0; |
| 145 _portMap = new Map<int, ReceivePortSync>(); | 148 _portMap = new Map<int, ReceivePortSync>(); |
| 146 } | 149 } |
| 147 _portId = _portIdCount++; | 150 _portId = _portIdCount++; |
| 148 _portMap[_portId] = this; | 151 _portMap[_portId] = this; |
| 149 } | 152 } |
| 150 | 153 |
| 151 static int get _isolateId { | 154 static int get _isolateId { |
| 152 // TODO(vsm): Make this coherent with existing isolate code. | 155 // TODO(vsm): Make this coherent with existing isolate code. |
| 153 if (_cachedIsolateId == null) { | 156 if (_cachedIsolateId == null) { |
| 154 _cachedIsolateId = _getNewIsolateId(); | 157 _cachedIsolateId = _getNewIsolateId(); |
| 155 } | 158 } |
| 156 return _cachedIsolateId; | 159 return _cachedIsolateId; |
| 157 } | 160 } |
| 158 | 161 |
| 159 static String _getListenerName(isolateId, portId) => | 162 static String _getListenerName(isolateId, portId) => |
| 160 'dart-port-$isolateId-$portId'; | 163 'dart-port-$isolateId-$portId'; |
| 161 String get _listenerName => _getListenerName(_isolateId, _portId); | 164 String get _listenerName => _getListenerName(_isolateId, _portId); |
| 162 | 165 |
| 163 void receive(callback(var message)) { | 166 void receive(callback(var message)) { |
| 164 _callback = callback; | 167 _callback = callback; |
| 165 if (_listener == null) { | 168 if (_listener == null) { |
| 166 _listener = (Event e) { | 169 _listener = (Event e) { |
| 167 var data = JSON.parse(_getPortSyncEventData(e)); | 170 var data = JSON.parse(_getPortSyncEventData(e)); |
| 168 var replyTo = data[0]; | 171 var replyTo = data[0]; |
| 169 var message = _deserialize(data[1]); | 172 var message = _deserialize(data[1]); |
| 170 var result = _callback(message); | 173 var result = _callback(message); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 193 } | 196 } |
| 194 | 197 |
| 195 get _isolateId => ReceivePortSync._isolateId; | 198 get _isolateId => ReceivePortSync._isolateId; |
| 196 | 199 |
| 197 void _dispatchEvent(String receiver, var message) { | 200 void _dispatchEvent(String receiver, var message) { |
| 198 var event = new CustomEvent(receiver, false, false, JSON.stringify(message)); | 201 var event = new CustomEvent(receiver, false, false, JSON.stringify(message)); |
| 199 window.$dom_dispatchEvent(event); | 202 window.$dom_dispatchEvent(event); |
| 200 } | 203 } |
| 201 | 204 |
| 202 String _getPortSyncEventData(CustomEvent event) => event.detail; | 205 String _getPortSyncEventData(CustomEvent event) => event.detail; |
| OLD | NEW |