summaryrefslogtreecommitdiffstats
path: root/editor/libeditor/tests/test_bug795785.html
blob: 5f93d5142f942cb354768070d2acdb5a3562a38d (plain)
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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
<html>
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=795785
-->
<head>
  <title>Test for Bug 795785</title>
  <script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
  <script type="text/javascript" src="/tests/SimpleTest/EventUtils.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 id="textarea" style="overflow: hidden; height: 3em; width: 5em; word-wrap: normal;"></textarea>
  <div id="div" contenteditable style="overflow: hidden; height: 3em; width: 5em;"></div>
</div>
<div id="content" style="display: none">
  
</div>
<pre id="test">
</pre>

<script class="testbody" type="application/javascript">


SimpleTest.waitForExplicitFinish();
SimpleTest.requestFlakyTimeout("This test uses setTimeouts in order to fix an intermittent failure.");

// Turn off spatial navigation because it hijacks arrow key events and VK_RETURN
// events.
SimpleTest.waitForFocus(function() {
  SpecialPowers.pushPrefEnv({"set":[["snav.enabled", false]]}, runTests);
});
var textarea = document.getElementById("textarea");
var div = document.getElementById("div");

function hitEventLoop(aFunc, aTimes)
{
  if (--aTimes) {
    setTimeout(hitEventLoop, 0, aFunc, aTimes);
  } else {
    setTimeout(aFunc, 100);
  }
}

function doKeyEventTest(aElement, aElementDescription, aCallback)
{
  aElement.focus();
  aElement.scrollTop = 0;
  hitEventLoop(function () {
    is(aElement.scrollTop, 0,
       aElementDescription + "'s scrollTop isn't 0");
    synthesizeKey("VK_RETURN", { });
    synthesizeKey("VK_RETURN", { });
    synthesizeKey("VK_RETURN", { });
    synthesizeKey("VK_RETURN", { });
    synthesizeKey("VK_RETURN", { });
    synthesizeKey("VK_RETURN", { });
    hitEventLoop(function () {
      isnot(aElement.scrollTop, 0,
            aElementDescription + " was not scrolled by inserting line breaks");
      var scrollTop = aElement.scrollTop;
      synthesizeKey("VK_UP", { });
      synthesizeKey("VK_UP", { });
      synthesizeKey("VK_UP", { });
      synthesizeKey("VK_UP", { });
      synthesizeKey("VK_UP", { });
      hitEventLoop(function () {
        isnot(aElement.scrollTop, scrollTop,
              aElementDescription + " was not scrolled by up key events");
        synthesizeKey("VK_DOWN", { });
        synthesizeKey("VK_DOWN", { });
        synthesizeKey("VK_DOWN", { });
        synthesizeKey("VK_DOWN", { });
        synthesizeKey("VK_DOWN", { });
        hitEventLoop(function () {
          is(aElement.scrollTop, scrollTop,
             aElementDescription + " was not scrolled by down key events");
          var longWord = "aaaaaaaaaaaaaaaaaaaa";
          sendString(longWord);
          hitEventLoop(function () {
            isnot(aElement.scrollLeft, 0,
                  aElementDescription + " was not scrolled by typing long word");
            var scrollLeft = aElement.scrollLeft;
            var i;
            for (i = 0; i < longWord.length; i++) {
              synthesizeKey("VK_LEFT", { });
            }
            hitEventLoop(function () {
              isnot(aElement.scrollLeft, scrollLeft,
                    aElementDescription + " was not scrolled by left key events");
              for (i = 0; i < longWord.length; i++) {
                synthesizeKey("VK_RIGHT", { });
              }
              hitEventLoop(function () {
                is(aElement.scrollLeft, scrollLeft,
                   aElementDescription + " was not scrolled by right key events");
                aCallback();
              }, 20);
            }, 20);
          }, 20);
        }, 20);
      }, 20);
    }, 20);
  }, 20);
}

function doCompositionTest(aElement, aElementDescription, aCallback)
{
  aElement.focus();
  aElement.scrollTop = 0;
  hitEventLoop(function () {
    is(aElement.scrollTop, 0,
       aElementDescription + "'s scrollTop isn't 0");
    var str = "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: str,
          clauses: [
            { length: str.length, attr: COMPOSITION_ATTR_RAW_CLAUSE }
          ]
        },
        caret: { start: str.length, length: 0 }
      });
    hitEventLoop(function () {
      isnot(aElement.scrollTop, 0,
            aElementDescription + " was not scrolled by composition");
      synthesizeComposition({ type: "compositioncommit", data: "" });
      hitEventLoop(function () {
        is(aElement.scrollTop, 0,
           aElementDescription + " was not scrolled back to the top by canceling composition");
        aCallback();
      }, 20);
    }, 20);
  }, 20);
}

function runTests()
{
  doKeyEventTest(textarea, "textarea",
    function () {
      textarea.value = "";
      doKeyEventTest(div, "div (contenteditable)",
        function () {
          div.innerHTML = "";
          doCompositionTest(textarea, "textarea",
            function () {
              doCompositionTest(div, "div (contenteditable)",
                function () {
                  SimpleTest.finish();
                });
            });
        });
    });
}

</script>
</body>

</html>