| |
| function dispatchEventWithLog(shadow, target, event) { |
| var eventPath = []; |
| var relatedTargets = []; |
| var pathAtTargets = []; |
| |
| var attachedNodes = []; |
| for (var nodeKey in shadow) { |
| var startingNode = shadow[nodeKey]; |
| for (var node = startingNode; node; node = node == document ? window : node.parentNode) { |
| if (attachedNodes.indexOf(node) >= 0) |
| continue; |
| attachedNodes.push(node); |
| node.addEventListener(event.type, (function (event) { |
| eventPath.push(this.label); |
| relatedTargets.push(event.relatedTarget ? event.relatedTarget.label : null); |
| |
| if (!event.composedPath) // Don't fail all tests just for the lack of composedPath. |
| return; |
| |
| pathAtTargets.push(event.composedPath().map(function (node) { return node.label; })); |
| }).bind(node)); |
| } |
| } |
| |
| target.dispatchEvent(event); |
| |
| return {event: event, eventPath: eventPath, relatedTargets: relatedTargets, pathAtTargets: pathAtTargets}; |
| } |
| |
| /* |
| -SR: ShadowRoot -S: Slot |
| A ------------------------------- A-SR |
| + B ------------ B-SR + A1 --- A1-SR |
| + C + B1 --- B1-SR + A2-S + A1a |
| + D --- D-SR + B1a + B1b --- B1b-SR |
| + D1 + B1c-S + B1b1 |
| + B1b2 |
| */ |
| function createTestTree(mode) { |
| var namedNodes = {}; |
| |
| function element(name) { |
| var element = document.createElement(name.indexOf('-S') > 0 ? 'slot' : 'div'); |
| element.label = name; |
| namedNodes[name] = element; |
| for (var i = 1; i < arguments.length; i++) { |
| var item = arguments[i]; |
| if (typeof(item) == 'function') |
| item(element); |
| else |
| element.appendChild(item); |
| } |
| return element; |
| } |
| |
| function shadow(name) { |
| var children = []; |
| for (var i = 1; i < arguments.length; i++) |
| children.push(arguments[i]); |
| return function (element) { |
| var shadowRoot = element.attachShadow({mode: mode}); |
| shadowRoot.label = name; |
| namedNodes[name] = shadowRoot; |
| for (var child of children) |
| shadowRoot.appendChild(child); |
| } |
| } |
| |
| var host = element('A', |
| shadow('A-SR', |
| element('A1', |
| shadow('A1-SR', |
| element('A1a'))), |
| element('A2-S') |
| ), |
| element('B', |
| shadow('B-SR', |
| element('B1', |
| shadow('B1-SR', |
| element('B1b', |
| shadow('B1b-SR', |
| element('B1b1'), |
| element('B1b2'))), |
| element('B1c-S')), |
| element('B1a'))), |
| element('C'), |
| element('D', |
| shadow('D-SR', |
| element('D1'))))); |
| |
| return namedNodes; |
| } |