| // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| import 'native_testing.dart'; |
| import 'dart:_js_helper' show setNativeSubclassDispatchRecord; |
| import 'dart:_interceptors' |
| show |
| JSObject, // The interface, which may be re-exported by a |
| // js-interop library. |
| JavaScriptObject, // The interceptor abstract class. |
| PlainJavaScriptObject, // The interceptor concrete class. |
| UnknownJavaScriptObject, // The interceptor concrete class. |
| Interceptor; |
| |
| // Test for JavaScript objects from outside the Dart program. Although we only |
| // export the interface [JSObject] to user level code, this test makes sure we |
| // can distinguish plain JavaScript objects from ones with a complex prototype. |
| |
| @Native('QQ') |
| class Q {} |
| |
| makeA() native; |
| makeB() native; |
| makeQ() native; |
| |
| void setup() { |
| JS('', r""" |
| (function(){ |
| makeA = function(){return {hello: 123};}; |
| |
| function BB(){} |
| makeB = function(){return new BB();}; |
| |
| function QQ(){} |
| makeQ = function(){return new QQ();}; |
| |
| self.nativeConstructor(QQ); |
| })()"""); |
| } |
| |
| class Is<T> { |
| bool check(x) => x is T; |
| } |
| |
| static_test() { |
| var x = makeA(); |
| Expect.isTrue(x is JSObject); |
| Expect.isTrue(x is JavaScriptObject); |
| Expect.isTrue(x is PlainJavaScriptObject); |
| Expect.isTrue(x is! UnknownJavaScriptObject); |
| Expect.equals(JSObject, x.runtimeType); |
| |
| x = makeB(); |
| Expect.isTrue(x is JSObject); |
| Expect.isTrue(x is JavaScriptObject); |
| Expect.isTrue(x is! PlainJavaScriptObject); |
| Expect.isTrue(x is UnknownJavaScriptObject); |
| Expect.equals(JSObject, x.runtimeType); |
| |
| x = makeQ(); |
| Expect.isFalse(x is JSObject); |
| Expect.isFalse(x is JavaScriptObject); |
| Expect.isFalse(x is PlainJavaScriptObject); |
| Expect.isFalse(x is UnknownJavaScriptObject); |
| Expect.isFalse(x.runtimeType == JSObject); |
| Expect.isTrue(x is Q); |
| } |
| |
| dynamic_test() { |
| var x = makeA(); |
| var isJSObject = new Is<JSObject>().check; |
| var isJavaScriptObject = new Is<JavaScriptObject>().check; |
| var isPlainJavaScriptObject = new Is<PlainJavaScriptObject>().check; |
| var isUnknownJavaScriptObject = new Is<UnknownJavaScriptObject>().check; |
| var isQ = new Is<Q>().check; |
| |
| Expect.isTrue(isJSObject(x)); |
| Expect.isTrue(isJavaScriptObject(x)); |
| Expect.isTrue(isPlainJavaScriptObject(x)); |
| Expect.isTrue(!isUnknownJavaScriptObject(x)); |
| Expect.equals(JSObject, x.runtimeType); |
| |
| x = makeB(); |
| Expect.isTrue(isJSObject(x)); |
| Expect.isTrue(isJavaScriptObject(x)); |
| Expect.isTrue(!isPlainJavaScriptObject(x)); |
| Expect.isTrue(isUnknownJavaScriptObject(x)); |
| Expect.equals(JSObject, x.runtimeType); |
| |
| x = makeQ(); |
| Expect.isFalse(isJSObject(x)); |
| Expect.isFalse(isJavaScriptObject(x)); |
| Expect.isFalse(isPlainJavaScriptObject(x)); |
| Expect.isFalse(isUnknownJavaScriptObject(x)); |
| Expect.isTrue(isQ(x)); |
| Expect.isFalse(x.runtimeType == JSObject); |
| } |
| |
| main() { |
| nativeTesting(); |
| setup(); |
| |
| dynamic_test(); |
| static_test(); |
| } |