Index: LayoutTests/fast/events/dispatch-mouse-events-to-window-always.html |
diff --git a/LayoutTests/fast/events/dispatch-mouse-events-to-window-always.html b/LayoutTests/fast/events/dispatch-mouse-events-to-window-always.html |
new file mode 100644 |
index 0000000000000000000000000000000000000000..9f4b6ee719aa9207fce3318752e89f219a75f896 |
--- /dev/null |
+++ b/LayoutTests/fast/events/dispatch-mouse-events-to-window-always.html |
@@ -0,0 +1,101 @@ |
+<!DOCTYPE html> |
+<style> |
+* { |
+ padding: 0; |
+ margin: 0; |
+} |
+ |
+::-webkit-scrollbar { |
+ display: none; |
+} |
+ |
+html, body { |
+ height: 400px; |
+ width: 400px; |
+ background: #eee; |
+ padding: 0; |
+ margin: 0; |
+} |
+ |
+div#child { |
+ position: absolute; |
+ top : 0; |
+ left: 400px; |
+ width: 400px; |
+ height: 10000px; |
+ background: #ddd; |
+} |
+ |
+</style> |
+ |
+<body> |
+ <div id='child'></div> |
+ <div id='console'></div> |
+</body> |
+ |
+<script src="../../resources/js-test.js"></script> |
+<script> |
+jsTestIsAsync = true; |
+setPrintTestResultsLazily(); |
+description('Test that wheel and mouse events are dispatched to document ' + |
+ 'and window even if they do not hit any element in the page.'); |
+ |
+onload = function() { |
+ if (!window.eventSender) { |
+ testFailed('window.eventSender is required for this test.'); |
+ return; |
+ } |
+ |
+ window.receivers = new Map(); |
+ var eventTypes = ['wheel', 'click', 'mousedown', 'mouseup']; |
+ var eventTargets = [window, document, document.body, document.getElementById('child')]; |
+ |
+ for (var eventType of eventTypes) { |
+ window.receivers[eventType] = []; |
+ for (var target of eventTargets) { |
+ target.addEventListener(eventType, registerEvent.bind(target)); |
+ } |
+ } |
+ |
+ debug('outside body, inside element'); // received by element, body, doc, window |
+ generateEventsAndVerify(500, 500, [document.getElementById('child'), document.body, document, window]); |
+ debug('inside body, outside element'); // received by body, doc, window |
+ generateEventsAndVerify(10, 10, [document.body, document, window]); |
+ debug('outside body, outside element, inside frame'); // received by doc, window |
+ generateEventsAndVerify(10, 500, [document, window]); |
+ debug('outside body, outside element, outside frame'); // received by doc, window |
+ generateEventsAndVerify(10, 2000, [document, window]); |
+ |
+ finishJSTest(); |
+ |
+ function registerEvent(e) { |
+ window.receivers[e.type].push(this); |
+ } |
+ |
+ function generateEventsAndVerify(x, y, expectedReceivers) { |
+ eventSender.mouseMoveTo(x, y); |
+ eventSender.mouseDown(); |
+ verifyReceivers('mousedown', expectedReceivers); |
+ |
+ eventSender.mouseUp(); |
+ verifyReceivers('mouseup', expectedReceivers); |
+ verifyReceivers('click', expectedReceivers); |
+ |
+ eventSender.mouseScrollBy(10, 10); |
+ verifyReceivers('wheel', expectedReceivers); |
+ } |
+ |
+ function verifyReceivers(eventType, expectedReceivers) { |
+ debug('eventType: ' + eventType); |
+ window.actualReceivers = window.receivers[eventType]; |
+ shouldBeEqualToString('objectsToString(actualReceivers)', objectsToString(expectedReceivers)); |
+ |
+ window.receivers[eventType] = []; |
+ } |
+} |
+ |
+function objectsToString(objects) { |
+ return String(objects.map(function(o) {return o.constructor.name;})); |
+} |
+ |
+</script> |