1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
|
<html>
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=795785
-->
<head>
<title>Test for Bug 795785</title>
<script src="/tests/SimpleTest/SimpleTest.js"></script>
<script src="/tests/SimpleTest/EventUtils.js"></script>
<script src="/tests/gfx/layers/apz/test/mochitest/apz_test_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=795785">Mozilla Bug 795785</a>
<div id="display">
<textarea style="overflow: hidden; height: 3em; width: 5em; word-wrap: normal;"></textarea>
<div contenteditable style="overflow: hidden; height: 3em; width: 5em;"></div>
</div>
<div id="content" style="display: none">
</div>
<pre id="test">
</pre>
<script>
"use strict";
function waitForScroll() {
return waitToClearOutAnyPotentialScrolls(window);
}
async function synthesizeKeyInEachEventLoop(aKey, aEvent, aCount) {
for (let i = 0; i < aCount; i++) {
synthesizeKey(aKey, aEvent);
await new Promise(resolve => SimpleTest.executeSoon(resolve));
}
}
async function sendStringOneByOne(aString) {
for (const ch of aString) {
sendString(ch);
await new Promise(resolve => SimpleTest.executeSoon(resolve));
}
}
async function doKeyEventTest(aSelector) {
const element = document.querySelector(aSelector);
if (element.value !== undefined) {
element.value = "";
} else {
element.innerHTML = "";
}
element.focus();
element.scrollTop = 0;
await waitForScroll();
is(element.scrollTop, 0, `${aSelector}.scrollTop should be 0`);
await synthesizeKeyInEachEventLoop("KEY_Enter", {shiftKey: true}, 6);
await waitForScroll();
isnot(element.scrollTop, 0, `${aSelector} should be scrolled by inserting line breaks`);
const oldScrollTop = element.scrollTop;
await synthesizeKeyInEachEventLoop("KEY_ArrowUp", {}, 5);
await waitForScroll();
isnot(element.scrollTop, oldScrollTop, `${aSelector} should be scrolled by up key events`);
await synthesizeKeyInEachEventLoop("KEY_ArrowDown", {}, 5);
await waitForScroll();
is(element.scrollTop, oldScrollTop, `${aSelector} should be scrolled by down key events`);
const longWord = "aaaaaaaaaaaaaaaaaaaa";
await sendStringOneByOne(longWord);
await waitForScroll();
isnot(element.scrollLeft, 0, `${aSelector} should be scrolled by typing long word`);
const oldScrollLeft = element.scrollLeft;
await synthesizeKeyInEachEventLoop("KEY_ArrowLeft", {}, longWord.length);
await waitForScroll();
isnot(element.scrollLeft, oldScrollLeft, `${aSelector} should be scrolled by left key events`);
await synthesizeKeyInEachEventLoop("KEY_ArrowRight", {}, longWord.length);
await waitForScroll();
is(element.scrollLeft, oldScrollLeft, `${aSelector} should be scrolled by right key events`);
}
async function doCompositionTest(aSelector) {
const element = document.querySelector(aSelector);
if (element.value !== undefined) {
element.value = "";
} else {
element.innerHTML = "";
}
element.focus();
element.scrollTop = 0;
await waitForScroll();
is(element.scrollTop, 0, `${aSelector}.scrollTop should be 0`);
const longCompositionString =
"Web \u958b\u767a\u8005\u306e\u7686\u3055\u3093\u306f\u3001" +
"Firefox \u306b\u5b9f\u88c5\u3055\u308c\u3066\u3044\u308b HTML5" +
" \u3084 CSS \u306e\u65b0\u6a5f\u80fd\u3092\u6d3b\u7528\u3059" +
"\u308b\u3053\u3068\u3067\u3001\u9b45\u529b\u3042\u308b Web " +
"\u30b5\u30a4\u30c8\u3084\u9769\u65b0\u7684\u306a Web \u30a2" +
"\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u3088\u308a" +
"\u77ed\u6642\u9593\u3067\u7c21\u5358\u306b\u4f5c\u6210\u3067" +
"\u304d\u307e\u3059\u3002";
synthesizeCompositionChange(
{
composition: {
string: longCompositionString,
clauses: [
{
length: longCompositionString.length,
attr: COMPOSITION_ATTR_RAW_CLAUSE,
},
],
},
caret: {
start: longCompositionString.length,
length: 0,
},
}
);
await waitForScroll();
isnot(element.scrollTop, 0, `${aSelector} should be scrolled by composition`);
synthesizeComposition({ type: "compositioncommit", data: "" });
await waitForScroll();
is(
element.scrollTop,
0,
`${aSelector} should be scrolled back to the top by canceling composition`
);
}
SimpleTest.waitForExplicitFinish();
SimpleTest.waitForFocus(async () => {
await SpecialPowers.pushPrefEnv({
set: [ ["general.smoothScroll", false],
["layout.disable-pixel-alignment", true] ]
});
await doKeyEventTest("textarea");
await doKeyEventTest("div[contenteditable]");
await doCompositionTest("textarea");
await doCompositionTest("div[contenteditable]");
SimpleTest.finish();
});
</script>
</body>
</html>
|