Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

<!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>