Index: pkg/polymer/test/js_interop_test.dart |
diff --git a/pkg/polymer/test/js_interop_test.dart b/pkg/polymer/test/js_interop_test.dart |
index 3704ccb93addc5a6d30b535d2459d6cb484bd6bf..e4bc6aa530781cb1ea2e2997f272713378c012d4 100644 |
--- a/pkg/polymer/test/js_interop_test.dart |
+++ b/pkg/polymer/test/js_interop_test.dart |
@@ -1,4 +1,4 @@ |
-// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
+// Copyright (c) 2014, 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. |
@@ -11,11 +11,35 @@ import 'package:polymer/polymer.dart'; |
import 'package:unittest/html_config.dart'; |
import 'package:unittest/unittest.dart'; |
-@CustomTag("dart-element") |
+@CustomTag('dart-element') |
class DartElement extends PolymerElement { |
DartElement.created() : super.created(); |
} |
+@CustomTag('dart-element2') |
+class DartElement2 extends PolymerElement { |
+ Element get quux => this.querySelector('.quux'); |
+ DartElement2.created() : super.created(); |
+} |
+ |
+@CustomTag('dart-element3') |
+class DartElement3 extends PolymerElement { |
+ @observable var quux; |
+ DartElement3.created() : super.created(); |
+ |
+ domReady() { |
+ quux = new JsObject.jsify({ |
+ 'aDartMethod': (x) => 444 + x |
+ }); |
+ } |
+} |
+ |
+@CustomTag('dart-two-way') |
+class DartTwoWay extends PolymerElement { |
+ @observable var twoWay = 40; |
+ DartTwoWay.created() : super.created(); |
+} |
+ |
main() => initPolymer().run(() { |
useHtmlConfiguration(); |
@@ -31,6 +55,51 @@ main() => initPolymer().run(() { |
test('js-element in dart-element', () => testInterop( |
querySelector('dart-element').shadowRoot.querySelector('js-element'))); |
+ |
+ test('elements can be passed through Node.bind to JS', () { |
+ var text = querySelector('dart-element2') |
+ .shadowRoot.querySelector('js-element2') |
+ .shadowRoot.text; |
+ expect(text, 'QUX:123'); |
+ }); |
+ |
+ test('objects with functions can be passed through Node.bind to JS', () { |
+ var sr = querySelector('dart-element3') |
+ .shadowRoot.querySelector('js-element3') |
+ .shadowRoot; |
+ |
+ return new Future(() { |
+ expect(sr.text, 'js-element3[qux]:765'); |
+ }); |
+ }); |
+ |
+ test('two way bindings work', () { |
+ var dartElem = querySelector('dart-two-way'); |
+ var jsElem = dartElem.shadowRoot.querySelector('js-two-way'); |
+ var interop = new JsObject.fromBrowserObject(jsElem); |
+ |
+ return new Future(() { |
+ expect(jsElem.shadowRoot.text, 'FOOBAR:40'); |
+ |
+ expect(dartElem.twoWay, 40); |
+ expect(interop['foobar'], 40); |
+ |
+ interop.callMethod('aJsMethod', [2]); |
+ |
+ // Because Polymer.js two-way bindings are just a getter/setter pair |
+ // pointing at the original, we will see the new value immediately. |
+ expect(dartElem.twoWay, 42); |
+ |
+ expect(interop['foobar'], 42); |
+ |
+ // Text will update asynchronously |
+ expect(jsElem.shadowRoot.text, 'FOOBAR:40'); |
+ |
+ return new Future(() { |
+ expect(jsElem.shadowRoot.text, 'FOOBAR:42'); |
+ }); |
+ }); |
+ }); |
}); |
testInterop(jsElem) { |