summaryrefslogtreecommitdiffstats
path: root/dom/tests/mochitest/general/test_domWindowUtils.html
diff options
context:
space:
mode:
Diffstat (limited to 'dom/tests/mochitest/general/test_domWindowUtils.html')
-rw-r--r--dom/tests/mochitest/general/test_domWindowUtils.html183
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>