fast/dom/shadow/shadow-dom-event-dispatching.html flake
[WebKit-https.git] / LayoutTests / fast / dom / shadow / resources / event-dispatching.js
1 description("Tests to ensure that event dispatching behaves as the Shadow DOM spec describes.");
2
3 var defaultPaddingSize = 40;
4
5 function moveMouseOver(element)
6 {
7     if (!window.eventSender || !window.internals)
8         return;
9
10     var x = element.offsetLeft + element.offsetWidth / 2;
11     var y;
12     if (element.hasChildNodes() || window.internals.shadowRoot(element))
13         y = element.offsetTop + defaultPaddingSize / 2;
14     else
15         y = element.offsetTop + element.offsetHeight / 2;
16     eventSender.mouseMoveTo(x, y);
17 }
18
19 var eventRecords = {};
20
21 function clearEventRecords()
22 {
23     eventRecords = {};
24 }
25
26 function dispatchedEvent(eventType)
27 {
28     var events = eventRecords[eventType];
29     if (!events)
30         return [];
31     return events;
32 }
33
34 function recordEvent(event)
35 {
36     var eventType = event.type
37     if (!eventRecords[eventType]) {
38         eventRecords[eventType] = []
39     }
40     var eventString = '';
41     if (event.currentTarget)
42         eventString += ' @' + event.currentTarget.id;
43     if (event.target)
44         eventString += ' (target: ' + event.target.id + ')';
45     if (event.relatedTarget)
46         eventString += ' (related: ' + event.relatedTarget.id + ')';
47     if (event.eventPhase == 1)
48         eventString += '(capturing phase)';
49     if (event.target && event.currentTarget && event.target.id == event.currentTarget.id)
50         shouldBe("event.eventPhase", "2", true);
51     eventRecords[eventType].push(eventString);
52 }
53
54 function dumpNode(node)
55 {
56     var output = node.nodeName + "\t";
57     if (node.id)
58         output += ' id=' + node.id;
59     if (node.className)
60         output += ' class=' + node.className;
61     return output;
62 }
63
64 function dumpComposedShadowTree(node, indent)
65 {
66     indent = indent || "";
67     var output = indent + dumpNode(node) + "\n";
68     var child;
69     for (child = internals.firstChildByWalker(node); child; child = internals.nextSiblingByWalker(child))
70          output += dumpComposedShadowTree(child, indent + "\t");
71     return output;
72 }
73
74 function addEventListeners(nodes)
75 {
76     for (var i = 0; i < nodes.length; ++i) {
77         var node = getNodeInShadowTreeStack(nodes[i]);
78         node.addEventListener('mouseover', recordEvent, false);
79         node.addEventListener('mouseout', recordEvent, false);
80         node.addEventListener('click', recordEvent, false);
81         // <content> might be an inactive insertion point, so style it also.
82         if (node.tagName == 'DIV' || node.tagName == 'DETAILS' || node.tagName == 'SUMMARY' || node.tagName == 'CONTENT')
83             node.setAttribute('style', 'padding-top: ' + defaultPaddingSize + 'px;');
84     }
85 }
86
87 function debugDispatchedEvent(eventType)
88 {
89     debug('\n  ' + eventType);
90     var events = dispatchedEvent(eventType);
91     for (var i = 0; i < events.length; ++i)
92         debug('    ' + events[i])
93 }
94
95 function moveMouse(oldElementId, newElementId)
96 {
97     clearEventRecords();
98     debug('\n' + 'Moving mouse from ' + oldElementId + ' to ' + newElementId);
99     moveMouseOver(getNodeInShadowTreeStack(oldElementId));
100
101     clearEventRecords();
102     moveMouseOver(getNodeInShadowTreeStack(newElementId));
103
104     debugDispatchedEvent('mouseout');
105     debugDispatchedEvent('mouseover');
106 }
107
108 function showSandboxTree()
109 {
110     var sandbox = document.getElementById('sandbox');
111     sandbox.offsetLeft;
112     debug('\n\nComposed Shadow Tree will be:\n' + dumpComposedShadowTree(sandbox));
113 }
114