| 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 // DO NOT EDIT | 5 // DO NOT EDIT |
| 6 // Auto-generated dart:html library. | 6 // Auto-generated dart:html library. |
| 7 | 7 |
| 8 #library('html'); | 8 #library('html'); |
| 9 | 9 |
| 10 #import('dart:isolate'); | 10 #import('dart:isolate'); |
| 11 #import('dart:json'); | 11 #import('dart:json'); |
| 12 | 12 |
| 13 $!GENERATED_DART_FILES | 13 $!GENERATED_DART_FILES |
| 14 | 14 |
| 15 #source('../../dom/src/EventListener.dart'); | 15 #source('../../dom/src/EventListener.dart'); |
| 16 #source('../../dom/src/KeyLocation.dart'); | 16 #source('../../dom/src/KeyLocation.dart'); |
| 17 #source('../../dom/src/KeyName.dart'); | 17 #source('../../dom/src/KeyName.dart'); |
| 18 #source('../../dom/src/ReadyState.dart'); | 18 #source('../../dom/src/ReadyState.dart'); |
| 19 #source('../../dom/src/_Collections.dart'); | 19 #source('../../dom/src/_Collections.dart'); |
| 20 #source('../../dom/src/_XMLHttpRequestUtils.dart'); | 20 #source('../../dom/src/_XMLHttpRequestUtils.dart'); |
| 21 #source('../../html/src/IDBOpenDBRequest.dart'); | 21 #source('../../html/src/IDBOpenDBRequest.dart'); |
| 22 #source('../../html/src/Isolates.dart'); |
| 22 #source('../../html/src/Measurement.dart'); | 23 #source('../../html/src/Measurement.dart'); |
| 23 #source('../../html/src/shared_FactoryProviders.dart'); | 24 #source('../../html/src/shared_FactoryProviders.dart'); |
| 24 #source('../../html/src/frog_DOMImplementation.dart'); | 25 #source('../../html/src/frog_DOMImplementation.dart'); |
| 25 #source('../../html/src/frog_FactoryProviders.dart'); | 26 #source('../../html/src/frog_FactoryProviders.dart'); |
| 26 #source('../../html/src/frog_IDBKeyRangeFactoryProvider.dart'); | 27 #source('../../html/src/frog_IDBKeyRangeFactoryProvider.dart'); |
| 27 #source('../../html/src/frog_IDBOpenDBRequestImplementation.dart'); | 28 #source('../../html/src/frog_IDBOpenDBRequestImplementation.dart'); |
| 28 #source('../../html/src/frog_LocationWrapper.dart'); | 29 #source('../../html/src/frog_LocationWrapper.dart'); |
| 29 #source('../../dom/src/frog_TypedArrayFactoryProvider.dart'); | 30 #source('../../dom/src/frog_TypedArrayFactoryProvider.dart'); |
| 30 #source('../../html/src/_Testing.dart'); | 31 #source('../../html/src/_Testing.dart'); |
| 31 #source('../../html/src/Device.dart'); | 32 #source('../../html/src/Device.dart'); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 42 _DocumentImpl get _document() native "return document;"; | 43 _DocumentImpl get _document() native "return document;"; |
| 43 | 44 |
| 44 Element query(String selector) => _document.query(selector); | 45 Element query(String selector) => _document.query(selector); |
| 45 ElementList queryAll(String selector) => _document.queryAll(selector); | 46 ElementList queryAll(String selector) => _document.queryAll(selector); |
| 46 | 47 |
| 47 // Workaround for tags like <cite> that lack their own Element subclass -- | 48 // Workaround for tags like <cite> that lack their own Element subclass -- |
| 48 // Dart issue 1990. | 49 // Dart issue 1990. |
| 49 class _HTMLElementImpl extends _ElementImpl native "*HTMLElement" { | 50 class _HTMLElementImpl extends _ElementImpl native "*HTMLElement" { |
| 50 } | 51 } |
| 51 | 52 |
| 52 // TODO(vsm): Move this to a separate Isolates.dart file. | 53 // Support for Send/ReceivePortSync. |
| 53 _serialize(var message) { | 54 int _getNewIsolateId() native @''' |
| 54 return new _JsSerializer().traverse(message); | 55 if (!window.$dart$isolate$counter) { |
| 55 } | 56 window.$dart$isolate$counter = 1; |
| 56 | |
| 57 class _JsSerializer extends _Serializer { | |
| 58 | |
| 59 visitSendPortSync(SendPortSync x) { | |
| 60 if (x is _JsSendPortSync) return visitJsSendPortSync(x); | |
| 61 if (x is _LocalSendPortSync) return visitLocalSendPortSync(x); | |
| 62 if (x is _RemoteSendPortSync) return visitRemoteSendPortSync(x); | |
| 63 throw "Illegal underlying port $x"; | |
| 64 } | 57 } |
| 65 | 58 return window.$dart$isolate$counter++; |
| 66 visitJsSendPortSync(_JsSendPortSync x) { | |
| 67 return [ 'sendport', 'nativejs', x._id ]; | |
| 68 } | |
| 69 | |
| 70 visitLocalSendPortSync(_LocalSendPortSync x) { | |
| 71 return [ 'sendport', 'dart2js', | |
| 72 ReceivePortSync._isolateId, x._receivePort._portId ]; | |
| 73 } | |
| 74 | |
| 75 visitRemoteSendPortSync(_RemoteSendPortSync x) { | |
| 76 return [ 'sendport', 'dart2js', | |
| 77 x._receivePort._isolateId, x._receivePort._portId ]; | |
| 78 } | |
| 79 } | |
| 80 | |
| 81 _deserialize(var message) { | |
| 82 return new _JsDeserializer().deserialize(message); | |
| 83 } | |
| 84 | |
| 85 class _JsDeserializer extends _Deserializer { | |
| 86 | |
| 87 deserializeSendPort(List x) { | |
| 88 String tag = x[1]; | |
| 89 switch (tag) { | |
| 90 case 'nativejs': | |
| 91 num id = x[2]; | |
| 92 return new _JsSendPortSync(id); | |
| 93 case 'dart2js': | |
| 94 num isolateId = x[2]; | |
| 95 num portId = x[3]; | |
| 96 return ReceivePortSync._lookup(isolateId, portId); | |
| 97 default: | |
| 98 throw 'Illegal SendPortSync type: $tag'; | |
| 99 } | |
| 100 } | |
| 101 | |
| 102 } | |
| 103 | |
| 104 // The receiver is JS. | |
| 105 class _JsSendPortSync implements SendPortSync { | |
| 106 | |
| 107 num _id; | |
| 108 _JsSendPortSync(this._id); | |
| 109 | |
| 110 callSync(var message) { | |
| 111 var serialized = _serialize(message); | |
| 112 var result = | |
| 113 JS('var', @'ReceivePortSync.dispatchCall(#, #)', _id, serialized); | |
| 114 return _deserialize(result); | |
| 115 } | |
| 116 | |
| 117 } | |
| 118 | |
| 119 // TODO(vsm): Handle Dartium isolates. | |
| 120 // The receiver is a different Dart isolate, compiled to JS. | |
| 121 class _RemoteSendPortSync implements SendPortSync { | |
| 122 | |
| 123 int _isolateId; | |
| 124 int _portId; | |
| 125 _RemoteSendPortSync(this._isolateId, this._portId); | |
| 126 | |
| 127 callSync(var message) { | |
| 128 var serialized = _serialize(message); | |
| 129 var result = _call(_isolateId, _portId, serialized); | |
| 130 return _deserialize(result); | |
| 131 } | |
| 132 | |
| 133 static _call(int isolateId, int portId, var message) { | |
| 134 var target = 'dart-port-$isolateId-$portId'; | |
| 135 // TODO(vsm): Make this re-entrant. | |
| 136 // TODO(vsm): Set this up set once, on the first call. | |
| 137 var source = '$target-result'; | |
| 138 var result = null; | |
| 139 var listener = (TextEvent e) { | |
| 140 result = JSON.parse(e.data); | |
| 141 }; | |
| 142 window.on[source].add(listener); | |
| 143 _dispatchEvent(target, [source, message]); | |
| 144 window.on[source].remove(listener); | |
| 145 return result; | |
| 146 } | |
| 147 } | |
| 148 | |
| 149 // The receiver is in the same Dart isolate, compiled to JS. | |
| 150 class _LocalSendPortSync implements SendPortSync { | |
| 151 | |
| 152 ReceivePortSync _receivePort; | |
| 153 | |
| 154 _LocalSendPortSync._internal(this._receivePort); | |
| 155 | |
| 156 callSync(var message) { | |
| 157 // TODO(vsm): Do a more efficient deep copy. | |
| 158 var copy = _deserialize(_serialize(message)); | |
| 159 var result = _receivePort._callback(copy); | |
| 160 return _deserialize(_serialize(result)); | |
| 161 } | |
| 162 } | |
| 163 | |
| 164 // TODO(vsm): Move this to dart:isolate. This will take some | |
| 165 // refactoring as there are dependences here on the DOM. Users | |
| 166 // interact with this class (or interface if we change it) directly - | |
| 167 // new ReceivePortSync. I think most of the DOM logic could be | |
| 168 // delayed until the corresponding SendPort is registered on the | |
| 169 // window. | |
| 170 | |
| 171 // A Dart2JS ReceivePortSync (tagged 'dart2js' when serialized) is | |
| 172 // identifiable / resolvable by the combination of its isolateid and | |
| 173 // portid. When a corresponding SendPort is used within the same | |
| 174 // isolate, the _portMap below can be used to obtain the | |
| 175 // ReceivePortSync directly. Across isolates (or from JS), an | |
| 176 // EventListener can be used to communicate with the port indirectly. | |
| 177 class ReceivePortSync { | |
| 178 | |
| 179 static Map<int, ReceivePortSync> _portMap; | |
| 180 static int _portIdCount; | |
| 181 static int _cachedIsolateId; | |
| 182 | |
| 183 num _portId; | |
| 184 Function _callback; | |
| 185 EventListener _listener; | |
| 186 | |
| 187 ReceivePortSync() { | |
| 188 if (_portIdCount == null) { | |
| 189 _portIdCount = 0; | |
| 190 _portMap = new Map<int, ReceivePortSync>(); | |
| 191 } | |
| 192 _portId = _portIdCount++; | |
| 193 _portMap[_portId] = this; | |
| 194 } | |
| 195 | |
| 196 static int get _isolateId() { | |
| 197 // TODO(vsm): Make this coherent with existing isolate code. | |
| 198 if (_cachedIsolateId == null) { | |
| 199 _cachedIsolateId = _getNewIsolateId(); | |
| 200 } | |
| 201 return _cachedIsolateId; | |
| 202 } | |
| 203 | |
| 204 static int _getNewIsolateId() native @''' | |
| 205 if (!window.$dart$isolate$counter) { | |
| 206 window.$dart$isolate$counter = 1; | |
| 207 } | |
| 208 return window.$dart$isolate$counter++; | |
| 209 '''; | 59 '''; |
| 210 | 60 |
| 211 static String _getListenerName(isolateId, portId) => | 61 // Fast path to invoke JS send port. |
| 212 'dart-port-$isolateId-$portId'; | 62 _callPortSync(int id, message) { |
| 213 String get _listenerName() => _getListenerName(_isolateId, _portId); | 63 return JS('var', @'ReceivePortSync.dispatchCall(#, #)', id, message); |
| 214 | |
| 215 void receive(callback(var message)) { | |
| 216 // Clear old listener. | |
| 217 if (_callback != null) { | |
| 218 window.on[_listenerName].remove(_listener); | |
| 219 } | |
| 220 | |
| 221 _callback = callback; | |
| 222 | |
| 223 // Install new listener. | |
| 224 var sendport = toSendPort(); | |
| 225 _listener = (TextEvent e) { | |
| 226 var data = JSON.parse(e.data); | |
| 227 var replyTo = data[0]; | |
| 228 var message = _deserialize(data[1]); | |
| 229 var result = sendport.callSync(message); | |
| 230 _dispatchEvent(replyTo, _serialize(result)); | |
| 231 }; | |
| 232 window.on[_listenerName].add(_listener); | |
| 233 } | |
| 234 | |
| 235 void close() { | |
| 236 _portMap.remove(_portId); | |
| 237 window.on[_listenerName].remove(_listener); | |
| 238 } | |
| 239 | |
| 240 SendPortSync toSendPort() { | |
| 241 return new _LocalSendPortSync._internal(this); | |
| 242 } | |
| 243 | |
| 244 static SendPortSync _lookup(int isolateId, int portId) { | |
| 245 if (isolateId == _isolateId) { | |
| 246 return _portMap[portId].toSendPort(); | |
| 247 } else { | |
| 248 return new _RemoteSendPortSync(isolateId, portId); | |
| 249 } | |
| 250 } | |
| 251 } | 64 } |
| 252 | |
| 253 void _dispatchEvent(String receiver, var message) { | |
| 254 var event = document.$dom_createEvent('TextEvent'); | |
| 255 event.initTextEvent(receiver, false, false, window, JSON.stringify(message)); | |
| 256 window.$dom_dispatchEvent(event); | |
| 257 } | |
| OLD | NEW |