diff options
Diffstat (limited to 'dom/tests/mochitest/pointerlock/pointerlock_utils.js')
-rw-r--r-- | dom/tests/mochitest/pointerlock/pointerlock_utils.js | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/dom/tests/mochitest/pointerlock/pointerlock_utils.js b/dom/tests/mochitest/pointerlock/pointerlock_utils.js new file mode 100644 index 000000000..163315822 --- /dev/null +++ b/dom/tests/mochitest/pointerlock/pointerlock_utils.js @@ -0,0 +1,120 @@ +// Get test filename for page being run in popup so errors are more useful +var testName = location.pathname.split('/').pop(); + +// Wrap test functions and pass to parent window +window.ok = function(a, msg) { + opener.ok(a, testName + ": " + msg); +}; + +window.is = function(a, b, msg) { + opener.is(a, b, testName + ": " + msg); +}; + +window.isnot = function(a, b, msg) { + opener.isnot(a, b, testName + ": " + msg); +}; + +window.todo = function(a, msg) { + opener.todo(a, testName + ": " + msg); +}; + +window.todo_is = function(a, b, msg) { + opener.todo_is(a, b, testName + ": " + msg); +}; + +window.todo_isnot = function(a, b, msg) { + opener.todo_isnot(a, b, testName + ": " + msg); +}; + +window.info = function(msg) { + opener.info(testName + ": " + msg); +}; + +// Override bits of SimpleTest so test files work stand-alone +var SimpleTest = SimpleTest || {}; + +SimpleTest.waitForExplicitFinish = function() { + dump("[POINTERLOCK] Starting " + testName+ "\n"); +}; + +SimpleTest.finish = function () { + dump("[POINTERLOCK] Finishing " + testName+ "\n"); + opener.nextTest(); +}; + +addLoadEvent(function() { + if (typeof start !== 'undefined') { + SimpleTest.waitForFocus(start); + } +}); + +// Returns true if the window occupies the entire screen. +// Note this only returns true once the transition from normal to +// fullscreen mode is complete. +function inFullscreenMode(win) { + return win.innerWidth == win.screen.width && + win.innerHeight == win.screen.height; +} + +// Returns true if the window is in normal mode, i.e. non fullscreen mode. +// Note this only returns true once the transition from fullscreen back to +// normal mode is complete. +function inNormalMode(win) { + return win.innerWidth == win.normalSize.w && + win.innerHeight == win.normalSize.h; +} + +// Adds a listener that will be called once a fullscreen transition +// is complete. When type==='enter', callback is called when we've +// received a fullscreenchange event, and the fullscreen transition is +// complete. When type==='exit', callback is called when we've +// received a fullscreenchange event and the window dimensions match +// the window dimensions when the window opened (so don't resize the +// window while running your test!). inDoc is the document which +// the listeners are added on, if absent, the listeners are added to +// the current document. +function addFullscreenChangeContinuation(type, callback, inDoc) { + var doc = inDoc || document; + var topWin = doc.defaultView.top; + // Remember the window size in non-fullscreen mode. + if (!topWin.normalSize) { + topWin.normalSize = { + w: window.innerWidth, + h: window.innerHeight + }; + } + function checkCondition() { + if (type == "enter") { + return inFullscreenMode(topWin); + } else if (type == "exit") { + // If we just revert the state to a previous fullscreen state, + // the window won't back to the normal mode. Hence we check + // fullscreenElement first here. Note that we need to check + // the fullscreen element of the outmost document here instead + // of the current one. + return topWin.document.fullscreenElement || inNormalMode(topWin); + } else { + throw "'type' must be either 'enter', or 'exit'."; + } + } + function invokeCallback(event) { + // Use async call after a paint to workaround unfinished fullscreen + // change even when the window size has changed on Linux. + requestAnimationFrame(() => setTimeout(() => callback(event), 0), 0); + } + function onFullscreenChange(event) { + doc.removeEventListener("fullscreenchange", onFullscreenChange, false); + if (checkCondition()) { + invokeCallback(event); + return; + } + function onResize() { + if (checkCondition()) { + topWin.removeEventListener("resize", onResize, false); + invokeCallback(event); + } + } + topWin.addEventListener("resize", onResize, false); + } + doc.addEventListener("fullscreenchange", onFullscreenChange, false); +} |