Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(54)

Side by Side Diff: chrome/test/data/chromeos/virtual_keyboard/inputview/test_base.js

Issue 259603002: Add touch and basic longpress typing tests for the IME keyboard. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright 2014 The Chromium Authors. All rights reserved. 2 * Copyright 2014 The Chromium Authors. All rights reserved.
3 * Use of this source code is governed by a BSD-style license that can be 3 * Use of this source code is governed by a BSD-style license that can be
4 * found in the LICENSE file. 4 * found in the LICENSE file.
5 */ 5 */
6 6
7 var mockController; 7 var mockController;
8 var mockTimer; 8 var mockTimer;
9 var setComposition; 9 var setComposition;
10 10
11 var DEFAULT_CONTEXT_ID = 0; 11 var DEFAULT_CONTEXT_ID = 0;
12 var LONGPRESS_DELAY = 1100;
13
14 /**
15 * Key alignments.
16 * @enum {string}
17 */
18 var Alignment = {
19 LEFT: 'left',
20 RIGHT: 'right',
21 CENTER: 'center'
22 };
12 23
13 /** 24 /**
14 * Create mocks for the virtualKeyboardPrivate API. Any tests that trigger API 25 * Create mocks for the virtualKeyboardPrivate API. Any tests that trigger API
15 * calls must set expectations for call signatures. 26 * calls must set expectations for call signatures.
16 */ 27 */
17 function setUp() { 28 function setUp() {
18 mockController = new MockController(); 29 mockController = new MockController();
19 mockTimer = new MockTimer(); 30 mockTimer = new MockTimer();
20 31
21 mockTimer.install(); 32 mockTimer.install();
22 mockController.createFunctionMock(chrome.input.ime, 'setComposition');
23 mockController.createFunctionMock(chrome.input.ime, 'commitText'); 33 mockController.createFunctionMock(chrome.input.ime, 'commitText');
24 34
25 var validateCommit = function(index, expected, observed) { 35 var validateCommit = function(index, expected, observed) {
26 // Only consider the first argument, the details object. 36 // Only consider the first argument, the details object.
27 var expectedEvent = expected[0]; 37 var expectedEvent = expected[0];
28 var observedEvent = observed[0]; 38 var observedEvent = observed[0];
29 assertEquals(expectedEvent.text, 39 assertEquals(expectedEvent.text,
30 observedEvent.text, 40 observedEvent.text,
31 'Mismatched commit text.'); 41 'Mismatched commit text.');
32 }; 42 };
(...skipping 15 matching lines...) Expand all
48 mockTimer.uninstall(); 58 mockTimer.uninstall();
49 chrome.input.ime.setComposition = setComposition; 59 chrome.input.ime.setComposition = setComposition;
50 } 60 }
51 61
52 /** 62 /**
53 * Retrieves the key from the current keyset. 63 * Retrieves the key from the current keyset.
54 * @param {String} char The character of the key. 64 * @param {String} char The character of the key.
55 * @return {Object} The key. 65 * @return {Object} The key.
56 */ 66 */
57 function getKey(char) { 67 function getKey(char) {
58 return document.querySelector('#Key' + char.toUpperCase()) 68 var key = document.querySelector('#Key' + char.toUpperCase())
69 assertTrue(!!key, "Cannot find key: " + char);
70 return key;
59 } 71 }
60 72
61 /** 73 /**
74 * Retrieves the shift key from the current keyset.
75 * @param {Alignment} align The alignment of the shift key.
76 * @return {Object} The key.
77 */
bshe 2014/04/24 18:36:25 Assume this will be used when add upper case tests
rsadam 2014/04/24 21:23:25 Done.
78 function getShiftKey(align) {
79 var id;
80 switch(align) {
81 case Alignment.LEFT:
82 id = 'ShiftLeft';
83 break;
84 case Alignment.RIGHT:
85 id = 'ShiftRight';
86 break;
87 default:
88 break;
89 }
90 assertTrue(!!id, "Invalid shift alignment option: " + align);
91 var shift = document.querySelector('#' + id);
92 assertTrue(!!shift, "Cannot find shift key with alignment: " + align);
93 return shift;
94 }
95
96 /**
62 * Generates a mouse event and dispatches it on the target. 97 * Generates a mouse event and dispatches it on the target.
63 * @param target {Object} The target of the event. 98 * @param target {Object} The target of the event.
64 * @param type {String} The type of the mouse event. 99 * @param type {String} The type of the mouse event.
65 */ 100 */
66 function generateMouseEvent(target, type) { 101 function generateMouseEvent(target, type) {
67 var e = document.createEvent('MouseEvents'); 102 var e = document.createEvent('MouseEvents');
68 e.initEvent.apply(e, Array.prototype.slice.call(arguments, 1)); 103 e.initEvent.apply(e, Array.prototype.slice.call(arguments, 1));
69 target.dispatchEvent(e); 104 target.dispatchEvent(e);
70 } 105 }
71 106
72 /** 107 /**
73 * Mocks a character type using the mouse. 108 * Mocks a character type using the mouse.
74 * @param {String} char The character to type. 109 * @param {String} char The character to type.
75 */ 110 */
76 function mockMouseType(char) { 111 function mockMouseType(char) {
77 var send = chrome.input.ime.commitText; 112 var send = chrome.input.ime.commitText;
78 send.addExpectation({ 113 send.addExpectation({
79 contextId: DEFAULT_CONTEXT_ID, 114 contextId: DEFAULT_CONTEXT_ID,
80 text: char, 115 text: char,
81 }); 116 });
82 var key = getKey(char); 117 var key = getKey(char);
83 if (!key) {
84 console.error("Cannot find key: " + char);
85 return;
86 }
87 generateMouseEvent(key, 'mouseover', true, true); 118 generateMouseEvent(key, 'mouseover', true, true);
88 generateMouseEvent(key, 'mousedown', true, true); 119 generateMouseEvent(key, 'mousedown', true, true);
89 generateMouseEvent(key, 'mouseup', true, true); 120 generateMouseEvent(key, 'mouseup', true, true);
90 generateMouseEvent(key, 'click', true, true); 121 generateMouseEvent(key, 'click', true, true);
91 generateMouseEvent(key, 'mouseover', true, true); 122 generateMouseEvent(key, 'mouseover', true, true);
92 generateMouseEvent(key, 'mouseout', true, true); 123 generateMouseEvent(key, 'mouseout', true, true);
93 } 124 }
125
126 /**
127 * Generates a touch event and dispatches it on the target.
128 * @param target {Object} The target of the event.
129 * @param type {String} The type of the touch event.
130 */
131 function generateTouchEvent(target, type) {
132 var e = document.createEvent('UIEvents');
133 e.initEvent.apply(e, Array.prototype.slice.call(arguments, 1));
134 target.dispatchEvent(e);
135 }
136
137 /**
138 * Mocks a character type using touch.
139 * @param {String} char The character to type.
140 */
141 function mockTouchType(char) {
142 var send = chrome.input.ime.commitText;
143 send.addExpectation({
144 contextId: DEFAULT_CONTEXT_ID,
145 text: char,
146 });
147 var key = getKey(char);
148 generateTouchEvent(key, 'touchstart', true, true);
149 generateTouchEvent(key, 'touchend', true, true);
150 }
151
152 /**
153 * Checks whether the element is currently being displayed on screen.
154 * @param {Object} The object to check.
bshe 2014/04/24 18:36:25 nit: document return value
rsadam 2014/04/24 21:23:25 Done.
155 */
156 function isActive(element) {
157 return getComputedStyle(element).display != "none";
158 }
159
160 /**
161 * Returns, if present, the active alternate key container.
162 * @return {?Object}
163 */
164 function getActiveAltContainer() {
165 // TODO(rsadam): Simplify once code refactor to remove unneeded containers is
166 // complete.
167 var all = document.querySelectorAll('.inputview-altdata-view');
168 var hit;
169 for (var i = 0; i < all.length; i++) {
170 if (isActive(all[i])) {
171 assertFalse(!!hit, "More than one alt key container is active.");
172 hit = all[i];
173 }
174 }
175 return hit;
176 }
177
178 /**
179 * Mocks a character long press.
180 * @param {String} char The character to longpress.
181 * @param {Array<String>} altKeys The expected alt keys.
182 * @param {String} selection The alt key to select.
183 */
184 function mockLongpress(char, altKeys, selection) {
185 var key = getKey(char);
186 generateTouchEvent(key, 'touchstart', true, true);
187 mockTimer.tick(LONGPRESS_DELAY);
188
189 var container = getActiveAltContainer();
190 assertTrue(!!container, "Cannot find active alt container.");
191 var options = container.querySelectorAll('.inputview-altdata-key');
192 assertEquals(altKeys.length, options.length,
193 "Unexpected number of alt keys.");
194
195 var candidate;
196 // Check all altKeys present and in order specified.
197 for (var i = 0; i < altKeys.length; i++) {
198 assertEquals(altKeys[i],options[i].innerHTML);
199 if (options[i].innerHTML == selection)
200 candidate = options[i];
201 }
202 // Check that selection key found.
203 assertTrue(!!candidate, "Could not find alt key to select: " + candidate);
204 // Expect selection to be typed
205 var send = chrome.input.ime.commitText;
206 send.addExpectation({
207 contextId: DEFAULT_CONTEXT_ID,
208 text: selection,
209 });
210 // TODO(rsadam:) Add support for touch move here once latest CRX uploaded to
rsadam 2014/04/24 17:45:04 The current CRX uses the delta in screen position
211 // chrome/test/data.
212 generateTouchEvent(key, 'touchend', true, true)
bshe 2014/04/24 18:36:25 should the touchend dispatched by candidate?
rsadam 2014/04/24 21:23:25 I believe the W3 spec is for the target to be same
213 container = getActiveAltContainer();
214 assertFalse(!!container, "Alt key container was not hidden.");
215 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698