| <!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]); |
| |
| 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> |