blob: 6e55f3e9ad94d478bbde5959cfe34dbd9331a50d [file] [log] [blame]
[email protected]4d6be6c2010-04-27 04:31:041// Copyright (c) 2010 The Chromium Authors. All rights reserved.
[email protected]21abcc742009-10-23 02:52:062// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "build/build_config.h"
6
[email protected]7f05552482010-09-03 00:38:277#include "app/keyboard_codes.h"
[email protected]21abcc742009-10-23 02:52:068#include "base/basictypes.h"
[email protected]21abcc742009-10-23 02:52:069#include "base/logging.h"
10#include "base/message_loop.h"
11#include "base/string_util.h"
12#include "base/utf_string_conversions.h"
13#include "base/values.h"
[email protected]21abcc742009-10-23 02:52:0614#include "chrome/browser/browser.h"
[email protected]21abcc742009-10-23 02:52:0615#include "chrome/browser/dom_operation_notification_details.h"
16#include "chrome/browser/renderer_host/render_view_host.h"
17#include "chrome/browser/renderer_host/render_widget_host_view.h"
18#include "chrome/browser/tab_contents/tab_contents.h"
19#include "chrome/browser/tab_contents/tab_contents_view.h"
20#include "chrome/common/chrome_paths.h"
21#include "chrome/common/notification_registrar.h"
22#include "chrome/common/notification_service.h"
23#include "chrome/test/in_process_browser_test.h"
24#include "chrome/test/ui_test_utils.h"
[email protected]3985ba82010-07-29 21:44:1225#include "net/test/test_server.h"
[email protected]21abcc742009-10-23 02:52:0626
27namespace {
28
[email protected]f72a1cc2010-04-30 07:17:3029const char kTestingPage[] = "files/keyevents_test.html";
[email protected]21abcc742009-10-23 02:52:0630const wchar_t kSuppressEventJS[] =
31 L"window.domAutomationController.send(setDefaultAction('%ls', %ls));";
32const wchar_t kGetResultJS[] =
33 L"window.domAutomationController.send(keyEventResult[%d]);";
34const wchar_t kGetResultLengthJS[] =
35 L"window.domAutomationController.send(keyEventResult.length);";
36const wchar_t kGetFocusedElementJS[] =
37 L"window.domAutomationController.send(focusedElement);";
38const wchar_t kSetFocusedElementJS[] =
39 L"window.domAutomationController.send(setFocusedElement('%ls'));";
40const wchar_t kGetTextBoxValueJS[] =
41 L"window.domAutomationController.send("
42 L"document.getElementById('%ls').value);";
[email protected]853300a82010-07-27 21:17:5743const wchar_t kSetTextBoxValueJS[] =
44 L"window.domAutomationController.send("
45 L"document.getElementById('%ls').value = '%ls');";
[email protected]21abcc742009-10-23 02:52:0646const wchar_t kStartTestJS[] =
[email protected]853300a82010-07-27 21:17:5747 L"window.domAutomationController.send(startTest(%d));";
[email protected]21abcc742009-10-23 02:52:0648
49// Maximum lenght of the result array in KeyEventTestData structure.
50const size_t kMaxResultLength = 10;
51
52// A structure holding test data of a keyboard event.
53// Each keyboard event may generate multiple result strings representing
54// the result of keydown, keypress, keyup and textInput events.
55// For keydown, keypress and keyup events, the format of the result string is:
[email protected]853300a82010-07-27 21:17:5756// <type> <keyCode> <charCode> <ctrlKey> <shiftKey> <altKey> <commandKey>
[email protected]21abcc742009-10-23 02:52:0657// where <type> may be 'D' (keydown), 'P' (keypress) or 'U' (keyup).
[email protected]853300a82010-07-27 21:17:5758// <ctrlKey>, <shiftKey> <altKey> and <commandKey> are boolean value indicating
59// the state of corresponding modifier key.
[email protected]21abcc742009-10-23 02:52:0660// For textInput event, the format is: T <text>, where <text> is the text to be
61// input.
62// Please refer to chrome/test/data/keyevents_test.html for details.
63struct KeyEventTestData {
[email protected]7f05552482010-09-03 00:38:2764 app::KeyboardCode key;
[email protected]21abcc742009-10-23 02:52:0665 bool ctrl;
66 bool shift;
67 bool alt;
[email protected]853300a82010-07-27 21:17:5768 bool command;
[email protected]21abcc742009-10-23 02:52:0669
70 bool suppress_keydown;
71 bool suppress_keypress;
72 bool suppress_keyup;
73 bool suppress_textinput;
74
75 int result_length;
76 const char* const result[kMaxResultLength];
77};
78
79const wchar_t* GetBoolString(bool value) {
80 return value ? L"true" : L"false";
81}
82
83// A class to help wait for the finish of a key event test.
84class TestFinishObserver : public NotificationObserver {
85 public:
86 explicit TestFinishObserver(RenderViewHost* render_view_host)
87 : finished_(false), waiting_(false) {
88 registrar_.Add(this, NotificationType::DOM_OPERATION_RESPONSE,
89 Source<RenderViewHost>(render_view_host));
90 }
91
92 bool WaitForFinish() {
93 if (!finished_) {
94 waiting_ = true;
95 ui_test_utils::RunMessageLoop();
96 waiting_ = false;
97 }
98 return finished_;
99 }
100
101 virtual void Observe(NotificationType type,
102 const NotificationSource& source,
103 const NotificationDetails& details) {
104 DCHECK(type == NotificationType::DOM_OPERATION_RESPONSE);
105 Details<DomOperationNotificationDetails> dom_op_details(details);
106 // We might receive responses for other script execution, but we only
107 // care about the test finished message.
108 if (dom_op_details->json() == "\"FINISHED\"") {
109 finished_ = true;
110 if (waiting_)
111 MessageLoopForUI::current()->Quit();
112 }
113 }
114
115 private:
116 bool finished_;
117 bool waiting_;
118 NotificationRegistrar registrar_;
119
120 DISALLOW_COPY_AND_ASSIGN(TestFinishObserver);
121};
122
123class BrowserKeyEventsTest : public InProcessBrowserTest {
124 public:
125 BrowserKeyEventsTest() {
126 set_show_window(true);
127 EnableDOMAutomation();
128 }
129
[email protected]21abcc742009-10-23 02:52:06130 bool IsViewFocused(ViewID vid) {
131 return ui_test_utils::IsViewFocused(browser(), vid);
132 }
133
134 void ClickOnView(ViewID vid) {
135 ui_test_utils::ClickOnView(browser(), vid);
136 }
137
138 // Set the suppress flag of an event specified by |type|. If |suppress| is
139 // true then the web page will suppress all events with |type|. Following
140 // event types are supported: keydown, keypress, keyup and textInput.
141 void SuppressEventByType(int tab_index, const wchar_t* type, bool suppress) {
142 ASSERT_LT(tab_index, browser()->tab_count());
143 bool actual;
144 ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool(
145 browser()->GetTabContentsAt(tab_index)->render_view_host(),
146 L"",
147 StringPrintf(kSuppressEventJS, type, GetBoolString(!suppress)),
148 &actual));
149 ASSERT_EQ(!suppress, actual);
150 }
151
152 void SuppressEvents(int tab_index, bool keydown, bool keypress,
153 bool keyup, bool textinput) {
154 ASSERT_NO_FATAL_FAILURE(
155 SuppressEventByType(tab_index, L"keydown", keydown));
156 ASSERT_NO_FATAL_FAILURE(
157 SuppressEventByType(tab_index, L"keypress", keypress));
158 ASSERT_NO_FATAL_FAILURE(
159 SuppressEventByType(tab_index, L"keyup", keyup));
160 ASSERT_NO_FATAL_FAILURE(
161 SuppressEventByType(tab_index, L"textInput", textinput));
162 }
163
164 void SuppressAllEvents(int tab_index, bool suppress) {
165 SuppressEvents(tab_index, suppress, suppress, suppress, suppress);
166 }
167
168 void GetResultLength(int tab_index, int* length) {
169 ASSERT_LT(tab_index, browser()->tab_count());
170 ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractInt(
171 browser()->GetTabContentsAt(tab_index)->render_view_host(),
172 L"", kGetResultLengthJS, length));
173 }
174
175 void CheckResult(int tab_index, int length, const char* const result[]) {
176 ASSERT_LT(tab_index, browser()->tab_count());
177 int actual_length;
178 ASSERT_NO_FATAL_FAILURE(GetResultLength(tab_index, &actual_length));
179 ASSERT_GE(actual_length, length);
180 for (int i = 0; i < actual_length; ++i) {
181 std::string actual;
182 ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractString(
183 browser()->GetTabContentsAt(tab_index)->render_view_host(),
184 L"", StringPrintf(kGetResultJS, i), &actual));
185
186 // If more events were received than expected, then the additional events
187 // must be keyup events.
188 if (i < length)
189 ASSERT_STREQ(result[i], actual.c_str());
190 else
191 ASSERT_EQ('U', actual[0]);
192 }
193 }
194
195 void CheckFocusedElement(int tab_index, const wchar_t* focused) {
196 ASSERT_LT(tab_index, browser()->tab_count());
197 std::string actual;
198 ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractString(
199 browser()->GetTabContentsAt(tab_index)->render_view_host(),
200 L"", kGetFocusedElementJS, &actual));
201 ASSERT_EQ(WideToUTF8(focused), actual);
202 }
203
204 void SetFocusedElement(int tab_index, const wchar_t* focused) {
205 ASSERT_LT(tab_index, browser()->tab_count());
206 bool actual;
207 ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool(
208 browser()->GetTabContentsAt(tab_index)->render_view_host(),
209 L"",
210 StringPrintf(kSetFocusedElementJS, focused),
211 &actual));
212 ASSERT_TRUE(actual);
213 }
214
215 void CheckTextBoxValue(int tab_index, const wchar_t* id,
216 const wchar_t* value) {
217 ASSERT_LT(tab_index, browser()->tab_count());
218 std::string actual;
219 ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractString(
220 browser()->GetTabContentsAt(tab_index)->render_view_host(),
221 L"",
222 StringPrintf(kGetTextBoxValueJS, id),
223 &actual));
224 ASSERT_EQ(WideToUTF8(value), actual);
225 }
226
[email protected]853300a82010-07-27 21:17:57227 void SetTextBoxValue(int tab_index, const wchar_t* id,
228 const wchar_t* value) {
229 ASSERT_LT(tab_index, browser()->tab_count());
230 std::string actual;
231 ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractString(
232 browser()->GetTabContentsAt(tab_index)->render_view_host(),
233 L"",
234 StringPrintf(kSetTextBoxValueJS, id, value),
235 &actual));
236 ASSERT_EQ(WideToUTF8(value), actual);
237 }
238
239 void StartTest(int tab_index, int result_length) {
[email protected]21abcc742009-10-23 02:52:06240 ASSERT_LT(tab_index, browser()->tab_count());
241 bool actual;
242 ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool(
243 browser()->GetTabContentsAt(tab_index)->render_view_host(),
[email protected]853300a82010-07-27 21:17:57244 L"", StringPrintf(kStartTestJS, result_length), &actual));
[email protected]21abcc742009-10-23 02:52:06245 ASSERT_TRUE(actual);
246 }
247
248 void TestKeyEvent(int tab_index, const KeyEventTestData& test) {
249 ASSERT_LT(tab_index, browser()->tab_count());
250 ASSERT_EQ(tab_index, browser()->selected_index());
251
252 // Inform our testing web page that we are about to start testing a key
253 // event.
[email protected]853300a82010-07-27 21:17:57254 ASSERT_NO_FATAL_FAILURE(StartTest(tab_index, test.result_length));
[email protected]21abcc742009-10-23 02:52:06255 ASSERT_NO_FATAL_FAILURE(SuppressEvents(
256 tab_index, test.suppress_keydown, test.suppress_keypress,
257 test.suppress_keyup, test.suppress_textinput));
258
259 // We need to create a finish observer before sending the key event,
260 // because the test finished message might be arrived before returning
[email protected]a6e602f2010-09-28 22:28:30261 // from the SendKeyPressSync() method.
[email protected]21abcc742009-10-23 02:52:06262 TestFinishObserver finish_observer(
263 browser()->GetTabContentsAt(tab_index)->render_view_host());
264
[email protected]a6e602f2010-09-28 22:28:30265 ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
266 browser(), test.key, test.ctrl, test.shift, test.alt, test.command));
[email protected]21abcc742009-10-23 02:52:06267 ASSERT_TRUE(finish_observer.WaitForFinish());
268 ASSERT_NO_FATAL_FAILURE(CheckResult(
269 tab_index, test.result_length, test.result));
270 }
271
272 std::string GetTestDataDescription(const KeyEventTestData& data) {
273 std::string desc = StringPrintf(
[email protected]853300a82010-07-27 21:17:57274 " VKEY:0x%02x, ctrl:%d, shift:%d, alt:%d, command:%d\n"
[email protected]21abcc742009-10-23 02:52:06275 " Suppress: keydown:%d, keypress:%d, keyup:%d, textInput:%d\n"
276 " Expected results(%d):\n",
[email protected]853300a82010-07-27 21:17:57277 data.key, data.ctrl, data.shift, data.alt, data.command,
[email protected]21abcc742009-10-23 02:52:06278 data.suppress_keydown, data.suppress_keypress, data.suppress_keyup,
279 data.suppress_textinput, data.result_length);
280 for (int i = 0; i < data.result_length; ++i) {
281 desc.append(" ");
282 desc.append(data.result[i]);
283 desc.append("\n");
284 }
285 return desc;
286 }
287};
288
[email protected]853300a82010-07-27 21:17:57289IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, NormalKeyEvents) {
[email protected]21abcc742009-10-23 02:52:06290 static const KeyEventTestData kTestNoInput[] = {
291 // a
[email protected]7f05552482010-09-03 00:38:27292 { app::VKEY_A, false, false, false, false,
[email protected]21abcc742009-10-23 02:52:06293 false, false, false, false, 3,
[email protected]853300a82010-07-27 21:17:57294 { "D 65 0 false false false false",
295 "P 97 97 false false false false",
296 "U 65 0 false false false false" } },
[email protected]21abcc742009-10-23 02:52:06297 // shift-a
[email protected]7f05552482010-09-03 00:38:27298 { app::VKEY_A, false, true, false, false,
[email protected]21abcc742009-10-23 02:52:06299 false, false, false, false, 5,
[email protected]853300a82010-07-27 21:17:57300 { "D 16 0 false true false false",
301 "D 65 0 false true false false",
302 "P 65 65 false true false false",
303 "U 65 0 false true false false",
304 "U 16 0 false true false false" } },
[email protected]21abcc742009-10-23 02:52:06305 // a, suppress keydown
[email protected]7f05552482010-09-03 00:38:27306 { app::VKEY_A, false, false, false, false,
[email protected]21abcc742009-10-23 02:52:06307 true, false, false, false, 2,
[email protected]853300a82010-07-27 21:17:57308 { "D 65 0 false false false false",
309 "U 65 0 false false false false" } },
[email protected]21abcc742009-10-23 02:52:06310 };
311
312 static const KeyEventTestData kTestWithInput[] = {
313 // a
[email protected]7f05552482010-09-03 00:38:27314 { app::VKEY_A, false, false, false, false,
[email protected]21abcc742009-10-23 02:52:06315 false, false, false, false, 4,
[email protected]853300a82010-07-27 21:17:57316 { "D 65 0 false false false false",
317 "P 97 97 false false false false",
[email protected]21abcc742009-10-23 02:52:06318 "T a",
[email protected]853300a82010-07-27 21:17:57319 "U 65 0 false false false false" } },
[email protected]21abcc742009-10-23 02:52:06320 // shift-a
[email protected]7f05552482010-09-03 00:38:27321 { app::VKEY_A, false, true, false, false,
[email protected]21abcc742009-10-23 02:52:06322 false, false, false, false, 6,
[email protected]853300a82010-07-27 21:17:57323 { "D 16 0 false true false false",
324 "D 65 0 false true false false",
325 "P 65 65 false true false false",
[email protected]21abcc742009-10-23 02:52:06326 "T A",
[email protected]853300a82010-07-27 21:17:57327 "U 65 0 false true false false",
328 "U 16 0 false true false false" } },
[email protected]21abcc742009-10-23 02:52:06329 // a, suppress keydown
[email protected]7f05552482010-09-03 00:38:27330 { app::VKEY_A, false, false, false, false,
[email protected]21abcc742009-10-23 02:52:06331 true, false, false, false, 2,
[email protected]853300a82010-07-27 21:17:57332 { "D 65 0 false false false false",
333 "U 65 0 false false false false" } },
[email protected]21abcc742009-10-23 02:52:06334 // a, suppress keypress
[email protected]7f05552482010-09-03 00:38:27335 { app::VKEY_A, false, false, false, false,
[email protected]21abcc742009-10-23 02:52:06336 false, true, false, false, 3,
[email protected]853300a82010-07-27 21:17:57337 { "D 65 0 false false false false",
338 "P 97 97 false false false false",
339 "U 65 0 false false false false" } },
[email protected]21abcc742009-10-23 02:52:06340 // a, suppress textInput
[email protected]7f05552482010-09-03 00:38:27341 { app::VKEY_A, false, false, false, false,
[email protected]21abcc742009-10-23 02:52:06342 false, false, false, true, 4,
[email protected]853300a82010-07-27 21:17:57343 { "D 65 0 false false false false",
344 "P 97 97 false false false false",
[email protected]21abcc742009-10-23 02:52:06345 "T a",
[email protected]853300a82010-07-27 21:17:57346 "U 65 0 false false false false" } },
[email protected]21abcc742009-10-23 02:52:06347 };
348
[email protected]95409e12010-08-17 20:07:11349 ASSERT_TRUE(test_server()->Start());
[email protected]21abcc742009-10-23 02:52:06350
[email protected]a6e602f2010-09-28 22:28:30351 ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
[email protected]95409e12010-08-17 20:07:11352 GURL url = test_server()->GetURL(kTestingPage);
[email protected]21abcc742009-10-23 02:52:06353 ui_test_utils::NavigateToURL(browser(), url);
354
355 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
356 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
357
358 int tab_index = browser()->selected_index();
359 for (size_t i = 0; i < arraysize(kTestNoInput); ++i) {
360 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestNoInput[i]))
361 << "kTestNoInput[" << i << "] failed:\n"
362 << GetTestDataDescription(kTestNoInput[i]);
363 }
364
[email protected]853300a82010-07-27 21:17:57365 // Input in normal text box.
[email protected]21abcc742009-10-23 02:52:06366 ASSERT_NO_FATAL_FAILURE(SetFocusedElement(tab_index, L"A"));
367 for (size_t i = 0; i < arraysize(kTestWithInput); ++i) {
368 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestWithInput[i]))
[email protected]853300a82010-07-27 21:17:57369 << "kTestWithInput[" << i << "] in text box failed:\n"
[email protected]21abcc742009-10-23 02:52:06370 << GetTestDataDescription(kTestWithInput[i]);
371 }
[email protected]21abcc742009-10-23 02:52:06372 EXPECT_NO_FATAL_FAILURE(CheckTextBoxValue(tab_index, L"A", L"aA"));
[email protected]853300a82010-07-27 21:17:57373
374 // Input in password box.
375 ASSERT_NO_FATAL_FAILURE(SetFocusedElement(tab_index, L"B"));
376 for (size_t i = 0; i < arraysize(kTestWithInput); ++i) {
377 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestWithInput[i]))
378 << "kTestWithInput[" << i << "] in password box failed:\n"
379 << GetTestDataDescription(kTestWithInput[i]);
380 }
381 EXPECT_NO_FATAL_FAILURE(CheckTextBoxValue(tab_index, L"B", L"aA"));
[email protected]21abcc742009-10-23 02:52:06382}
383
[email protected]853300a82010-07-27 21:17:57384#if defined(OS_WIN) || defined(OS_LINUX)
[email protected]21abcc742009-10-23 02:52:06385IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, CtrlKeyEvents) {
386 static const KeyEventTestData kTestCtrlF = {
[email protected]7f05552482010-09-03 00:38:27387 app::VKEY_F, true, false, false, false,
[email protected]21abcc742009-10-23 02:52:06388 false, false, false, false, 2,
[email protected]853300a82010-07-27 21:17:57389 { "D 17 0 true false false false",
390 "D 70 0 true false false false" }
[email protected]21abcc742009-10-23 02:52:06391 };
392
393 static const KeyEventTestData kTestCtrlFSuppressKeyDown = {
[email protected]7f05552482010-09-03 00:38:27394 app::VKEY_F, true, false, false, false,
[email protected]21abcc742009-10-23 02:52:06395 true, false, false, false, 4,
[email protected]853300a82010-07-27 21:17:57396 { "D 17 0 true false false false",
397 "D 70 0 true false false false",
398 "U 70 0 true false false false",
399 "U 17 0 true false false false" }
[email protected]21abcc742009-10-23 02:52:06400 };
401
402 // Ctrl+Z doesn't bind to any accelerators, which then should generate a
403 // keypress event with charCode=26.
404 static const KeyEventTestData kTestCtrlZ = {
[email protected]7f05552482010-09-03 00:38:27405 app::VKEY_Z, true, false, false, false,
[email protected]21abcc742009-10-23 02:52:06406 false, false, false, false, 5,
[email protected]853300a82010-07-27 21:17:57407 { "D 17 0 true false false false",
408 "D 90 0 true false false false",
409 "P 26 26 true false false false",
410 "U 90 0 true false false false",
411 "U 17 0 true false false false" }
[email protected]21abcc742009-10-23 02:52:06412 };
413
414 static const KeyEventTestData kTestCtrlZSuppressKeyDown = {
[email protected]7f05552482010-09-03 00:38:27415 app::VKEY_Z, true, false, false, false,
[email protected]21abcc742009-10-23 02:52:06416 true, false, false, false, 4,
[email protected]853300a82010-07-27 21:17:57417 { "D 17 0 true false false false",
418 "D 90 0 true false false false",
419 "U 90 0 true false false false",
420 "U 17 0 true false false false" }
[email protected]21abcc742009-10-23 02:52:06421 };
422
423 // Ctrl+Enter shall generate a keypress event with charCode=10 (LF).
424 static const KeyEventTestData kTestCtrlEnter = {
[email protected]7f05552482010-09-03 00:38:27425 app::VKEY_RETURN, true, false, false, false,
[email protected]21abcc742009-10-23 02:52:06426 false, false, false, false, 5,
[email protected]853300a82010-07-27 21:17:57427 { "D 17 0 true false false false",
428 "D 13 0 true false false false",
429 "P 10 10 true false false false",
430 "U 13 0 true false false false",
431 "U 17 0 true false false false" }
[email protected]21abcc742009-10-23 02:52:06432 };
433
[email protected]95409e12010-08-17 20:07:11434 ASSERT_TRUE(test_server()->Start());
[email protected]21abcc742009-10-23 02:52:06435
[email protected]a6e602f2010-09-28 22:28:30436 ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
[email protected]95409e12010-08-17 20:07:11437 GURL url = test_server()->GetURL(kTestingPage);
[email protected]21abcc742009-10-23 02:52:06438 ui_test_utils::NavigateToURL(browser(), url);
439
440 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
441 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
442
443 int tab_index = browser()->selected_index();
444 // Press Ctrl+F, which will make the Find box open and request focus.
445 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlF));
446 EXPECT_TRUE(IsViewFocused(VIEW_ID_FIND_IN_PAGE_TEXT_FIELD));
447
448 // Press Escape to close the Find box and move the focus back to the web page.
[email protected]a6e602f2010-09-28 22:28:30449 ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
450 browser(), app::VKEY_ESCAPE, false, false, false, false));
[email protected]21abcc742009-10-23 02:52:06451 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
452
453 // Press Ctrl+F with keydown suppressed shall not open the find box.
454 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlFSuppressKeyDown));
455 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
456
457 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlZ));
458 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlZSuppressKeyDown));
459 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlEnter));
460}
[email protected]853300a82010-07-27 21:17:57461#elif defined(OS_MACOSX)
462IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, CommandKeyEvents) {
463 static const KeyEventTestData kTestCmdF = {
[email protected]7f05552482010-09-03 00:38:27464 app::VKEY_F, false, false, false, true,
[email protected]853300a82010-07-27 21:17:57465 false, false, false, false, 2,
466 { "D 91 0 false false false true",
467 "D 70 0 false false false true" }
468 };
469
470 // On Mac we don't send key up events when command modifier is down.
471 static const KeyEventTestData kTestCmdFSuppressKeyDown = {
[email protected]7f05552482010-09-03 00:38:27472 app::VKEY_F, false, false, false, true,
[email protected]853300a82010-07-27 21:17:57473 true, false, false, false, 3,
474 { "D 91 0 false false false true",
475 "D 70 0 false false false true",
476 "U 91 0 false false false true" }
477 };
478
[email protected]95409e12010-08-17 20:07:11479 ASSERT_TRUE(test_server()->Start());
[email protected]853300a82010-07-27 21:17:57480
[email protected]a6e602f2010-09-28 22:28:30481 ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
[email protected]95409e12010-08-17 20:07:11482 GURL url = test_server()->GetURL(kTestingPage);
[email protected]853300a82010-07-27 21:17:57483 ui_test_utils::NavigateToURL(browser(), url);
484
485 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
486 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
487
488 int tab_index = browser()->selected_index();
489 // Press Cmd+F, which will make the Find box open and request focus.
490 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCmdF));
491 EXPECT_TRUE(IsViewFocused(VIEW_ID_FIND_IN_PAGE_TEXT_FIELD));
492
493 // Press Escape to close the Find box and move the focus back to the web page.
[email protected]a6e602f2010-09-28 22:28:30494 ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
495 browser(), app::VKEY_ESCAPE, false, false, false, false));
[email protected]853300a82010-07-27 21:17:57496 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
497
498 // Press Cmd+F with keydown suppressed shall not open the find box.
499 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCmdFSuppressKeyDown));
500 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
501}
502#endif
[email protected]21abcc742009-10-23 02:52:06503
[email protected]4faa3bf82010-09-15 15:46:24504#if defined(OS_WIN)
505// Tests may fail on windows: http://crbug.com/55713
506#define MAYBE_AccessKeys FLAKY_AccessKeys
507#else
508#define MAYBE_AccessKeys AccessKeys
[email protected]6b3dace2010-09-15 16:07:29509#endif
[email protected]4faa3bf82010-09-15 15:46:24510
511IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, MAYBE_AccessKeys) {
[email protected]853300a82010-07-27 21:17:57512#if defined(OS_MACOSX)
513 // On Mac, access keys use ctrl+alt modifiers.
514 static const KeyEventTestData kTestAccessA = {
[email protected]7f05552482010-09-03 00:38:27515 app::VKEY_A, true, false, true, false,
[email protected]853300a82010-07-27 21:17:57516 false, false, false, false, 6,
517 { "D 17 0 true false false false",
518 "D 18 0 true false true false",
519 "D 65 0 true false true false",
520 "U 65 0 true false true false",
521 "U 18 0 true false true false",
522 "U 17 0 true false false false" }
[email protected]21abcc742009-10-23 02:52:06523 };
524
[email protected]853300a82010-07-27 21:17:57525 static const KeyEventTestData kTestAccessDSuppress = {
[email protected]7f05552482010-09-03 00:38:27526 app::VKEY_D, true, false, true, false,
[email protected]853300a82010-07-27 21:17:57527 true, true, true, false, 6,
528 { "D 17 0 true false false false",
529 "D 18 0 true false true false",
530 "D 68 0 true false true false",
531 "U 68 0 true false true false",
532 "U 18 0 true false true false",
533 "U 17 0 true false false false" }
534 };
535
536 static const KeyEventTestData kTestAccess1 = {
[email protected]7f05552482010-09-03 00:38:27537 app::VKEY_1, true, false, true, false,
[email protected]853300a82010-07-27 21:17:57538 false, false, false, false, 6,
539 { "D 17 0 true false false false",
540 "D 18 0 true false true false",
541 "D 49 0 true false true false",
542 "U 49 0 true false true false",
543 "U 18 0 true false true false",
544 "U 17 0 true false false false" }
545 };
546#else
547 static const KeyEventTestData kTestAccessA = {
[email protected]7f05552482010-09-03 00:38:27548 app::VKEY_A, false, false, true, false,
[email protected]853300a82010-07-27 21:17:57549 false, false, false, false, 4,
550 { "D 18 0 false false true false",
551 "D 65 0 false false true false",
552 "U 65 0 false false true false",
553 "U 18 0 false false true false" }
554 };
555
556 static const KeyEventTestData kTestAccessD = {
[email protected]7f05552482010-09-03 00:38:27557 app::VKEY_D, false, false, true, false,
[email protected]21abcc742009-10-23 02:52:06558 false, false, false, false, 2,
[email protected]853300a82010-07-27 21:17:57559 { "D 18 0 false false true false",
560 "D 68 0 false false true false" }
[email protected]21abcc742009-10-23 02:52:06561 };
562
[email protected]853300a82010-07-27 21:17:57563 static const KeyEventTestData kTestAccessDSuppress = {
[email protected]7f05552482010-09-03 00:38:27564 app::VKEY_D, false, false, true, false,
[email protected]21abcc742009-10-23 02:52:06565 true, true, true, false, 4,
[email protected]853300a82010-07-27 21:17:57566 { "D 18 0 false false true false",
567 "D 68 0 false false true false",
568 "U 68 0 false false true false",
569 "U 18 0 false false true false" }
[email protected]21abcc742009-10-23 02:52:06570 };
571
[email protected]853300a82010-07-27 21:17:57572 static const KeyEventTestData kTestAccess1 = {
[email protected]7f05552482010-09-03 00:38:27573 app::VKEY_1, false, false, true, false,
[email protected]21abcc742009-10-23 02:52:06574 false, false, false, false, 4,
[email protected]853300a82010-07-27 21:17:57575 { "D 18 0 false false true false",
576 "D 49 0 false false true false",
577 "U 49 0 false false true false",
578 "U 18 0 false false true false" }
[email protected]21abcc742009-10-23 02:52:06579 };
[email protected]853300a82010-07-27 21:17:57580#endif
[email protected]21abcc742009-10-23 02:52:06581
[email protected]95409e12010-08-17 20:07:11582 ASSERT_TRUE(test_server()->Start());
[email protected]21abcc742009-10-23 02:52:06583
[email protected]a6e602f2010-09-28 22:28:30584 ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
[email protected]95409e12010-08-17 20:07:11585 GURL url = test_server()->GetURL(kTestingPage);
[email protected]21abcc742009-10-23 02:52:06586 ui_test_utils::NavigateToURL(browser(), url);
587
[email protected]f07d7bf2010-04-06 08:02:42588 ui_test_utils::RunAllPendingInMessageLoop();
[email protected]21abcc742009-10-23 02:52:06589 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
590 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
591
592 int tab_index = browser()->selected_index();
593 // Make sure no element is focused.
594 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L""));
595 // Alt+A should focus the element with accesskey = "A".
[email protected]853300a82010-07-27 21:17:57596 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestAccessA));
[email protected]21abcc742009-10-23 02:52:06597 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L"A"));
598
599 // Blur the focused element.
600 EXPECT_NO_FATAL_FAILURE(SetFocusedElement(tab_index, L""));
601 // Make sure no element is focused.
602 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L""));
[email protected]853300a82010-07-27 21:17:57603
604#if !defined(OS_MACOSX)
[email protected]21abcc742009-10-23 02:52:06605 // Alt+D should move the focus to the location entry.
[email protected]853300a82010-07-27 21:17:57606 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestAccessD));
[email protected]095b55f62010-09-24 08:06:04607
608 // TODO(isherman): This is an experimental change to help diagnose
609 // http://crbug.com/55713
610 ui_test_utils::RunAllPendingInMessageLoop();
611
[email protected]21abcc742009-10-23 02:52:06612 EXPECT_TRUE(IsViewFocused(VIEW_ID_LOCATION_BAR));
613 // No element should be focused, as Alt+D was handled by the browser.
614 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L""));
615
616 // Move the focus back to the web page.
617 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
618 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
619
620 // Make sure no element is focused.
621 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L""));
[email protected]853300a82010-07-27 21:17:57622#endif
623
[email protected]21abcc742009-10-23 02:52:06624 // If the keydown event is suppressed, then Alt+D should be handled as an
625 // accesskey rather than an accelerator key. Activation of an accesskey is not
626 // a part of the default action of the key event, so it should not be
627 // suppressed at all.
[email protected]853300a82010-07-27 21:17:57628 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestAccessDSuppress));
[email protected]21abcc742009-10-23 02:52:06629 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
630 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L"D"));
631
632 // Blur the focused element.
633 EXPECT_NO_FATAL_FAILURE(SetFocusedElement(tab_index, L""));
634 // Make sure no element is focused.
635 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L""));
[email protected]853300a82010-07-27 21:17:57636 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestAccess1));
[email protected]753efc42010-03-09 19:52:16637#if defined(TOOLKIT_GTK)
638 // On GTK, alt-0..9 are assigned as tab selection accelerators, so they can
[email protected]21abcc742009-10-23 02:52:06639 // not be used as accesskeys.
640 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L""));
[email protected]853300a82010-07-27 21:17:57641#else
[email protected]21abcc742009-10-23 02:52:06642 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L"1"));
643#endif
644}
645
[email protected]7f981ed72010-07-28 00:57:47646#if defined(OS_MACOSX)
647// See http://crbug.com/50447 for details.
648#define MAYBE_ReservedAccelerators FLAKY_ReservedAccelerators
649#else
650#define MAYBE_ReservedAccelerators ReservedAccelerators
651#endif
652
653IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, MAYBE_ReservedAccelerators) {
[email protected]95409e12010-08-17 20:07:11654 ASSERT_TRUE(test_server()->Start());
[email protected]21abcc742009-10-23 02:52:06655
[email protected]a6e602f2010-09-28 22:28:30656 ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
[email protected]95409e12010-08-17 20:07:11657 GURL url = test_server()->GetURL(kTestingPage);
[email protected]21abcc742009-10-23 02:52:06658 ui_test_utils::NavigateToURL(browser(), url);
659
660 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
661 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
662
[email protected]853300a82010-07-27 21:17:57663#if defined(OS_WIN) || defined(TOOLKIT_VIEWS)
[email protected]867125a02009-12-10 06:01:48664 static const KeyEventTestData kTestCtrlT = {
[email protected]7f05552482010-09-03 00:38:27665 app::VKEY_T, true, false, false, false,
[email protected]867125a02009-12-10 06:01:48666 true, false, false, false, 1,
[email protected]853300a82010-07-27 21:17:57667 { "D 17 0 true false false false" }
[email protected]867125a02009-12-10 06:01:48668 };
669
[email protected]21abcc742009-10-23 02:52:06670 ASSERT_EQ(1, browser()->tab_count());
671 // Press Ctrl+T, which will open a new tab.
[email protected]867125a02009-12-10 06:01:48672 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(0, kTestCtrlT));
[email protected]21abcc742009-10-23 02:52:06673 EXPECT_EQ(2, browser()->tab_count());
[email protected]867125a02009-12-10 06:01:48674 browser()->SelectNumberedTab(0);
675 ASSERT_EQ(0, browser()->selected_index());
[email protected]21abcc742009-10-23 02:52:06676
677 int result_length;
[email protected]867125a02009-12-10 06:01:48678 ASSERT_NO_FATAL_FAILURE(GetResultLength(0, &result_length));
[email protected]21abcc742009-10-23 02:52:06679 EXPECT_EQ(1, result_length);
680
681 // Reserved accelerators can't be suppressed.
[email protected]867125a02009-12-10 06:01:48682 ASSERT_NO_FATAL_FAILURE(SuppressAllEvents(0, true));
[email protected]21abcc742009-10-23 02:52:06683 // Press Ctrl+W, which will close the tab.
[email protected]a6e602f2010-09-28 22:28:30684 ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
685 browser(), app::VKEY_W, true, false, false, false));
[email protected]21abcc742009-10-23 02:52:06686 EXPECT_EQ(1, browser()->tab_count());
[email protected]853300a82010-07-27 21:17:57687#elif defined(OS_MACOSX)
688 static const KeyEventTestData kTestCmdT = {
[email protected]7f05552482010-09-03 00:38:27689 app::VKEY_T, false, false, false, true,
[email protected]853300a82010-07-27 21:17:57690 true, false, false, false, 1,
691 { "D 91 0 false false false true" }
692 };
[email protected]867125a02009-12-10 06:01:48693
[email protected]853300a82010-07-27 21:17:57694 ASSERT_EQ(1, browser()->tab_count());
695 // Press Cmd+T, which will open a new tab.
696 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(0, kTestCmdT));
697 EXPECT_EQ(2, browser()->tab_count());
698 browser()->SelectNumberedTab(0);
699 ASSERT_EQ(0, browser()->selected_index());
700
701 int result_length;
702 ASSERT_NO_FATAL_FAILURE(GetResultLength(0, &result_length));
703 EXPECT_EQ(1, result_length);
704
705 // Reserved accelerators can't be suppressed.
706 ASSERT_NO_FATAL_FAILURE(SuppressAllEvents(0, true));
707 // Press Cmd+W, which will close the tab.
[email protected]a6e602f2010-09-28 22:28:30708 ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
709 browser(), app::VKEY_W, false, false, false, true));
[email protected]853300a82010-07-27 21:17:57710 EXPECT_EQ(1, browser()->tab_count());
[email protected]753efc42010-03-09 19:52:16711#elif defined(TOOLKIT_GTK)
712 // Ctrl-[a-z] are not treated as reserved accelerators on GTK.
[email protected]867125a02009-12-10 06:01:48713 static const KeyEventTestData kTestCtrlT = {
[email protected]7f05552482010-09-03 00:38:27714 app::VKEY_T, true, false, false, false,
[email protected]867125a02009-12-10 06:01:48715 false, false, false, false, 2,
[email protected]853300a82010-07-27 21:17:57716 { "D 17 0 true false false false",
717 "D 84 0 true false false false" }
[email protected]867125a02009-12-10 06:01:48718 };
719
720 static const KeyEventTestData kTestCtrlPageDown = {
[email protected]7f05552482010-09-03 00:38:27721 app::VKEY_NEXT, true, false, false, false,
[email protected]867125a02009-12-10 06:01:48722 true, false, false, false, 1,
[email protected]853300a82010-07-27 21:17:57723 { "D 17 0 true false false false" }
[email protected]867125a02009-12-10 06:01:48724 };
725
726 static const KeyEventTestData kTestCtrlTab = {
[email protected]7f05552482010-09-03 00:38:27727 app::VKEY_TAB, true, false, false, false,
[email protected]867125a02009-12-10 06:01:48728 true, false, false, false, 1,
[email protected]853300a82010-07-27 21:17:57729 { "D 17 0 true false false false" }
[email protected]867125a02009-12-10 06:01:48730 };
731
732 static const KeyEventTestData kTestCtrlTBlocked = {
[email protected]7f05552482010-09-03 00:38:27733 app::VKEY_T, true, false, false, false,
[email protected]867125a02009-12-10 06:01:48734 true, false, false, false, 4,
[email protected]853300a82010-07-27 21:17:57735 { "D 17 0 true false false false",
736 "D 84 0 true false false false",
737 "U 84 0 true false false false",
738 "U 17 0 true false false false" }
[email protected]867125a02009-12-10 06:01:48739 };
740
741 static const KeyEventTestData kTestCtrlWBlocked = {
[email protected]7f05552482010-09-03 00:38:27742 app::VKEY_W, true, false, false, false,
[email protected]867125a02009-12-10 06:01:48743 true, false, false, false, 4,
[email protected]853300a82010-07-27 21:17:57744 { "D 17 0 true false false false",
745 "D 87 0 true false false false",
746 "U 87 0 true false false false",
747 "U 17 0 true false false false" }
[email protected]867125a02009-12-10 06:01:48748 };
749
750 ASSERT_EQ(1, browser()->tab_count());
751
752 // Ctrl+T should be blockable.
753 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(0, kTestCtrlTBlocked));
754 ASSERT_EQ(1, browser()->tab_count());
755
756 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(0, kTestCtrlT));
757 ASSERT_EQ(2, browser()->tab_count());
758 ASSERT_EQ(1, browser()->selected_index());
759 browser()->SelectNumberedTab(0);
760 ASSERT_EQ(0, browser()->selected_index());
761
762 // Ctrl+PageDown and Ctrl+Tab switches to the next tab.
763 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(0, kTestCtrlPageDown));
764 ASSERT_EQ(1, browser()->selected_index());
765
766 browser()->SelectNumberedTab(0);
767 ASSERT_EQ(0, browser()->selected_index());
768 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(0, kTestCtrlTab));
769 ASSERT_EQ(1, browser()->selected_index());
770
771 // Ctrl+W should be blockable.
772 browser()->SelectNumberedTab(0);
773 ASSERT_EQ(0, browser()->selected_index());
774 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(0, kTestCtrlWBlocked));
775 ASSERT_EQ(2, browser()->tab_count());
776
777 // Ctrl+F4 to close the tab.
778 ASSERT_NO_FATAL_FAILURE(SuppressAllEvents(0, true));
[email protected]a6e602f2010-09-28 22:28:30779 ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
780 browser(), app::VKEY_F4, true, false, false, false));
[email protected]867125a02009-12-10 06:01:48781 ASSERT_EQ(1, browser()->tab_count());
782#endif
[email protected]21abcc742009-10-23 02:52:06783}
[email protected]853300a82010-07-27 21:17:57784
785#if defined(OS_MACOSX)
786IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, EditorKeyBindings) {
787 static const KeyEventTestData kTestCtrlA = {
[email protected]7f05552482010-09-03 00:38:27788 app::VKEY_A, true, false, false, false,
[email protected]853300a82010-07-27 21:17:57789 false, false, false, false, 4,
790 { "D 17 0 true false false false",
791 "D 65 0 true false false false",
792 "U 65 0 true false false false",
793 "U 17 0 true false false false" }
794 };
795
796 static const KeyEventTestData kTestCtrlF = {
[email protected]7f05552482010-09-03 00:38:27797 app::VKEY_F, true, false, false, false,
[email protected]853300a82010-07-27 21:17:57798 false, false, false, false, 4,
799 { "D 17 0 true false false false",
800 "D 70 0 true false false false",
801 "U 70 0 true false false false",
802 "U 17 0 true false false false" }
803 };
804
805 static const KeyEventTestData kTestCtrlK = {
[email protected]7f05552482010-09-03 00:38:27806 app::VKEY_K, true, false, false, false,
[email protected]853300a82010-07-27 21:17:57807 false, false, false, false, 4,
808 { "D 17 0 true false false false",
809 "D 75 0 true false false false",
810 "U 75 0 true false false false",
811 "U 17 0 true false false false" }
812 };
813
[email protected]95409e12010-08-17 20:07:11814 ASSERT_TRUE(test_server()->Start());
[email protected]853300a82010-07-27 21:17:57815
[email protected]a6e602f2010-09-28 22:28:30816 ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
[email protected]95409e12010-08-17 20:07:11817 GURL url = test_server()->GetURL(kTestingPage);
[email protected]853300a82010-07-27 21:17:57818 ui_test_utils::NavigateToURL(browser(), url);
819
820 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
821 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
822
823 int tab_index = browser()->selected_index();
824 ASSERT_NO_FATAL_FAILURE(SetFocusedElement(tab_index, L"A"));
825 ASSERT_NO_FATAL_FAILURE(SetTextBoxValue(tab_index, L"A", L"Hello"));
826 // Move the caret to the beginning of the line.
827 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlA));
828 // Forward one character
829 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlF));
830 // Delete to the end of the line.
831 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlK));
832 EXPECT_NO_FATAL_FAILURE(CheckTextBoxValue(tab_index, L"A", L"H"));
833}
834#endif
835
836IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, PageUpDownKeys) {
837 static const KeyEventTestData kTestPageUp = {
[email protected]7f05552482010-09-03 00:38:27838 app::VKEY_PRIOR, false, false, false, false,
[email protected]853300a82010-07-27 21:17:57839 false, false, false, false, 2,
840 { "D 33 0 false false false false",
841 "U 33 0 false false false false" }
842 };
843
844 static const KeyEventTestData kTestPageDown = {
[email protected]7f05552482010-09-03 00:38:27845 app::VKEY_NEXT, false, false, false, false,
[email protected]853300a82010-07-27 21:17:57846 false, false, false, false, 2,
847 { "D 34 0 false false false false",
848 "U 34 0 false false false false" }
849 };
850
[email protected]95409e12010-08-17 20:07:11851 ASSERT_TRUE(test_server()->Start());
[email protected]853300a82010-07-27 21:17:57852
[email protected]a6e602f2010-09-28 22:28:30853 ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
[email protected]95409e12010-08-17 20:07:11854 GURL url = test_server()->GetURL(kTestingPage);
[email protected]853300a82010-07-27 21:17:57855 ui_test_utils::NavigateToURL(browser(), url);
856
857 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
858 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
859
860 int tab_index = browser()->selected_index();
861 ASSERT_NO_FATAL_FAILURE(SetFocusedElement(tab_index, L"A"));
862 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestPageUp));
863 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestPageDown));
864 EXPECT_NO_FATAL_FAILURE(CheckTextBoxValue(tab_index, L"A", L""));
865}
[email protected]629e0342010-07-27 23:30:13866
[email protected]ee19cb202010-08-04 19:48:19867#if defined(OS_WIN) || defined(TOOLKIT_VIEWS)
868IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, FocusMenuBarByAltKey) {
869 static const KeyEventTestData kTestAltKey = {
[email protected]7f05552482010-09-03 00:38:27870 app::VKEY_MENU, false, false, false, false,
[email protected]ee19cb202010-08-04 19:48:19871 false, false, false, false, 2,
872 { "D 18 0 false false true false",
873 "U 18 0 false false true false" }
874 };
875
876 static const KeyEventTestData kTestAltKeySuppress = {
[email protected]7f05552482010-09-03 00:38:27877 app::VKEY_MENU, false, false, false, false,
[email protected]ee19cb202010-08-04 19:48:19878 true, false, false, false, 2,
879 { "D 18 0 false false true false",
880 "U 18 0 false false true false" }
881 };
882
883 static const KeyEventTestData kTestCtrlAltKey = {
[email protected]7f05552482010-09-03 00:38:27884 app::VKEY_MENU, true, false, false, false,
[email protected]ee19cb202010-08-04 19:48:19885 false, false, false, false, 4,
886 { "D 17 0 true false false false",
887 "D 18 0 true false true false",
888 "U 18 0 true false true false",
889 "U 17 0 true false false false" }
890 };
891
[email protected]95409e12010-08-17 20:07:11892 ASSERT_TRUE(test_server()->Start());
[email protected]ee19cb202010-08-04 19:48:19893
[email protected]a6e602f2010-09-28 22:28:30894 ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
[email protected]95409e12010-08-17 20:07:11895 GURL url = test_server()->GetURL(kTestingPage);
[email protected]ee19cb202010-08-04 19:48:19896 ui_test_utils::NavigateToURL(browser(), url);
897
898 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
899 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
900
901 int tab_index = browser()->selected_index();
902 // Press and release Alt key to focus wrench menu button.
903 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestAltKey));
904 EXPECT_TRUE(IsViewFocused(VIEW_ID_APP_MENU));
905
906 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
907 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
908
909 // Alt key can be suppressed.
910 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestAltKeySuppress));
911 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
912
913 // Ctrl+Alt should have no effect.
914 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlAltKey));
915 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
916}
917#endif
918
[email protected]629e0342010-07-27 23:30:13919} // namespace