<!DOCTYPE HTML> <html> <!-- https://bugzilla.mozilla.org/show_bug.cgi?id=633602 --> <head> <title>Bug 633602 - constantXY.html</title> <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"> </script> <script type="text/javascript" src="/tests/SimpleTest/EventUtils.js"></script> <script type="application/javascript" src="pointerlock_utils.js"></script> <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/> </head> <body> <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=633602"> Mozilla Bug 633602 </a> <div id="div"></div> <script type="application/javascript"> /* * Test for Bug 633602 * Confirm that screenX/Y and clientX/Y are constants when the pointer * is locked. */ SimpleTest.waitForExplicitFinish(); SimpleTest.requestFlakyTimeout("We may need to wait for window's moving"); var div , divRect , unLockedCoords , lockedCoords , mouseMoveIntervalID , isUnlocked = false , isLocked = false; function runTests () { ok(isUnlocked, "Pointer should be unlocked"); ok(isLocked, "Pointer should be locked"); // Confirm that pointer coords are constant while locked is(unLockedCoords.clientX, lockedCoords.clientX, "clientX should be equal to where the mouse was originaly locked"); is(unLockedCoords.clientY, lockedCoords.clientY, "clientY should be equal to where the mouse was originaly locked"); is(unLockedCoords.screenX, lockedCoords.screenX, "screenX should be equal to where the mouse was originaly locked"); is(unLockedCoords.screenY, lockedCoords.screenY, "screenY should be equal to where the mouse was originaly locked"); } function moveUnlocked(e) { info("Got mousemove via moveUnlocked"); clearInterval(mouseMoveIntervalID); var firstCall = !unLockedCoords; if (!firstCall) { todo(false, "mousemove is fired twice."); } unLockedCoords = { screenX: e.screenX, screenY: e.screenY, clientX: e.clientX, clientY: e.clientY }; if (!firstCall) { return; } isUnlocked = !document.pointerLockElement; div.requestPointerLock(); } function moveLocked(e) { info("Got mousemove via moveLocked"); clearInterval(mouseMoveIntervalID); div.removeEventListener("mousemove", moveLocked); isLocked = !!document.pointerLockElement; lockedCoords = { screenX: e.screenX, screenY: e.screenY, clientX: e.clientX, clientY: e.clientY }; addFullscreenChangeContinuation("exit", function() { info("Got fullscreenchange for exiting"); runTests(); SimpleTest.finish(); }); document.exitFullscreen(); } document.addEventListener("pointerlockchange", function (e) { if (document.pointerLockElement === div) { info("Got pointerlockchange for entering"); div.removeEventListener("mousemove", moveUnlocked); div.addEventListener("mousemove", moveLocked); divRect = div.getBoundingClientRect(); // Bug 1295815 // Retrigger synthesizeNativeMouseMove until it actually happens. mouseMoveIntervalID = setInterval(() => { synthesizeNativeMouseMove(div, (divRect.width / 4) * 3, (divRect.height / 4) * 3); }, 100); } else { info("Got pointerlockchange for exiting"); } }); function start() { div = document.getElementById("div"); info("Requesting fullscreen on parent"); addFullscreenChangeContinuation("enter", function() { info("Got fullscreenchange for entering"); synthesizeNativeMouseMove(div, 0, 0, () => { div.addEventListener("mousemove", moveUnlocked); divRect = div.getBoundingClientRect(); // Bug 1295815 // Retrigger synthesizeNativeMouseMove until it actually happens. mouseMoveIntervalID = setInterval(() => { synthesizeNativeMouseMove(div, divRect.width / 2, divRect.height / 2); }, 100); }); }); div.requestFullscreen(); } </script> </body> </html>