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.html197
1 files changed, 197 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 000000000..377900c80
--- /dev/null
+++ b/dom/tests/mochitest/general/test_domWindowUtils.html
@@ -0,0 +1,197 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test nsIDOMWindowUtils</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" 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;version=1.8">
+
+SimpleTest.waitForExplicitFinish();
+
+var domWindowUtils = SpecialPowers.getDOMWindowUtils(window);
+
+var gTests = [
+/*
+ nsIDOMElement elementFromPoint(in long aX,
+ in long aY,
+ in boolean aIgnoreRootScrollFrame,
+ in boolean aFlushLayout);
+*/
+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 " + testData[i][0].toSource());
+ }
+
+ SimpleTest.executeSoon(function() {
+ next();
+ });
+},
+
+/**
+ * Test .isHandlingUserInput attribute.
+ */
+function testHandlingUserInput() {
+ ok('isHandlingUserInput' in domWindowUtils,
+ "isHandlingUserInput should be present");
+
+ is(domWindowUtils.isHandlingUserInput, false,
+ "isHandlingUserInput should return false if nothing is happening");
+
+ function testEvents() {
+ var data = [
+ {
+ eventName: "click",
+ result: true,
+ },
+ {
+ eventName: "mousemove",
+ result: false,
+ },
+ {
+ eventName: "mouseup",
+ result: true,
+ },
+ {
+ eventName: "mousedown",
+ result: true,
+ },
+ {
+ eventName: "keydown",
+ result: true,
+ },
+ {
+ eventName: "keyup",
+ result: true,
+ },
+ ];
+
+ for (let i=0; i<data.length; ++i) {
+ document.addEventListener(data[i].eventName, function() {
+ document.removeEventListener(data[i].eventName, arguments.callee);
+
+ is(domWindowUtils.isHandlingUserInput, data[i].result,
+ "isHandlingUserInput should be " + data[i].result);
+
+ SimpleTest.executeSoon(function() {
+ try { testEventsRunner.next(); } catch (e) { }
+ });
+ });
+
+ SimpleTest.executeSoon(function() {
+ if (data[i].eventName == "click") {
+ synthesizeMouseAtCenter(document.body, {});
+ } else if (data[i].eventName.indexOf("key") == 0) {
+ synthesizeKey("VK_A", { type: data[i].eventName });
+ } else {
+ synthesizeMouseAtCenter(document.body, { type: data[i].eventName });
+ }
+ });
+
+ yield undefined;
+ }
+
+ SimpleTest.executeSoon(function() {
+ next();
+ });
+ }
+
+ var testEventsRunner = testEvents();
+ testEventsRunner.next();
+},
+];
+
+function runner() {
+ for (let i=0; i<gTests.length; ++i) {
+ gTests[i]();
+ yield undefined;
+ }
+
+ SimpleTest.finish();
+};
+
+var gTestRunner = runner();
+
+function next() {
+ try { gTestRunner.next(); } catch (e) { if (e != StopIteration) { throw e; } }
+}
+
+// Run the test from onload, since the onscreen and offscreen divs should be in
+// the right places by then.
+addLoadEvent(function() {
+ gTestRunner.next();
+});
+
+</script>
+
+<p id="display"></p>
+
+</body>
+</html>