| <!DOCTYPE html> | |
| <title>Shadow DOM: Event path and Event.composedPath()</title> | |
| <meta name="author" title="Hayato Ito" href="mailto:hayato@google.com"> | |
| <script src="/resources/testharness.js"></script> | |
| <script src="/resources/testharnessreport.js"></script> | |
| <script src="resources/shadow-dom.js"></script> | |
| <div id="test1"> | |
| <div id="d1"> | |
| <div id="target"></div> | |
| </div> | |
| </div> | |
| <script> | |
| test(() => { | |
| let n = createTestTree(test1); | |
| let log = dispatchEventWithLog(n, n.target, new Event('my-event', { bubbles: true, composed: true })); | |
| let path = ['target', 'd1', 'test1']; | |
| assert_event_path_equals(log, | |
| [['target', 'target', null, path], | |
| ['d1', 'target', null, path], | |
| ['test1', 'target', null, path]]); | |
| }, 'Event Path without ShadowRoots.'); | |
| </script> | |
| <div id="test2"> | |
| <div id="host"> | |
| <template id="sr" data-mode="open"> | |
| <div id="target"></div> | |
| </template> | |
| </div> | |
| </div> | |
| <script> | |
| test(() => { | |
| let n = createTestTree(test2); | |
| let log = dispatchEventWithLog(n, n.target, new Event('my-event', { bubbles: true, composed: true })); | |
| let path = ['target', 'sr', 'host', 'test2']; | |
| assert_event_path_equals(log, | |
| [['target', 'target', null, path], | |
| ['sr', 'target', null, path], | |
| ['host', 'host', null, path], | |
| ['test2', 'host', null, path]]); | |
| }, 'Event Path with an open ShadowRoot.'); | |
| </script> | |
| <div id="test3"> | |
| <div id="host"> | |
| <template id="sr" data-mode="closed"> | |
| <div id="target"></div> | |
| </template> | |
| </div> | |
| </div> | |
| <script> | |
| test(() => { | |
| let n = createTestTree(test3); | |
| let log = dispatchEventWithLog(n, n.target, new Event('my-event', { bubbles: true, composed: true })); | |
| let path = ['target','sr', 'host', 'test3']; | |
| let path1 = ['host', 'test3']; | |
| assert_event_path_equals(log, [['target', 'target', null, path], | |
| ['sr', 'target', null, path], | |
| ['host', 'host', null, path1], | |
| ['test3', 'host', null, path1]]); | |
| }, 'Event Path with a closed ShadowRoot.'); | |
| </script> | |
| <div id="test4"> | |
| <div id="host1"> | |
| <template id="sr1" data-mode="open"> | |
| <div id="host2"> | |
| <template id="sr2" data-mode="open"> | |
| <div id="target"></div> | |
| </template> | |
| </div> | |
| </template> | |
| </div> | |
| </div> | |
| <script> | |
| test(() => { | |
| let n = createTestTree(test4); | |
| let log = dispatchEventWithLog(n, n.target, new Event('my-event', { bubbles: true, composed: true })); | |
| let path = ['target', 'sr2', 'host2', 'sr1', 'host1', 'test4']; | |
| assert_event_path_equals(log, [['target', 'target', null, path], | |
| ['sr2', 'target', null, path], | |
| ['host2', 'host2', null, path], | |
| ['sr1', 'host2', null, path], | |
| ['host1', 'host1', null, path], | |
| ['test4', 'host1', null, path]]); | |
| }, 'Event Path with nested ShadowRoots: open > open.'); | |
| </script> | |
| <div id="test5"> | |
| <div id="host1"> | |
| <template id="sr1" data-mode="open"> | |
| <div id="host2"> | |
| <template id="sr2" data-mode="closed"> | |
| <div id="target"></div> | |
| </template> | |
| </div> | |
| </template> | |
| </div> | |
| </div> | |
| <script> | |
| test(() => { | |
| let n = createTestTree(test5); | |
| let log = dispatchEventWithLog(n, n.target, new Event('my-event', { bubbles: true, composed: true })); | |
| let path = ['target', 'sr2', 'host2', 'sr1', 'host1', 'test5']; | |
| let path1 = ['host2', 'sr1', 'host1', 'test5']; | |
| assert_event_path_equals(log, [['target', 'target', null, path], | |
| ['sr2', 'target', null, path], | |
| ['host2', 'host2', null, path1], | |
| ['sr1', 'host2', null, path1], | |
| ['host1', 'host1', null, path1], | |
| ['test5', 'host1', null, path1]]); | |
| }, 'Event Path with nested ShadowRoots: open > closed.'); | |
| </script> | |
| <div id="test6"> | |
| <div id="host1"> | |
| <template id="sr1" data-mode="closed"> | |
| <div id="host2"> | |
| <template id="sr2" data-mode="open"> | |
| <div id="target"></div> | |
| </template> | |
| </div> | |
| </template> | |
| </div> | |
| </div> | |
| <script> | |
| test(() => { | |
| let n = createTestTree(test6); | |
| let log = dispatchEventWithLog(n, n.target, new Event('my-event', { bubbles: true, composed: true })); | |
| let path = ['target', 'sr2', 'host2', 'sr1', 'host1', 'test6']; | |
| let path1 = ['host1', 'test6']; | |
| assert_event_path_equals(log, [['target', 'target', null, path], | |
| ['sr2', 'target', null, path], | |
| ['host2', 'host2', null, path], | |
| ['sr1', 'host2', null, path], | |
| ['host1', 'host1', null, path1], | |
| ['test6', 'host1', null, path1]]); | |
| }, 'Event Path with nested ShadowRoots: closed > open.'); | |
| </script> | |
| <div id="test7"> | |
| <div id="host1"> | |
| <template id="sr1" data-mode="closed"> | |
| <div id="host2"> | |
| <template id="sr2" data-mode="closed"> | |
| <div id="target"></div> | |
| </template> | |
| </div> | |
| </template> | |
| </div> | |
| </div> | |
| <script> | |
| test(() => { | |
| let n = createTestTree(test7); | |
| let log = dispatchEventWithLog(n, n.target, new Event('my-event', { bubbles: true, composed: true })); | |
| let path = ['target', 'sr2', 'host2', 'sr1', 'host1', 'test7']; | |
| let path1 = ['host2', 'sr1', 'host1', 'test7']; | |
| let path2 = ['host1', 'test7']; | |
| assert_event_path_equals(log, [['target', 'target', null, path], | |
| ['sr2', 'target', null, path], | |
| ['host2', 'host2', null, path1], | |
| ['sr1', 'host2', null, path1], | |
| ['host1', 'host1', null, path2], | |
| ['test7', 'host1', null, path2]]); | |
| }, 'Event Path with nested ShadowRoots: closed > closed.'); | |
| </script> | |
| <div id="test8"> | |
| <div id="host1"> | |
| <template id="sr1" data-mode="open"> | |
| <slot id="slot"></slot> | |
| </template> | |
| <div id="target"></div> | |
| </div> | |
| </div> | |
| <script> | |
| test(() => { | |
| let n = createTestTree(test8); | |
| let log = dispatchEventWithLog(n, n.target, new Event('my-event', { bubbles: true, composed: true })); | |
| let path = ['target','slot', 'sr1', 'host1', 'test8']; | |
| assert_event_path_equals(log, [['target', 'target', null, path], | |
| ['slot', 'target', null, path], | |
| ['sr1', 'target', null, path], | |
| ['host1', 'target', null, path], | |
| ['test8', 'target', null, path]]); | |
| }, 'Event Path with a slot in an open Shadow Root.'); | |
| </script> | |
| <div id="test9"> | |
| <div id="host1"> | |
| <template id="sr1" data-mode="closed"> | |
| <slot id="slot"></slot> | |
| </template> | |
| <div id="target"></div> | |
| </div> | |
| </div> | |
| <script> | |
| test(() => { | |
| let n = createTestTree(test9); | |
| let log = dispatchEventWithLog(n, n.target, new Event('my-event', { bubbles: true, composed: true })); | |
| let path = ['target', 'slot', 'sr1', 'host1', 'test9']; | |
| let path1 = ['target', 'host1', 'test9']; | |
| assert_event_path_equals(log, [['target', 'target', null, path1], | |
| ['slot', 'target', null, path], | |
| ['sr1', 'target', null, path], | |
| ['host1', 'target', null, path1], | |
| ['test9', 'target', null, path1]]); | |
| }, 'Event Path with a slot in a closed Shadow Root.'); | |
| </script> | |
| <div id="test10"> | |
| <div id="host1"> | |
| <template id="sr1" data-mode="open"> | |
| <div id="host2"> | |
| <template id="sr2" data-mode="open"> | |
| <slot id="slot2"></slot> | |
| </template> | |
| <slot id="slot1"></slot> | |
| </div> | |
| </template> | |
| <div id="target"></div> | |
| </div> | |
| </div> | |
| <script> | |
| test(() => { | |
| let n = createTestTree(test10); | |
| let log = dispatchEventWithLog(n, n.target, new Event('my-event', { bubbles: true, composed: true })); | |
| let path = ['target','slot1', 'slot2', 'sr2', 'host2', 'sr1', 'host1', 'test10']; | |
| assert_event_path_equals(log, [['target', 'target', null, path], | |
| ['slot1', 'target', null, path], | |
| ['slot2', 'target', null, path], | |
| ['sr2', 'target', null, path], | |
| ['host2', 'target', null, path], | |
| ['sr1', 'target', null, path], | |
| ['host1', 'target', null, path], | |
| ['test10', 'target', null, path]]); | |
| }, 'Event Path with slots in nested ShadowRoots: open > open.'); | |
| </script> | |
| <div id="test11"> | |
| <div id="host1"> | |
| <template id="sr1" data-mode="closed"> | |
| <div id="host2"> | |
| <template id="sr2" data-mode="closed"> | |
| <slot id="slot2"></slot> | |
| </template> | |
| <slot id="slot1"></slot> | |
| </div> | |
| </template> | |
| <div id="target"></div> | |
| </div> | |
| </div> | |
| <script> | |
| test(() => { | |
| let n = createTestTree(test11); | |
| let log = dispatchEventWithLog(n, n.target, new Event('my-event', { bubbles: true, composed: true })); | |
| let path = ['target', 'slot1', 'slot2', 'sr2', 'host2', 'sr1', 'host1', 'test11']; | |
| let path1 = ['target', 'slot1', 'host2', 'sr1', 'host1', 'test11']; | |
| let path2 = ['target', 'host1', 'test11']; | |
| assert_event_path_equals(log, [['target', 'target', null, path2], | |
| ['slot1', 'target', null, path1], | |
| ['slot2', 'target', null, path], | |
| ['sr2', 'target', null, path], | |
| ['host2', 'target', null, path1], | |
| ['sr1', 'target', null, path1], | |
| ['host1', 'target', null, path2], | |
| ['test11', 'target', null, path2]]); | |
| }, 'Event Path with slots in nested ShadowRoots: closed > closed.'); | |
| </script> |