Index: pkg/polymer/test/data/unit/event_path_test.html |
diff --git a/pkg/polymer/test/data/unit/event_path_test.html b/pkg/polymer/test/data/unit/event_path_test.html |
new file mode 100644 |
index 0000000000000000000000000000000000000000..811479ddf6b9666a74a3426fe7e4a36b689954d1 |
--- /dev/null |
+++ b/pkg/polymer/test/data/unit/event_path_test.html |
@@ -0,0 +1,142 @@ |
+<!doctype html> |
+<!-- |
+ 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. |
+--> |
+<html> |
+ <head> |
+ <title>event path</title> |
+ <script src="packages/polymer/testing/testing.js"></script> |
+ <script src="packages/unittest/test_controller.js"></script> |
+ <!-- |
+ Test ported from: |
+ https://github.com/Polymer/polymer/blob/7936ff8/test/html/event-path.html |
+ |
+ This test actually doesn't test the polymer's event layer. It just ensures |
+ that tests are propagated in the right order when using Shadow DOM. |
+ --> |
+ </head> |
+ <body> |
+ |
+ <polymer-element name="x-selector"> |
+ <template> |
+ <div id="selectorDiv"> |
+ <content id="selectorContent"></content> |
+ </div> |
+ </template> |
+ <script type="application/dart"> |
+ import 'package:polymer/polymer.dart'; |
+ @CustomTag("x-selector") |
+ class XSelector extends PolymerElement {} |
+ </script> |
+ </polymer-element> |
+ |
+ <polymer-element name="x-overlay"> |
+ <template> |
+ <content id="overlayContent"></content> |
+ </template> |
+ <script type="application/dart"> |
+ import 'package:polymer/polymer.dart'; |
+ @CustomTag("x-overlay") |
+ class XOverlay extends PolymerElement {} |
+ </script> |
+ </polymer-element> |
+ |
+ <polymer-element name="x-menu" extends="x-selector"> |
+ <template> |
+ <div id="menuDiv"> |
+ <shadow id="menuShadow"></shadow> |
+ </div> |
+ </template> |
+ <script type="application/dart"> |
+ import 'package:polymer/polymer.dart'; |
+ @CustomTag("x-menu") |
+ class XMenu extends PolymerElement {} |
+ </script> |
+ </polymer-element> |
+ |
+ <polymer-element name="x-menu-button"> |
+ <template> |
+ <div> |
+ <x-overlay id="overlay"> |
+ <div id="menuButtonDiv"> |
+ <x-menu id="menu"> |
+ <content id="menuButtonContent"></content> |
+ </x-menu> |
+ </div> |
+ </x-overlay> |
+ </div> |
+ </template> |
+ <script type="application/dart"> |
+ import 'package:polymer/polymer.dart'; |
+ @CustomTag("x-menu-button") |
+ class XMenuButton extends PolymerElement {} |
+ </script> |
+ </polymer-element> |
+ |
+ <x-menu-button id="menuButton"> |
+ <div id="item1"><div id="source"></div>Item1</div> |
+ <div id="item2">Item2</div> |
+ </x-menu-button> |
+ |
+ |
+ <script type="application/dart"> |
+ import 'dart:html'; |
+ import 'dart:async'; |
+ import 'package:unittest/unittest.dart'; |
+ import 'package:unittest/html_config.dart'; |
+ |
+ main() { |
+ useHtmlConfiguration(); |
+ test('bubbling in the right order', () { |
+ // TODO(sigmund): this should change once we port over the |
+ // 'WebComponentsReady' event. |
+ runAsync(expectAsync0(() { |
+ var item1 = query('#item1'); |
+ var menuButton = query('#menuButton'); |
+ // Note: polymer uses automatic node finding (menuButton.$.menu) |
+ // also note that their node finding code also reachs into the ids |
+ // from the parent shadow (menu.$.selectorContent instead of |
+ // menu.$.menuShadow.$.selectorContent) |
+ var menu = menuButton.shadowRoot.query('#menu'); |
+ var selector = menu.shadowRoot.query("#menuShadow"); |
+ var overlay = menuButton.shadowRoot.query('#overlay'); |
+ var expectedPath = <Node>[ |
+ item1, |
+ menuButton.shadowRoot.query('#menuButtonContent'), |
+ selector.olderShadowRoot.query('#selectorContent'), |
+ selector.olderShadowRoot.query('#selectorDiv'), |
+ menu.shadowRoot.query('#menuShadow').olderShadowRoot, |
+ menu.shadowRoot.query('#menuShadow'), |
+ menu.shadowRoot.query('#menuDiv'), |
+ menu.shadowRoot, |
+ menu, |
+ menuButton.shadowRoot.query('#menuButtonDiv'), |
+ // TODO(sigmund): this test is currently broken because currently |
+ // registerElement is sensitive to the order in which each custom |
+ // element is registered. When fixed, we should be able to add the |
+ // following three targets: |
+ // overlay.shadowRoot.query('#overlayContent'), |
+ // overlay.shadowRoot, |
+ // overlay, |
+ menuButton.shadowRoot, |
+ menuButton |
+ ]; |
+ var x = 0; |
+ for (int i = 0; i < expectedPath.length; i++) { |
+ var node = expectedPath[i]; |
+ expect(node, isNotNull, reason: "Should not be null at $i"); |
+ node.on['x'].listen(expectAsync1((e) { |
+ expect(e.currentTarget, node); |
+ expect(x++, i); |
+ })); |
+ } |
+ |
+ item1.dispatchEvent(new Event('x', canBubble: true)); |
+ })); |
+ }); |
+ } |
+ </script> |
+ </body> |
+</html> |