OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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 /** | 5 /** |
6 * Support for interoperating with JavaScript. | 6 * Support for interoperating with JavaScript. |
7 * | 7 * |
8 * This library provides access to JavaScript objects from Dart, allowing | 8 * This library provides access to JavaScript objects from Dart, allowing |
9 * Dart code to get and set properties, and call methods of JavaScript objects | 9 * Dart code to get and set properties, and call methods of JavaScript objects |
10 * and invoke JavaScript functions. The library takes care of converting | 10 * and invoke JavaScript functions. The library takes care of converting |
(...skipping 477 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
488 } | 488 } |
489 return null; | 489 return null; |
490 } | 490 } |
491 | 491 |
492 bool _isLocalObject(o) => JS('bool', '# instanceof Object', o); | 492 bool _isLocalObject(o) => JS('bool', '# instanceof Object', o); |
493 | 493 |
494 // The shared constructor function for proxies to Dart objects in JavaScript. | 494 // The shared constructor function for proxies to Dart objects in JavaScript. |
495 final _dartProxyCtor = JS('', 'function DartObject(o) { this.o = o; }'); | 495 final _dartProxyCtor = JS('', 'function DartObject(o) { this.o = o; }'); |
496 | 496 |
497 dynamic _convertToJS(dynamic o) { | 497 dynamic _convertToJS(dynamic o) { |
498 if (o == null) { | 498 // Note: we don't write `if (o == null) return null;` to make sure dart2js |
499 return null; | 499 // doesn't convert `return null;` into `return;` (which would make `null` be |
500 } else if (o is String || o is num || o is bool) { | 500 // `undefined` in Javascprit). See dartbug.com/20305 for details. |
| 501 if (o == null || o is String || o is num || o is bool) { |
501 return o; | 502 return o; |
502 } else if (o is Blob || o is Event || o is KeyRange || o is ImageData | 503 } else if (o is Blob || o is Event || o is KeyRange || o is ImageData |
503 || o is Node || o is TypedData || o is Window) { | 504 || o is Node || o is TypedData || o is Window) { |
504 return o; | 505 return o; |
505 } else if (o is DateTime) { | 506 } else if (o is DateTime) { |
506 return Primitives.lazyAsJsDate(o); | 507 return Primitives.lazyAsJsDate(o); |
507 } else if (o is JsObject) { | 508 } else if (o is JsObject) { |
508 return o._jsObject; | 509 return o._jsObject; |
509 } else if (o is Function) { | 510 } else if (o is Function) { |
510 return _getJsProxy(o, _JS_FUNCTION_PROPERTY_NAME, (o) { | 511 return _getJsProxy(o, _JS_FUNCTION_PROPERTY_NAME, (o) { |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
573 // Dart in that context. The JS object will have a cached proxy | 574 // Dart in that context. The JS object will have a cached proxy |
574 // but it won't be a valid Dart object in this context. | 575 // but it won't be a valid Dart object in this context. |
575 // For now we throw away the cached proxy, but we should be able | 576 // For now we throw away the cached proxy, but we should be able |
576 // to cache proxies from multiple JS contexts and Dart isolates. | 577 // to cache proxies from multiple JS contexts and Dart isolates. |
577 if (dartProxy == null || !_isLocalObject(o)) { | 578 if (dartProxy == null || !_isLocalObject(o)) { |
578 dartProxy = createProxy(o); | 579 dartProxy = createProxy(o); |
579 _defineProperty(o, propertyName, dartProxy); | 580 _defineProperty(o, propertyName, dartProxy); |
580 } | 581 } |
581 return dartProxy; | 582 return dartProxy; |
582 } | 583 } |
OLD | NEW |