diff options
Diffstat (limited to 'dom/tests/mochitest/general/test_domWindowUtils.html')
-rw-r--r-- | dom/tests/mochitest/general/test_domWindowUtils.html | 183 |
1 files changed, 183 insertions, 0 deletions
diff --git a/dom/tests/mochitest/general/test_domWindowUtils.html b/dom/tests/mochitest/general/test_domWindowUtils.html new file mode 100644 index 0000000000..2b0bcc9086 --- /dev/null +++ b/dom/tests/mochitest/general/test_domWindowUtils.html @@ -0,0 +1,183 @@ +<!DOCTYPE HTML> +<html> +<head> + <title>Test nsIDOMWindowUtils</title> + <script src="/tests/SimpleTest/SimpleTest.js"></script> + <script src="/tests/SimpleTest/EventUtils.js"></script> + <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"> + <style> + html, body, div { + padding: 0; + margin: 0; + } + + div.test { + position: absolute; + height: 10px; + width: 10px; + } + </style> +</head> + +<body id="body"> + +<div class="test" id="onscreen" style="top: 100px; background-color: red;"></div> +<div class="test" id="offscreen" style="top: 100000px; background-color: green;"></div> + +<script type="application/javascript"> + +SimpleTest.waitForExplicitFinish(); + +var domWindowUtils = SpecialPowers.getDOMWindowUtils(window); + +var gTests = [ +/* + Element elementFromPoint(in long aX, + in long aY, + in boolean aIgnoreRootScrollFrame, + in boolean aFlushLayout); +*/ +async function testElementFromPoint() { + let onscreen = document.getElementById("onscreen"); + let offscreen = document.getElementById("offscreen"); + let htmldoc = document.documentElement; + ok(onscreen, "on screen element exists"); + ok(offscreen, "off screen element exists"); + ok(htmldoc, "htmldoc element exists"); + + let testData = [ + // default behavior is to return null for items outside the viewport + [[0, 100], null, onscreen], + [[9, 109], null, onscreen], + [[0, 100000], null, null], + [[9, 100009], null, null], + + // ignore scroll frame + [[0, 100, true, false], null, onscreen], + [[9, 109, true, false], null, onscreen], + [[0, 100000, true, false], null, offscreen], + [[9, 100009, true, false], null, offscreen], + + // layout flush tests + // test moving element 10px to the left and down, and flushing layout + [[10, 110, false, true], [[10, 110], onscreen], onscreen], + // test moving element back, not flushing layout + // (will get the html document instead) + [[0, 100, false, false], [[0, 100], onscreen], htmldoc], + // test element at same position, flushing layout + [[0, 100, false, true], [[0, 100], onscreen], onscreen], + + // same tests repeated for offscreen element + [[10, 100010, true, true], [[10, 100010], offscreen], offscreen], + [[0, 100000, true, false], [[0, 100000], offscreen], htmldoc], + [[0, 100000, true, true], [[0, 100000], offscreen], offscreen], + ]; + + for (let i = 0; i < testData.length; ++i) { + let [x, y, ignoreScroll, flushLayout] = testData[i][0]; + let moveData = testData[i][1]; + let expected = testData[i][2]; + + if (moveData) { + let moveEl = moveData[1]; + let [moveX, moveY] = moveData[0]; + + moveEl.style.left = moveX + "px"; + moveEl.style.top = moveY + "px"; + } + let found = SpecialPowers.unwrap(domWindowUtils.elementFromPoint( + x, y, ignoreScroll, flushLayout)); + is(found, expected, "at index " + i + " for data " + JSON.stringify(testData[i][0])); + } +}, + +/** + * Test .isHandlingUserInput attribute. + */ +async function testHandlingUserInput() { + ok('isHandlingUserInput' in domWindowUtils, + "isHandlingUserInput should be present"); + + is(domWindowUtils.isHandlingUserInput, false, + "isHandlingUserInput should return false if nothing is happening"); + + var data = [ + { + eventName: "click", + result: true, + }, + { + eventName: "auxclick", + button: 1, + result: true, + }, + { + eventName: "mousemove", + result: false, + }, + { + eventName: "mouseup", + result: true, + }, + { + eventName: "mousedown", + result: true, + }, + { + eventName: "keydown", + result: true, + }, + { + eventName: "keyup", + result: true, + }, + ]; + + for (const {eventName, result, button} of data) { + let eventPromise = new Promise(resolve => { + document.addEventListener(eventName, function() { + is(domWindowUtils.isHandlingUserInput, result, + `isHandlingUserInput should be ${result} for ${eventName}`); + + SimpleTest.executeSoon(resolve); + }, {once: true}); + }); + + SimpleTest.executeSoon(function() { + if (eventName == "click") { + synthesizeMouseAtCenter(document.body, {}); + } else if (eventName == "auxclick" && button) { + synthesizeMouseAtCenter(document.body, { button }); + } else if (eventName.startsWith("key")) { + synthesizeKey("VK_A", { type: eventName }); + } else { + synthesizeMouseAtCenter(document.body, { type: eventName }); + } + }); + + await eventPromise; + } +}, +]; + +async function runner() { + for (let i=0; i<gTests.length; ++i) { + if (i > 0) { + await new Promise(r => SimpleTest.executeSoon(r)); + } + await gTests[i](); + } + + SimpleTest.finish(); +}; + +// Run the test from onload, since the onscreen and offscreen divs should be in +// the right places by then. +addLoadEvent(runner); + +</script> + +<p id="display"></p> + +</body> +</html> |