4 <script src="../../../resources/js-test.js"></script>
5 <script src="resources/shadow-dom.js"></script>
8 <p id="description"></p>
9 <div id="sandbox"></div>
10 <pre id="console"></pre>
12 description("Tests to ensure that some kinds of events are stopeed at shadow boundary.");
14 var eventRecords = {};
16 function dispatchedEvent(eventType)
18 var events = eventRecords[eventType];
24 function dumpDispatchedEvent(eventType)
26 debug('\n ' + eventType);
27 var events = dispatchedEvent(eventType);
28 for (var i = 0; i < events.length; ++i)
29 debug(' ' + events[i])
32 function recordEvent(event)
34 var eventType = event.type
35 if (!eventRecords[eventType]) {
36 eventRecords[eventType] = []
39 if (event.currentTarget)
40 eventString += ' @' + event.currentTarget.id;
42 eventString += ' (target: ' + event.target.id + ')';
43 if (event.relatedTarget)
44 eventString += ' (related: ' + event.relatedTarget.id + ')';
45 if (event.eventPhase == 1)
46 eventString += '(capturing phase)';
47 if (event.target && event.currentTarget && event.target.id == event.currentTarget.id)
48 shouldBe("event.eventPhase", "2", true);
49 eventRecords[eventType].push(eventString);
52 debug('Other events than "click" should be stopped at shadow boundary. A "click" is added for the purpose of comparing results.');
54 var events = ['abort', 'select', 'change', 'reset', 'resize', 'scroll', 'selectstart', 'load', 'error', 'click'];
56 function addEventListeners(nodes)
58 for (var i = 0; i < nodes.length; ++i) {
59 var node = getNodeInTreeOfTrees(nodes[i]);
60 for (var j = 0; j < events.length; ++j)
61 node.addEventListener(events[j], recordEvent, false);
65 function testEventsShoudBeStoppedAtShadowBoundary()
67 var sandbox = document.getElementById('sandbox');
68 sandbox.innerHTML = '';
70 createDOM('div', {'id': 'top'},
71 createDOM('div', {'id': 'host'},
73 createDOM('div', {'id': 'parent-of-target'},
74 createDOM('div', {'id': 'target'})),
75 createDOM('div', {'id': 'parent-of-content'},
76 createDOM('content', {'id': 'content'}))),
77 createDOM('div', {'id': 'distributed-child'}))));
78 document.body.offsetLeft;
80 addEventListeners(['top', 'host', 'host/parent-of-target', 'host/target', 'host/parent-of-content', 'host/content', 'distributed-child']);
82 for (var i = 0; i < events.length; ++i) {
84 var event = document.createEvent('UIEvent');
85 event.initEvent(events[i], true, false);
86 getNodeInTreeOfTrees('host/target').dispatchEvent(event);
87 dumpDispatchedEvent(events[i]);
92 function testEventsFiredOnDistributedNodesShouldNotBeStoppedAtShadowBoundary()
94 var sandbox = document.getElementById('sandbox');
95 sandbox.innerHTML = '';
97 createDOM('div', {'id': 'host1'},
99 createDOM('div', {'id': 'host2'},
101 createDOM('div', {'id': 'parent-of-content'},
102 createDOM('content', {'id': 'content'}))),
103 createDOM('div', {'id': 'distributed-child'})))));
104 document.body.offsetLeft;
106 addEventListeners(['host1', 'host1/host2', 'host1/host2/parent-of-content', 'host1/host2/content', 'host1/distributed-child']);
108 debug('\nAn event fired on a distributed child should not be stopped at the shadow boundary of its host (host2), but should be stopped at the nearest shadow boundary (host1).');
110 var event = document.createEvent('UIEvent');
111 event.initEvent('selectstart', true, false);
112 getNodeInTreeOfTrees('host1/distributed-child').dispatchEvent(event);
113 dumpDispatchedEvent('selectstart');
116 function testEventsInMultipleShadowTrees()
118 debug("\nAn event is dispatched on a node in an older shadow tree. The older and the younger shadow root should receive the event, however, the shadow host shouldn't");
120 var sandbox = document.getElementById('sandbox');
121 sandbox.innerHTML = '';
123 createDOM('div', {'id': 'shadow-host'},
124 createShadowRoot({'id': 'older-shadow-root'},
125 createDOM('div', {'id': 'target'})),
126 createShadowRoot({'id': 'younger-shadow-root'},
127 createDOM('shadow', {'id': 'shadow-insertion-point'}))));
128 document.body.offsetLeft;
130 addEventListeners(['shadow-host', 'shadow-host/', 'shadow-host/target', 'shadow-host//', 'shadow-host//shadow-insertion-point']);
133 var event = document.createEvent('UIEvent');
134 event.initEvent('selectstart', true, false);
135 getNodeInTreeOfTrees('shadow-host/target').dispatchEvent(event);
136 dumpDispatchedEvent('selectstart');
141 if (window.testRunner)
142 testRunner.dumpAsText();
144 testEventsShoudBeStoppedAtShadowBoundary()
145 testEventsFiredOnDistributedNodesShouldNotBeStoppedAtShadowBoundary();
146 testEventsInMultipleShadowTrees();