diff options
Diffstat (limited to 'dom/tests/mochitest/keyhandling/test_browser.xhtml')
-rw-r--r-- | dom/tests/mochitest/keyhandling/test_browser.xhtml | 252 |
1 files changed, 252 insertions, 0 deletions
diff --git a/dom/tests/mochitest/keyhandling/test_browser.xhtml b/dom/tests/mochitest/keyhandling/test_browser.xhtml new file mode 100644 index 0000000000..3cddf5ba76 --- /dev/null +++ b/dom/tests/mochitest/keyhandling/test_browser.xhtml @@ -0,0 +1,252 @@ +<?xml version="1.0"?> + +<window title="Browser element keyhandling tests" + xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" + onload="test();"> + + <script src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/> + <script src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js"/> + <script src="chrome://mochikit/content/tests/SimpleTest/NativeKeyCodes.js"/> + + <script type="application/javascript"> + <![CDATA[ + SimpleTest.waitForExplicitFinish(); + + const IS_MAC = navigator.platform.indexOf("Mac") === 0; + const VK = {}; + const CHARS = {}; + + // Copied values from NativeKeyCodes.js and EventUtils.js + if (IS_MAC) { + VK.LEFT = MAC_VK_LeftArrow; + CHARS.LEFT = "\uF702"; + VK.RIGHT = MAC_VK_RightArrow; + CHARS.RIGHT = "\uF703"; + VK.UP = MAC_VK_UpArrow; + CHARS.UP = "\uF700"; + VK.DOWN = MAC_VK_DownArrow; + CHARS.DOWN = "\uF701"; + VK.SPACE = MAC_VK_Space; + VK.PGDOWN = MAC_VK_PageDown; + CHARS.PGDOWN = "\uF72D"; + VK.PGUP = MAC_VK_PageUp; + CHARS.PGUP = "\uF72C"; + VK.C = MAC_VK_ANSI_C; + VK.HOME = MAC_VK_Home; + CHARS.HOME = "\uF729"; + VK.END = MAC_VK_End; + CHARS.END = "\uF72B"; + } else { + VK.LEFT = WIN_VK_LEFT; + CHARS.LEFT = ""; + VK.RIGHT = WIN_VK_RIGHT; + CHARS.RIGHT = ""; + VK.UP = WIN_VK_UP; + CHARS.UP = ""; + VK.DOWN = WIN_VK_DOWN; + CHARS.DOWN = ""; + VK.SPACE = WIN_VK_SPACE; + VK.PGDOWN = WIN_VK_NEXT; + CHARS.PGDOWN = ""; + VK.PGUP = WIN_VK_PRIOR; + CHARS.PGUP = ""; + VK.C = WIN_VK_C; + VK.HOME = WIN_VK_HOME; + CHARS.HOME = ""; + VK.END = WIN_VK_END; + CHARS.END = ""; + } + + function waitForEvent(target, event) { + info(`Waiting for ${event} event.`); + return new Promise(resolve => { + browser.addEventListener(event, resolve, { once: true }); + }); + } + + function synthesizeKey(keyCode, modifiers, chars) { + return new Promise((resolve, reject) => { + if (!synthesizeNativeKey(KEYBOARD_LAYOUT_EN_US, keyCode, modifiers, chars, chars, resolve)) { + reject(); + } + }); + } + + function getWindowProperties(browser, properties) { + let results = {}; + for (let prop of properties) { + results[prop] = browser.contentWindow[prop]; + } + + return results; + } + + function getScrollPosition(browser) { + return getWindowProperties(browser, ["scrollX", "scrollY"]); + } + + async function test() { + // Smooth scrolling makes scroll events take time and it's difficult to know + // when they've ended, so turn it off for this test. + await SpecialPowers.pushPrefEnv({"set": [["general.smoothScroll", false]] }); + + let browser = document.getElementById("browser"); + browser.focus(); + let { scrollX, scrollY } = await getScrollPosition(browser); + is(scrollX, 0, "Should not be scrolled"); + is(scrollY, 0, "Should not be scrolled"); + + info("down"); + await synthesizeKey(VK.DOWN, {}, CHARS.DOWN); + await waitForEvent(browser.contentWindow, "scroll"); + let { scrollX: lineScrollX, scrollY: lineScrollY } = await getScrollPosition(browser); + is(lineScrollX, 0, "Should not be scrolled"); + ok(lineScrollY > 0, "Should be scrolled"); + + info("up"); + await synthesizeKey(VK.UP, {}, CHARS.UP); + await waitForEvent(browser.contentWindow, "scroll"); + { + let { scrollX, scrollY } = await getScrollPosition(browser); + is(scrollX, 0, "Should not be scrolled"); + is(scrollY, 0, "Should not be scrolled"); + } + + info("right"); + await synthesizeKey(VK.RIGHT, {}, CHARS.RIGHT); + await waitForEvent(browser.contentWindow, "scroll"); + let { scrollX: rightScrollX, scrollY: rightScrollY } = await getScrollPosition(browser); + ok(rightScrollX > 0, "Should be scrolled"); + is(rightScrollY, 0, "Should not be scrolled"); + + info("left"); + await synthesizeKey(VK.LEFT, {}, CHARS.LEFT); + await waitForEvent(browser.contentWindow, "scroll"); + { + let { scrollX, scrollY } = await getScrollPosition(browser); + is(scrollX, 0, "Should not be scrolled"); + is(scrollY, 0, "Should not be scrolled"); + } + + info("space"); + await synthesizeKey(VK.SPACE, {}, " "); + await waitForEvent(browser.contentWindow, "scroll"); + let { scrollX: pageScrollX, scrollY: pageScrollY } = await getScrollPosition(browser); + is(pageScrollX, 0, "Should not be scrolled"); + ok(pageScrollY > lineScrollY, "Should be scrolled more than a single line"); + + info("shift+space"); + await synthesizeKey(VK.SPACE, { shiftKey: true }, " "); + await waitForEvent(browser.contentWindow, "scroll"); + { + let { scrollX, scrollY } = await getScrollPosition(browser); + is(scrollX, 0, "Should not be scrolled"); + is(scrollY, 0, "Should not be scrolled"); + } + + info("page down"); + await synthesizeKey(VK.PGDOWN, {}, CHARS.PGDOWN); + await waitForEvent(browser.contentWindow, "scroll"); + { + let { scrollX, scrollY } = await getScrollPosition(browser); + is(scrollX, 0, "Should not be scrolled"); + is(scrollY, pageScrollY, "Should be scrolled a page"); + } + + info("page up"); + await synthesizeKey(VK.PGUP, {}, CHARS.PGUP); + await waitForEvent(browser.contentWindow, "scroll"); + { + let { scrollX, scrollY } = await getScrollPosition(browser); + is(scrollX, 0, "Should not be scrolled"); + is(scrollY, 0, "Should not be scrolled"); + } + + info("accel+down"); + await synthesizeKey(VK.DOWN, { accelKey: true }, CHARS.DOWN); + await waitForEvent(browser.contentWindow, "scroll"); + { + let { scrollX, scrollY, innerHeight } = await getWindowProperties(browser, ["scrollX", "scrollY", "innerHeight"]); + is(scrollX, 0, "Should not be scrolled"); + // We can't know the scrollbar height so check that we're scrolled to within 100px of what we expect. + isfuzzy(scrollY, browser.contentDocument.body.clientHeight - innerHeight, 100, "Should be scrolled to the end."); + } + + info("accel+up"); + await synthesizeKey(VK.UP, { accelKey: true }, CHARS.UP); + await waitForEvent(browser.contentWindow, "scroll"); + { + let { scrollX, scrollY } = await getScrollPosition(browser); + is(scrollX, 0, "Should not be scrolled"); + is(scrollY, 0, "Should not be scrolled"); + } + + info("end"); + await synthesizeKey(VK.END, {}, CHARS.END); + await waitForEvent(browser.contentWindow, "scroll"); + { + let { scrollX, scrollY, innerHeight } = await getWindowProperties(browser, ["scrollX", "scrollY", "innerHeight"]); + is(scrollX, 0, "Should not be scrolled"); + // We can't know the scrollbar height so check that we're scrolled to within 100px of what we expect. + isfuzzy(scrollY, browser.contentDocument.body.clientHeight - innerHeight, 100, "Should be scrolled to the end."); + } + + info("home"); + await synthesizeKey(VK.HOME, {}, CHARS.HOME); + await waitForEvent(browser.contentWindow, "scroll"); + { + let { scrollX, scrollY } = await getScrollPosition(browser); + is(scrollX, 0, "Should not be scrolled"); + is(scrollY, 0, "Should not be scrolled"); + } + + // Select the start of the first paragraph + let paragraph = browser.contentDocument.getElementById("paragraph"); + let selection = browser.contentWindow.getSelection(); + selection.setBaseAndExtent(paragraph.firstChild, 0, paragraph.firstChild, "Lots of".length); + + info("copy"); + await SimpleTest.promiseClipboardChange("Lots of", () => { + synthesizeKey(VK.C, { accelKey: true }, "c"); + }); + + for (let i = 0; i < " paragraphs".length; i++) { + info("select right"); + await synthesizeKey(VK.RIGHT, { shiftKey: true }, CHARS.RIGHT); + } + + info("copy"); + await SimpleTest.promiseClipboardChange("Lots of paragraphs", () => { + synthesizeKey(VK.C, { accelKey: true }, "c"); + }); + + for (let i = 0; i < " paragraphs".length; i++) { + info("select left"); + await synthesizeKey(VK.LEFT, { shiftKey: true }, CHARS.LEFT); + } + + info("copy"); + await SimpleTest.promiseClipboardChange("Lots of", () => { + synthesizeKey(VK.C, { accelKey: true }, "c"); + }); + + info("select down"); + await synthesizeKey(VK.DOWN, { shiftKey: true }, CHARS.DOWN); + + info("copy"); + await SimpleTest.promiseClipboardChange("Lots of paragraphs to make a vertical scrollbar.\n\nLots of", () => { + synthesizeKey(VK.C, { accelKey: true }, "c"); + }); + + SimpleTest.finish(); + } + ]]> + </script> + + <body xmlns="http://www.w3.org/1999/xhtml"> + <p id="display"></p> + <div id="content" style="display:none;"></div> + <pre id="test"></pre> + </body> + <browser id="browser" src="browsertest.html" style="height: 500px"/> +</window> |