OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "build/build_config.h" | 5 #include "build/build_config.h" |
6 | 6 |
7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
8 #include "base/keyboard_codes.h" | 8 #include "base/keyboard_codes.h" |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/message_loop.h" | 10 #include "base/message_loop.h" |
(...skipping 23 matching lines...) Expand all Loading... |
34 L"window.domAutomationController.send(keyEventResult[%d]);"; | 34 L"window.domAutomationController.send(keyEventResult[%d]);"; |
35 const wchar_t kGetResultLengthJS[] = | 35 const wchar_t kGetResultLengthJS[] = |
36 L"window.domAutomationController.send(keyEventResult.length);"; | 36 L"window.domAutomationController.send(keyEventResult.length);"; |
37 const wchar_t kGetFocusedElementJS[] = | 37 const wchar_t kGetFocusedElementJS[] = |
38 L"window.domAutomationController.send(focusedElement);"; | 38 L"window.domAutomationController.send(focusedElement);"; |
39 const wchar_t kSetFocusedElementJS[] = | 39 const wchar_t kSetFocusedElementJS[] = |
40 L"window.domAutomationController.send(setFocusedElement('%ls'));"; | 40 L"window.domAutomationController.send(setFocusedElement('%ls'));"; |
41 const wchar_t kGetTextBoxValueJS[] = | 41 const wchar_t kGetTextBoxValueJS[] = |
42 L"window.domAutomationController.send(" | 42 L"window.domAutomationController.send(" |
43 L"document.getElementById('%ls').value);"; | 43 L"document.getElementById('%ls').value);"; |
| 44 const wchar_t kSetTextBoxValueJS[] = |
| 45 L"window.domAutomationController.send(" |
| 46 L"document.getElementById('%ls').value = '%ls');"; |
44 const wchar_t kStartTestJS[] = | 47 const wchar_t kStartTestJS[] = |
45 L"window.domAutomationController.send(startTest());"; | 48 L"window.domAutomationController.send(startTest(%d));"; |
46 | 49 |
47 // Maximum lenght of the result array in KeyEventTestData structure. | 50 // Maximum lenght of the result array in KeyEventTestData structure. |
48 const size_t kMaxResultLength = 10; | 51 const size_t kMaxResultLength = 10; |
49 | 52 |
50 // A structure holding test data of a keyboard event. | 53 // A structure holding test data of a keyboard event. |
51 // Each keyboard event may generate multiple result strings representing | 54 // Each keyboard event may generate multiple result strings representing |
52 // the result of keydown, keypress, keyup and textInput events. | 55 // the result of keydown, keypress, keyup and textInput events. |
53 // For keydown, keypress and keyup events, the format of the result string is: | 56 // For keydown, keypress and keyup events, the format of the result string is: |
54 // <type> <keyCode> <charCode> <ctrlKey> <shiftKey> <altKey> | 57 // <type> <keyCode> <charCode> <ctrlKey> <shiftKey> <altKey> <commandKey> |
55 // where <type> may be 'D' (keydown), 'P' (keypress) or 'U' (keyup). | 58 // where <type> may be 'D' (keydown), 'P' (keypress) or 'U' (keyup). |
56 // <ctrlKey>, <shiftKey> and <altKey> are boolean value indicating the state of | 59 // <ctrlKey>, <shiftKey> <altKey> and <commandKey> are boolean value indicating |
57 // corresponding modifier key. | 60 // the state of corresponding modifier key. |
58 // For textInput event, the format is: T <text>, where <text> is the text to be | 61 // For textInput event, the format is: T <text>, where <text> is the text to be |
59 // input. | 62 // input. |
60 // Please refer to chrome/test/data/keyevents_test.html for details. | 63 // Please refer to chrome/test/data/keyevents_test.html for details. |
61 struct KeyEventTestData { | 64 struct KeyEventTestData { |
62 base::KeyboardCode key; | 65 base::KeyboardCode key; |
63 bool ctrl; | 66 bool ctrl; |
64 bool shift; | 67 bool shift; |
65 bool alt; | 68 bool alt; |
| 69 bool command; |
66 | 70 |
67 bool suppress_keydown; | 71 bool suppress_keydown; |
68 bool suppress_keypress; | 72 bool suppress_keypress; |
69 bool suppress_keyup; | 73 bool suppress_keyup; |
70 bool suppress_textinput; | 74 bool suppress_textinput; |
71 | 75 |
72 int result_length; | 76 int result_length; |
73 const char* const result[kMaxResultLength]; | 77 const char* const result[kMaxResultLength]; |
74 }; | 78 }; |
75 | 79 |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
124 EnableDOMAutomation(); | 128 EnableDOMAutomation(); |
125 } | 129 } |
126 | 130 |
127 void GetNativeWindow(gfx::NativeWindow* native_window) { | 131 void GetNativeWindow(gfx::NativeWindow* native_window) { |
128 BrowserWindow* window = browser()->window(); | 132 BrowserWindow* window = browser()->window(); |
129 ASSERT_TRUE(window); | 133 ASSERT_TRUE(window); |
130 *native_window = window->GetNativeHandle(); | 134 *native_window = window->GetNativeHandle(); |
131 ASSERT_TRUE(*native_window); | 135 ASSERT_TRUE(*native_window); |
132 } | 136 } |
133 | 137 |
134 void SendKey(base::KeyboardCode key, bool control, bool shift, bool alt) { | 138 void BringBrowserWindowToFront() { |
| 139 gfx::NativeWindow window = NULL; |
| 140 ASSERT_NO_FATAL_FAILURE(GetNativeWindow(&window)); |
| 141 ui_test_utils::ShowAndFocusNativeWindow(window); |
| 142 } |
| 143 |
| 144 void SendKey(base::KeyboardCode key, |
| 145 bool control, |
| 146 bool shift, |
| 147 bool alt, |
| 148 bool command) { |
135 gfx::NativeWindow window = NULL; | 149 gfx::NativeWindow window = NULL; |
136 ASSERT_NO_FATAL_FAILURE(GetNativeWindow(&window)); | 150 ASSERT_NO_FATAL_FAILURE(GetNativeWindow(&window)); |
137 EXPECT_TRUE(ui_controls::SendKeyPressNotifyWhenDone( | 151 EXPECT_TRUE(ui_controls::SendKeyPressNotifyWhenDone( |
138 window, key, control, shift, alt, | 152 window, key, control, shift, alt, command, |
139 false /* command, */, | |
140 new MessageLoop::QuitTask())); | 153 new MessageLoop::QuitTask())); |
141 ui_test_utils::RunMessageLoop(); | 154 ui_test_utils::RunMessageLoop(); |
142 } | 155 } |
143 | 156 |
144 bool IsViewFocused(ViewID vid) { | 157 bool IsViewFocused(ViewID vid) { |
145 return ui_test_utils::IsViewFocused(browser(), vid); | 158 return ui_test_utils::IsViewFocused(browser(), vid); |
146 } | 159 } |
147 | 160 |
148 void ClickOnView(ViewID vid) { | 161 void ClickOnView(ViewID vid) { |
149 ui_test_utils::ClickOnView(browser(), vid); | 162 ui_test_utils::ClickOnView(browser(), vid); |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
231 ASSERT_LT(tab_index, browser()->tab_count()); | 244 ASSERT_LT(tab_index, browser()->tab_count()); |
232 std::string actual; | 245 std::string actual; |
233 ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractString( | 246 ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractString( |
234 browser()->GetTabContentsAt(tab_index)->render_view_host(), | 247 browser()->GetTabContentsAt(tab_index)->render_view_host(), |
235 L"", | 248 L"", |
236 StringPrintf(kGetTextBoxValueJS, id), | 249 StringPrintf(kGetTextBoxValueJS, id), |
237 &actual)); | 250 &actual)); |
238 ASSERT_EQ(WideToUTF8(value), actual); | 251 ASSERT_EQ(WideToUTF8(value), actual); |
239 } | 252 } |
240 | 253 |
241 void StartTest(int tab_index) { | 254 void SetTextBoxValue(int tab_index, const wchar_t* id, |
| 255 const wchar_t* value) { |
| 256 ASSERT_LT(tab_index, browser()->tab_count()); |
| 257 std::string actual; |
| 258 ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractString( |
| 259 browser()->GetTabContentsAt(tab_index)->render_view_host(), |
| 260 L"", |
| 261 StringPrintf(kSetTextBoxValueJS, id, value), |
| 262 &actual)); |
| 263 ASSERT_EQ(WideToUTF8(value), actual); |
| 264 } |
| 265 |
| 266 void StartTest(int tab_index, int result_length) { |
242 ASSERT_LT(tab_index, browser()->tab_count()); | 267 ASSERT_LT(tab_index, browser()->tab_count()); |
243 bool actual; | 268 bool actual; |
244 ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( | 269 ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( |
245 browser()->GetTabContentsAt(tab_index)->render_view_host(), | 270 browser()->GetTabContentsAt(tab_index)->render_view_host(), |
246 L"", kStartTestJS, &actual)); | 271 L"", StringPrintf(kStartTestJS, result_length), &actual)); |
247 ASSERT_TRUE(actual); | 272 ASSERT_TRUE(actual); |
248 } | 273 } |
249 | 274 |
250 void TestKeyEvent(int tab_index, const KeyEventTestData& test) { | 275 void TestKeyEvent(int tab_index, const KeyEventTestData& test) { |
251 ASSERT_LT(tab_index, browser()->tab_count()); | 276 ASSERT_LT(tab_index, browser()->tab_count()); |
252 ASSERT_EQ(tab_index, browser()->selected_index()); | 277 ASSERT_EQ(tab_index, browser()->selected_index()); |
253 | 278 |
254 // Inform our testing web page that we are about to start testing a key | 279 // Inform our testing web page that we are about to start testing a key |
255 // event. | 280 // event. |
256 ASSERT_NO_FATAL_FAILURE(StartTest(tab_index)); | 281 ASSERT_NO_FATAL_FAILURE(StartTest(tab_index, test.result_length)); |
257 ASSERT_NO_FATAL_FAILURE(SuppressEvents( | 282 ASSERT_NO_FATAL_FAILURE(SuppressEvents( |
258 tab_index, test.suppress_keydown, test.suppress_keypress, | 283 tab_index, test.suppress_keydown, test.suppress_keypress, |
259 test.suppress_keyup, test.suppress_textinput)); | 284 test.suppress_keyup, test.suppress_textinput)); |
260 | 285 |
261 // We need to create a finish observer before sending the key event, | 286 // We need to create a finish observer before sending the key event, |
262 // because the test finished message might be arrived before returning | 287 // because the test finished message might be arrived before returning |
263 // from the SendKey() method. | 288 // from the SendKey() method. |
264 TestFinishObserver finish_observer( | 289 TestFinishObserver finish_observer( |
265 browser()->GetTabContentsAt(tab_index)->render_view_host()); | 290 browser()->GetTabContentsAt(tab_index)->render_view_host()); |
266 | 291 |
267 ASSERT_NO_FATAL_FAILURE(SendKey(test.key, test.ctrl, test.shift, test.alt)); | 292 ASSERT_NO_FATAL_FAILURE( |
| 293 SendKey(test.key, test.ctrl, test.shift, test.alt, test.command)); |
268 ASSERT_TRUE(finish_observer.WaitForFinish()); | 294 ASSERT_TRUE(finish_observer.WaitForFinish()); |
269 ASSERT_NO_FATAL_FAILURE(CheckResult( | 295 ASSERT_NO_FATAL_FAILURE(CheckResult( |
270 tab_index, test.result_length, test.result)); | 296 tab_index, test.result_length, test.result)); |
271 } | 297 } |
272 | 298 |
273 std::string GetTestDataDescription(const KeyEventTestData& data) { | 299 std::string GetTestDataDescription(const KeyEventTestData& data) { |
274 std::string desc = StringPrintf( | 300 std::string desc = StringPrintf( |
275 " VKEY:0x%02x, ctrl:%d, shift:%d, alt:%d\n" | 301 " VKEY:0x%02x, ctrl:%d, shift:%d, alt:%d, command:%d\n" |
276 " Suppress: keydown:%d, keypress:%d, keyup:%d, textInput:%d\n" | 302 " Suppress: keydown:%d, keypress:%d, keyup:%d, textInput:%d\n" |
277 " Expected results(%d):\n", | 303 " Expected results(%d):\n", |
278 data.key, data.ctrl, data.shift, data.alt, | 304 data.key, data.ctrl, data.shift, data.alt, data.command, |
279 data.suppress_keydown, data.suppress_keypress, data.suppress_keyup, | 305 data.suppress_keydown, data.suppress_keypress, data.suppress_keyup, |
280 data.suppress_textinput, data.result_length); | 306 data.suppress_textinput, data.result_length); |
281 for (int i = 0; i < data.result_length; ++i) { | 307 for (int i = 0; i < data.result_length; ++i) { |
282 desc.append(" "); | 308 desc.append(" "); |
283 desc.append(data.result[i]); | 309 desc.append(data.result[i]); |
284 desc.append("\n"); | 310 desc.append("\n"); |
285 } | 311 } |
286 return desc; | 312 return desc; |
287 } | 313 } |
288 }; | 314 }; |
289 | 315 |
290 } // namespace | 316 } // namespace |
291 | 317 |
292 // Flaky since r51395. See crbug.com/48671. | 318 IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, NormalKeyEvents) { |
293 IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, FLAKY_NormalKeyEvents) { | |
294 static const KeyEventTestData kTestNoInput[] = { | 319 static const KeyEventTestData kTestNoInput[] = { |
295 // a | 320 // a |
296 { base::VKEY_A, false, false, false, | 321 { base::VKEY_A, false, false, false, false, |
297 false, false, false, false, 3, | 322 false, false, false, false, 3, |
298 { "D 65 0 false false false", | 323 { "D 65 0 false false false false", |
299 "P 97 97 false false false", | 324 "P 97 97 false false false false", |
300 "U 65 0 false false false" } }, | 325 "U 65 0 false false false false" } }, |
301 // shift-a | 326 // shift-a |
302 { base::VKEY_A, false, true, false, | 327 { base::VKEY_A, false, true, false, false, |
303 false, false, false, false, 5, | 328 false, false, false, false, 5, |
304 { "D 16 0 false true false", | 329 { "D 16 0 false true false false", |
305 "D 65 0 false true false", | 330 "D 65 0 false true false false", |
306 "P 65 65 false true false", | 331 "P 65 65 false true false false", |
307 "U 65 0 false true false", | 332 "U 65 0 false true false false", |
308 "U 16 0 false true false" } }, | 333 "U 16 0 false true false false" } }, |
309 // a, suppress keydown | 334 // a, suppress keydown |
310 { base::VKEY_A, false, false, false, | 335 { base::VKEY_A, false, false, false, false, |
311 true, false, false, false, 2, | 336 true, false, false, false, 2, |
312 { "D 65 0 false false false", | 337 { "D 65 0 false false false false", |
313 "U 65 0 false false false" } }, | 338 "U 65 0 false false false false" } }, |
314 }; | 339 }; |
315 | 340 |
316 static const KeyEventTestData kTestWithInput[] = { | 341 static const KeyEventTestData kTestWithInput[] = { |
317 // a | 342 // a |
318 { base::VKEY_A, false, false, false, | 343 { base::VKEY_A, false, false, false, false, |
319 false, false, false, false, 4, | 344 false, false, false, false, 4, |
320 { "D 65 0 false false false", | 345 { "D 65 0 false false false false", |
321 "P 97 97 false false false", | 346 "P 97 97 false false false false", |
322 "T a", | 347 "T a", |
323 "U 65 0 false false false" } }, | 348 "U 65 0 false false false false" } }, |
324 // shift-a | 349 // shift-a |
325 { base::VKEY_A, false, true, false, | 350 { base::VKEY_A, false, true, false, false, |
326 false, false, false, false, 6, | 351 false, false, false, false, 6, |
327 { "D 16 0 false true false", | 352 { "D 16 0 false true false false", |
328 "D 65 0 false true false", | 353 "D 65 0 false true false false", |
329 "P 65 65 false true false", | 354 "P 65 65 false true false false", |
330 "T A", | 355 "T A", |
331 "U 65 0 false true false", | 356 "U 65 0 false true false false", |
332 "U 16 0 false true false" } }, | 357 "U 16 0 false true false false" } }, |
333 // a, suppress keydown | 358 // a, suppress keydown |
334 { base::VKEY_A, false, false, false, | 359 { base::VKEY_A, false, false, false, false, |
335 true, false, false, false, 2, | 360 true, false, false, false, 2, |
336 { "D 65 0 false false false", | 361 { "D 65 0 false false false false", |
337 "U 65 0 false false false" } }, | 362 "U 65 0 false false false false" } }, |
338 // a, suppress keypress | 363 // a, suppress keypress |
339 { base::VKEY_A, false, false, false, | 364 { base::VKEY_A, false, false, false, false, |
340 false, true, false, false, 3, | 365 false, true, false, false, 3, |
341 { "D 65 0 false false false", | 366 { "D 65 0 false false false false", |
342 "P 97 97 false false false", | 367 "P 97 97 false false false false", |
343 "U 65 0 false false false" } }, | 368 "U 65 0 false false false false" } }, |
344 // a, suppress textInput | 369 // a, suppress textInput |
345 { base::VKEY_A, false, false, false, | 370 { base::VKEY_A, false, false, false, false, |
346 false, false, false, true, 4, | 371 false, false, false, true, 4, |
347 { "D 65 0 false false false", | 372 { "D 65 0 false false false false", |
348 "P 97 97 false false false", | 373 "P 97 97 false false false false", |
349 "T a", | 374 "T a", |
350 "U 65 0 false false false" } }, | 375 "U 65 0 false false false false" } }, |
351 }; | 376 }; |
352 | 377 |
353 HTTPTestServer* server = StartHTTPServer(); | 378 HTTPTestServer* server = StartHTTPServer(); |
| 379 ASSERT_TRUE(server); |
354 | 380 |
| 381 BringBrowserWindowToFront(); |
355 GURL url = server->TestServerPage(kTestingPage); | 382 GURL url = server->TestServerPage(kTestingPage); |
356 ui_test_utils::NavigateToURL(browser(), url); | 383 ui_test_utils::NavigateToURL(browser(), url); |
357 | 384 |
358 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER)); | 385 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER)); |
359 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW)); | 386 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW)); |
360 | 387 |
361 int tab_index = browser()->selected_index(); | 388 int tab_index = browser()->selected_index(); |
362 for (size_t i = 0; i < arraysize(kTestNoInput); ++i) { | 389 for (size_t i = 0; i < arraysize(kTestNoInput); ++i) { |
363 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestNoInput[i])) | 390 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestNoInput[i])) |
364 << "kTestNoInput[" << i << "] failed:\n" | 391 << "kTestNoInput[" << i << "] failed:\n" |
365 << GetTestDataDescription(kTestNoInput[i]); | 392 << GetTestDataDescription(kTestNoInput[i]); |
366 } | 393 } |
367 | 394 |
| 395 // Input in normal text box. |
368 ASSERT_NO_FATAL_FAILURE(SetFocusedElement(tab_index, L"A")); | 396 ASSERT_NO_FATAL_FAILURE(SetFocusedElement(tab_index, L"A")); |
369 for (size_t i = 0; i < arraysize(kTestWithInput); ++i) { | 397 for (size_t i = 0; i < arraysize(kTestWithInput); ++i) { |
370 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestWithInput[i])) | 398 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestWithInput[i])) |
371 << "kTestWithInput[" << i << "] failed:\n" | 399 << "kTestWithInput[" << i << "] in text box failed:\n" |
372 << GetTestDataDescription(kTestWithInput[i]); | 400 << GetTestDataDescription(kTestWithInput[i]); |
373 } | 401 } |
| 402 EXPECT_NO_FATAL_FAILURE(CheckTextBoxValue(tab_index, L"A", L"aA")); |
374 | 403 |
375 EXPECT_NO_FATAL_FAILURE(CheckTextBoxValue(tab_index, L"A", L"aA")); | 404 // Input in password box. |
| 405 ASSERT_NO_FATAL_FAILURE(SetFocusedElement(tab_index, L"B")); |
| 406 for (size_t i = 0; i < arraysize(kTestWithInput); ++i) { |
| 407 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestWithInput[i])) |
| 408 << "kTestWithInput[" << i << "] in password box failed:\n" |
| 409 << GetTestDataDescription(kTestWithInput[i]); |
| 410 } |
| 411 EXPECT_NO_FATAL_FAILURE(CheckTextBoxValue(tab_index, L"B", L"aA")); |
376 } | 412 } |
377 | 413 |
| 414 #if defined(OS_WIN) || defined(OS_LINUX) |
378 IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, CtrlKeyEvents) { | 415 IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, CtrlKeyEvents) { |
379 static const KeyEventTestData kTestCtrlF = { | 416 static const KeyEventTestData kTestCtrlF = { |
380 base::VKEY_F, true, false, false, | 417 base::VKEY_F, true, false, false, false, |
381 false, false, false, false, 2, | 418 false, false, false, false, 2, |
382 { "D 17 0 true false false", | 419 { "D 17 0 true false false false", |
383 "D 70 0 true false false" } | 420 "D 70 0 true false false false" } |
384 }; | 421 }; |
385 | 422 |
386 static const KeyEventTestData kTestCtrlFSuppressKeyDown = { | 423 static const KeyEventTestData kTestCtrlFSuppressKeyDown = { |
387 base::VKEY_F, true, false, false, | 424 base::VKEY_F, true, false, false, false, |
388 true, false, false, false, 4, | 425 true, false, false, false, 4, |
389 { "D 17 0 true false false", | 426 { "D 17 0 true false false false", |
390 "D 70 0 true false false", | 427 "D 70 0 true false false false", |
391 "U 70 0 true false false", | 428 "U 70 0 true false false false", |
392 "U 17 0 true false false" } | 429 "U 17 0 true false false false" } |
393 }; | 430 }; |
394 | 431 |
395 // Ctrl+Z doesn't bind to any accelerators, which then should generate a | 432 // Ctrl+Z doesn't bind to any accelerators, which then should generate a |
396 // keypress event with charCode=26. | 433 // keypress event with charCode=26. |
397 static const KeyEventTestData kTestCtrlZ = { | 434 static const KeyEventTestData kTestCtrlZ = { |
398 base::VKEY_Z, true, false, false, | 435 base::VKEY_Z, true, false, false, false, |
399 false, false, false, false, 5, | 436 false, false, false, false, 5, |
400 { "D 17 0 true false false", | 437 { "D 17 0 true false false false", |
401 "D 90 0 true false false", | 438 "D 90 0 true false false false", |
402 "P 26 26 true false false", | 439 "P 26 26 true false false false", |
403 "U 90 0 true false false", | 440 "U 90 0 true false false false", |
404 "U 17 0 true false false" } | 441 "U 17 0 true false false false" } |
405 }; | 442 }; |
406 | 443 |
407 static const KeyEventTestData kTestCtrlZSuppressKeyDown = { | 444 static const KeyEventTestData kTestCtrlZSuppressKeyDown = { |
408 base::VKEY_Z, true, false, false, | 445 base::VKEY_Z, true, false, false, false, |
409 true, false, false, false, 4, | 446 true, false, false, false, 4, |
410 { "D 17 0 true false false", | 447 { "D 17 0 true false false false", |
411 "D 90 0 true false false", | 448 "D 90 0 true false false false", |
412 "U 90 0 true false false", | 449 "U 90 0 true false false false", |
413 "U 17 0 true false false" } | 450 "U 17 0 true false false false" } |
414 }; | 451 }; |
415 | 452 |
416 // Ctrl+Enter shall generate a keypress event with charCode=10 (LF). | 453 // Ctrl+Enter shall generate a keypress event with charCode=10 (LF). |
417 static const KeyEventTestData kTestCtrlEnter = { | 454 static const KeyEventTestData kTestCtrlEnter = { |
418 base::VKEY_RETURN, true, false, false, | 455 base::VKEY_RETURN, true, false, false, false, |
419 false, false, false, false, 5, | 456 false, false, false, false, 5, |
420 { "D 17 0 true false false", | 457 { "D 17 0 true false false false", |
421 "D 13 0 true false false", | 458 "D 13 0 true false false false", |
422 "P 10 10 true false false", | 459 "P 10 10 true false false false", |
423 "U 13 0 true false false", | 460 "U 13 0 true false false false", |
424 "U 17 0 true false false" } | 461 "U 17 0 true false false false" } |
425 }; | 462 }; |
426 | 463 |
427 HTTPTestServer* server = StartHTTPServer(); | 464 HTTPTestServer* server = StartHTTPServer(); |
| 465 ASSERT_TRUE(server); |
428 | 466 |
| 467 BringBrowserWindowToFront(); |
429 GURL url = server->TestServerPage(kTestingPage); | 468 GURL url = server->TestServerPage(kTestingPage); |
430 ui_test_utils::NavigateToURL(browser(), url); | 469 ui_test_utils::NavigateToURL(browser(), url); |
431 | 470 |
432 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER)); | 471 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER)); |
433 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW)); | 472 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW)); |
434 | 473 |
435 int tab_index = browser()->selected_index(); | 474 int tab_index = browser()->selected_index(); |
436 // Press Ctrl+F, which will make the Find box open and request focus. | 475 // Press Ctrl+F, which will make the Find box open and request focus. |
437 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlF)); | 476 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlF)); |
438 EXPECT_TRUE(IsViewFocused(VIEW_ID_FIND_IN_PAGE_TEXT_FIELD)); | 477 EXPECT_TRUE(IsViewFocused(VIEW_ID_FIND_IN_PAGE_TEXT_FIELD)); |
439 | 478 |
440 // Press Escape to close the Find box and move the focus back to the web page. | 479 // Press Escape to close the Find box and move the focus back to the web page. |
441 ASSERT_NO_FATAL_FAILURE(SendKey(base::VKEY_ESCAPE, false, false, false)); | 480 ASSERT_NO_FATAL_FAILURE( |
| 481 SendKey(base::VKEY_ESCAPE, false, false, false, false)); |
442 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW)); | 482 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW)); |
443 | 483 |
444 // Press Ctrl+F with keydown suppressed shall not open the find box. | 484 // Press Ctrl+F with keydown suppressed shall not open the find box. |
445 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlFSuppressKeyDown)); | 485 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlFSuppressKeyDown)); |
446 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW)); | 486 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW)); |
447 | 487 |
448 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlZ)); | 488 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlZ)); |
449 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlZSuppressKeyDown)); | 489 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlZSuppressKeyDown)); |
450 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlEnter)); | 490 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlEnter)); |
451 } | 491 } |
| 492 #elif defined(OS_MACOSX) |
| 493 IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, CommandKeyEvents) { |
| 494 static const KeyEventTestData kTestCmdF = { |
| 495 base::VKEY_F, false, false, false, true, |
| 496 false, false, false, false, 2, |
| 497 { "D 91 0 false false false true", |
| 498 "D 70 0 false false false true" } |
| 499 }; |
| 500 |
| 501 // On Mac we don't send key up events when command modifier is down. |
| 502 static const KeyEventTestData kTestCmdFSuppressKeyDown = { |
| 503 base::VKEY_F, false, false, false, true, |
| 504 true, false, false, false, 3, |
| 505 { "D 91 0 false false false true", |
| 506 "D 70 0 false false false true", |
| 507 "U 91 0 false false false true" } |
| 508 }; |
| 509 |
| 510 HTTPTestServer* server = StartHTTPServer(); |
| 511 ASSERT_TRUE(server); |
| 512 |
| 513 BringBrowserWindowToFront(); |
| 514 GURL url = server->TestServerPage(kTestingPage); |
| 515 ui_test_utils::NavigateToURL(browser(), url); |
| 516 |
| 517 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER)); |
| 518 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW)); |
| 519 |
| 520 int tab_index = browser()->selected_index(); |
| 521 // Press Cmd+F, which will make the Find box open and request focus. |
| 522 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCmdF)); |
| 523 EXPECT_TRUE(IsViewFocused(VIEW_ID_FIND_IN_PAGE_TEXT_FIELD)); |
| 524 |
| 525 // Press Escape to close the Find box and move the focus back to the web page. |
| 526 ASSERT_NO_FATAL_FAILURE( |
| 527 SendKey(base::VKEY_ESCAPE, false, false, false, false)); |
| 528 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW)); |
| 529 |
| 530 // Press Cmd+F with keydown suppressed shall not open the find box. |
| 531 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCmdFSuppressKeyDown)); |
| 532 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW)); |
| 533 } |
| 534 #endif |
452 | 535 |
453 #if defined(TOOLKIT_VIEWS) && defined(OS_LINUX) | 536 #if defined(TOOLKIT_VIEWS) && defined(OS_LINUX) |
454 // See http://crbug.com/40037 for details. | 537 // See http://crbug.com/40037 for details. |
455 #define MAYBE_AccessKeys DISABLED_AccessKeys | 538 #define MAYBE_AccessKeys DISABLED_AccessKeys |
456 #else | 539 #else |
457 #define MAYBE_AccessKeys AccessKeys | 540 #define MAYBE_AccessKeys AccessKeys |
458 #endif | 541 #endif |
459 | 542 |
460 IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, MAYBE_AccessKeys) { | 543 IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, MAYBE_AccessKeys) { |
461 static const KeyEventTestData kTestAltA = { | 544 #if defined(OS_MACOSX) |
462 base::VKEY_A, false, false, true, | 545 // On Mac, access keys use ctrl+alt modifiers. |
463 false, false, false, false, 4, | 546 static const KeyEventTestData kTestAccessA = { |
464 { "D 18 0 false false true", | 547 base::VKEY_A, true, false, true, false, |
465 "D 65 0 false false true", | 548 false, false, false, false, 6, |
466 "U 65 0 false false true", | 549 { "D 17 0 true false false false", |
467 "U 18 0 false false true" } | 550 "D 18 0 true false true false", |
| 551 "D 65 0 true false true false", |
| 552 "U 65 0 true false true false", |
| 553 "U 18 0 true false true false", |
| 554 "U 17 0 true false false false" } |
468 }; | 555 }; |
469 | 556 |
470 static const KeyEventTestData kTestAltD = { | 557 static const KeyEventTestData kTestAccessDSuppress = { |
471 base::VKEY_D, false, false, true, | 558 base::VKEY_D, true, false, true, false, |
472 false, false, false, false, 2, | 559 true, true, true, false, 6, |
473 { "D 18 0 false false true", | 560 { "D 17 0 true false false false", |
474 "D 68 0 false false true" } | 561 "D 18 0 true false true false", |
| 562 "D 68 0 true false true false", |
| 563 "U 68 0 true false true false", |
| 564 "U 18 0 true false true false", |
| 565 "U 17 0 true false false false" } |
475 }; | 566 }; |
476 | 567 |
477 static const KeyEventTestData kTestAltDSuppress = { | 568 static const KeyEventTestData kTestAccess1 = { |
478 base::VKEY_D, false, false, true, | 569 base::VKEY_1, true, false, true, false, |
479 true, true, true, false, 4, | 570 false, false, false, false, 6, |
480 { "D 18 0 false false true", | 571 { "D 17 0 true false false false", |
481 "D 68 0 false false true", | 572 "D 18 0 true false true false", |
482 "U 68 0 false false true", | 573 "D 49 0 true false true false", |
483 "U 18 0 false false true" } | 574 "U 49 0 true false true false", |
| 575 "U 18 0 true false true false", |
| 576 "U 17 0 true false false false" } |
| 577 }; |
| 578 #else |
| 579 static const KeyEventTestData kTestAccessA = { |
| 580 base::VKEY_A, false, false, true, false, |
| 581 false, false, false, false, 4, |
| 582 { "D 18 0 false false true false", |
| 583 "D 65 0 false false true false", |
| 584 "U 65 0 false false true false", |
| 585 "U 18 0 false false true false" } |
484 }; | 586 }; |
485 | 587 |
486 static const KeyEventTestData kTestAlt1 = { | 588 static const KeyEventTestData kTestAccessD = { |
487 base::VKEY_1, false, false, true, | 589 base::VKEY_D, false, false, true, false, |
488 false, false, false, false, 4, | 590 false, false, false, false, 2, |
489 { "D 18 0 false false true", | 591 { "D 18 0 false false true false", |
490 "D 49 0 false false true", | 592 "D 68 0 false false true false" } |
491 "U 49 0 false false true", | |
492 "U 18 0 false false true" } | |
493 }; | 593 }; |
494 | 594 |
| 595 static const KeyEventTestData kTestAccessDSuppress = { |
| 596 base::VKEY_D, false, false, true, false, |
| 597 true, true, true, false, 4, |
| 598 { "D 18 0 false false true false", |
| 599 "D 68 0 false false true false", |
| 600 "U 68 0 false false true false", |
| 601 "U 18 0 false false true false" } |
| 602 }; |
| 603 |
| 604 static const KeyEventTestData kTestAccess1 = { |
| 605 base::VKEY_1, false, false, true, false, |
| 606 false, false, false, false, 4, |
| 607 { "D 18 0 false false true false", |
| 608 "D 49 0 false false true false", |
| 609 "U 49 0 false false true false", |
| 610 "U 18 0 false false true false" } |
| 611 }; |
| 612 #endif |
| 613 |
495 HTTPTestServer* server = StartHTTPServer(); | 614 HTTPTestServer* server = StartHTTPServer(); |
| 615 ASSERT_TRUE(server); |
496 | 616 |
| 617 BringBrowserWindowToFront(); |
497 GURL url = server->TestServerPage(kTestingPage); | 618 GURL url = server->TestServerPage(kTestingPage); |
498 ui_test_utils::NavigateToURL(browser(), url); | 619 ui_test_utils::NavigateToURL(browser(), url); |
499 | 620 |
500 ui_test_utils::RunAllPendingInMessageLoop(); | 621 ui_test_utils::RunAllPendingInMessageLoop(); |
501 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER)); | 622 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER)); |
502 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW)); | 623 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW)); |
503 | 624 |
504 int tab_index = browser()->selected_index(); | 625 int tab_index = browser()->selected_index(); |
505 // Make sure no element is focused. | 626 // Make sure no element is focused. |
506 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L"")); | 627 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L"")); |
507 // Alt+A should focus the element with accesskey = "A". | 628 // Alt+A should focus the element with accesskey = "A". |
508 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestAltA)); | 629 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestAccessA)); |
509 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L"A")); | 630 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L"A")); |
510 | 631 |
511 // Blur the focused element. | 632 // Blur the focused element. |
512 EXPECT_NO_FATAL_FAILURE(SetFocusedElement(tab_index, L"")); | 633 EXPECT_NO_FATAL_FAILURE(SetFocusedElement(tab_index, L"")); |
513 // Make sure no element is focused. | 634 // Make sure no element is focused. |
514 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L"")); | 635 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L"")); |
| 636 |
| 637 #if !defined(OS_MACOSX) |
515 // Alt+D should move the focus to the location entry. | 638 // Alt+D should move the focus to the location entry. |
516 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestAltD)); | 639 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestAccessD)); |
517 EXPECT_TRUE(IsViewFocused(VIEW_ID_LOCATION_BAR)); | 640 EXPECT_TRUE(IsViewFocused(VIEW_ID_LOCATION_BAR)); |
518 // No element should be focused, as Alt+D was handled by the browser. | 641 // No element should be focused, as Alt+D was handled by the browser. |
519 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L"")); | 642 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L"")); |
520 | 643 |
521 // Move the focus back to the web page. | 644 // Move the focus back to the web page. |
522 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER)); | 645 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER)); |
523 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW)); | 646 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW)); |
524 | 647 |
525 // Make sure no element is focused. | 648 // Make sure no element is focused. |
526 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L"")); | 649 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L"")); |
| 650 #endif |
| 651 |
527 // If the keydown event is suppressed, then Alt+D should be handled as an | 652 // If the keydown event is suppressed, then Alt+D should be handled as an |
528 // accesskey rather than an accelerator key. Activation of an accesskey is not | 653 // accesskey rather than an accelerator key. Activation of an accesskey is not |
529 // a part of the default action of the key event, so it should not be | 654 // a part of the default action of the key event, so it should not be |
530 // suppressed at all. | 655 // suppressed at all. |
531 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestAltDSuppress)); | 656 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestAccessDSuppress)); |
532 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW)); | 657 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW)); |
533 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L"D")); | 658 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L"D")); |
534 | 659 |
535 // Blur the focused element. | 660 // Blur the focused element. |
536 EXPECT_NO_FATAL_FAILURE(SetFocusedElement(tab_index, L"")); | 661 EXPECT_NO_FATAL_FAILURE(SetFocusedElement(tab_index, L"")); |
537 // Make sure no element is focused. | 662 // Make sure no element is focused. |
538 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L"")); | 663 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L"")); |
539 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestAlt1)); | 664 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestAccess1)); |
540 #if defined(TOOLKIT_GTK) | 665 #if defined(TOOLKIT_GTK) |
541 // On GTK, alt-0..9 are assigned as tab selection accelerators, so they can | 666 // On GTK, alt-0..9 are assigned as tab selection accelerators, so they can |
542 // not be used as accesskeys. | 667 // not be used as accesskeys. |
543 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L"")); | 668 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L"")); |
544 #elif defined(OS_WIN) | 669 #else |
545 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L"1")); | 670 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L"1")); |
546 #endif | 671 #endif |
547 } | 672 } |
548 | 673 |
549 IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, ReservedAccelerators) { | 674 IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, ReservedAccelerators) { |
550 HTTPTestServer* server = StartHTTPServer(); | 675 HTTPTestServer* server = StartHTTPServer(); |
| 676 ASSERT_TRUE(server); |
551 | 677 |
| 678 BringBrowserWindowToFront(); |
552 GURL url = server->TestServerPage(kTestingPage); | 679 GURL url = server->TestServerPage(kTestingPage); |
553 ui_test_utils::NavigateToURL(browser(), url); | 680 ui_test_utils::NavigateToURL(browser(), url); |
554 | 681 |
555 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER)); | 682 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER)); |
556 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW)); | 683 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW)); |
557 | 684 |
558 #if defined(OS_WIN) | 685 #if defined(OS_WIN) || defined(TOOLKIT_VIEWS) |
559 static const KeyEventTestData kTestCtrlT = { | 686 static const KeyEventTestData kTestCtrlT = { |
560 base::VKEY_T, true, false, false, | 687 base::VKEY_T, true, false, false, false, |
561 true, false, false, false, 1, | 688 true, false, false, false, 1, |
562 { "D 17 0 true false false" } | 689 { "D 17 0 true false false false" } |
563 }; | 690 }; |
564 | 691 |
565 ASSERT_EQ(1, browser()->tab_count()); | 692 ASSERT_EQ(1, browser()->tab_count()); |
566 // Press Ctrl+T, which will open a new tab. | 693 // Press Ctrl+T, which will open a new tab. |
567 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(0, kTestCtrlT)); | 694 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(0, kTestCtrlT)); |
568 EXPECT_EQ(2, browser()->tab_count()); | 695 EXPECT_EQ(2, browser()->tab_count()); |
569 browser()->SelectNumberedTab(0); | 696 browser()->SelectNumberedTab(0); |
570 ASSERT_EQ(0, browser()->selected_index()); | 697 ASSERT_EQ(0, browser()->selected_index()); |
571 | 698 |
572 int result_length; | 699 int result_length; |
573 ASSERT_NO_FATAL_FAILURE(GetResultLength(0, &result_length)); | 700 ASSERT_NO_FATAL_FAILURE(GetResultLength(0, &result_length)); |
574 EXPECT_EQ(1, result_length); | 701 EXPECT_EQ(1, result_length); |
575 | 702 |
576 // Reserved accelerators can't be suppressed. | 703 // Reserved accelerators can't be suppressed. |
577 ASSERT_NO_FATAL_FAILURE(SuppressAllEvents(0, true)); | 704 ASSERT_NO_FATAL_FAILURE(SuppressAllEvents(0, true)); |
578 // Press Ctrl+W, which will close the tab. | 705 // Press Ctrl+W, which will close the tab. |
579 ASSERT_NO_FATAL_FAILURE(SendKey(base::VKEY_W, true, false, false)); | 706 ASSERT_NO_FATAL_FAILURE(SendKey(base::VKEY_W, true, false, false, false)); |
580 EXPECT_EQ(1, browser()->tab_count()); | 707 EXPECT_EQ(1, browser()->tab_count()); |
| 708 #elif defined(OS_MACOSX) |
| 709 static const KeyEventTestData kTestCmdT = { |
| 710 base::VKEY_T, false, false, false, true, |
| 711 true, false, false, false, 1, |
| 712 { "D 91 0 false false false true" } |
| 713 }; |
581 | 714 |
| 715 ASSERT_EQ(1, browser()->tab_count()); |
| 716 // Press Cmd+T, which will open a new tab. |
| 717 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(0, kTestCmdT)); |
| 718 EXPECT_EQ(2, browser()->tab_count()); |
| 719 browser()->SelectNumberedTab(0); |
| 720 ASSERT_EQ(0, browser()->selected_index()); |
| 721 |
| 722 int result_length; |
| 723 ASSERT_NO_FATAL_FAILURE(GetResultLength(0, &result_length)); |
| 724 EXPECT_EQ(1, result_length); |
| 725 |
| 726 // Reserved accelerators can't be suppressed. |
| 727 ASSERT_NO_FATAL_FAILURE(SuppressAllEvents(0, true)); |
| 728 // Press Cmd+W, which will close the tab. |
| 729 ASSERT_NO_FATAL_FAILURE(SendKey(base::VKEY_W, false, false, false, true)); |
| 730 EXPECT_EQ(1, browser()->tab_count()); |
582 #elif defined(TOOLKIT_GTK) | 731 #elif defined(TOOLKIT_GTK) |
583 // Ctrl-[a-z] are not treated as reserved accelerators on GTK. | 732 // Ctrl-[a-z] are not treated as reserved accelerators on GTK. |
584 static const KeyEventTestData kTestCtrlT = { | 733 static const KeyEventTestData kTestCtrlT = { |
585 base::VKEY_T, true, false, false, | 734 base::VKEY_T, true, false, false, false, |
586 false, false, false, false, 2, | 735 false, false, false, false, 2, |
587 { "D 17 0 true false false", | 736 { "D 17 0 true false false false", |
588 "D 84 0 true false false" } | 737 "D 84 0 true false false false" } |
589 }; | 738 }; |
590 | 739 |
591 static const KeyEventTestData kTestCtrlPageDown = { | 740 static const KeyEventTestData kTestCtrlPageDown = { |
592 base::VKEY_NEXT, true, false, false, | 741 base::VKEY_NEXT, true, false, false, false, |
593 true, false, false, false, 1, | 742 true, false, false, false, 1, |
594 { "D 17 0 true false false" } | 743 { "D 17 0 true false false false" } |
595 }; | 744 }; |
596 | 745 |
597 static const KeyEventTestData kTestCtrlTab = { | 746 static const KeyEventTestData kTestCtrlTab = { |
598 base::VKEY_TAB, true, false, false, | 747 base::VKEY_TAB, true, false, false, false, |
599 true, false, false, false, 1, | 748 true, false, false, false, 1, |
600 { "D 17 0 true false false" } | 749 { "D 17 0 true false false false" } |
601 }; | 750 }; |
602 | 751 |
603 static const KeyEventTestData kTestCtrlTBlocked = { | 752 static const KeyEventTestData kTestCtrlTBlocked = { |
604 base::VKEY_T, true, false, false, | 753 base::VKEY_T, true, false, false, false, |
605 true, false, false, false, 4, | 754 true, false, false, false, 4, |
606 { "D 17 0 true false false", | 755 { "D 17 0 true false false false", |
607 "D 84 0 true false false", | 756 "D 84 0 true false false false", |
608 "U 84 0 true false false", | 757 "U 84 0 true false false false", |
609 "U 17 0 true false false" } | 758 "U 17 0 true false false false" } |
610 }; | 759 }; |
611 | 760 |
612 static const KeyEventTestData kTestCtrlWBlocked = { | 761 static const KeyEventTestData kTestCtrlWBlocked = { |
613 base::VKEY_W, true, false, false, | 762 base::VKEY_W, true, false, false, false, |
614 true, false, false, false, 4, | 763 true, false, false, false, 4, |
615 { "D 17 0 true false false", | 764 { "D 17 0 true false false false", |
616 "D 87 0 true false false", | 765 "D 87 0 true false false false", |
617 "U 87 0 true false false", | 766 "U 87 0 true false false false", |
618 "U 17 0 true false false" } | 767 "U 17 0 true false false false" } |
619 }; | 768 }; |
620 | 769 |
621 ASSERT_EQ(1, browser()->tab_count()); | 770 ASSERT_EQ(1, browser()->tab_count()); |
622 | 771 |
623 // Ctrl+T should be blockable. | 772 // Ctrl+T should be blockable. |
624 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(0, kTestCtrlTBlocked)); | 773 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(0, kTestCtrlTBlocked)); |
625 ASSERT_EQ(1, browser()->tab_count()); | 774 ASSERT_EQ(1, browser()->tab_count()); |
626 | 775 |
627 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(0, kTestCtrlT)); | 776 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(0, kTestCtrlT)); |
628 ASSERT_EQ(2, browser()->tab_count()); | 777 ASSERT_EQ(2, browser()->tab_count()); |
(...skipping 11 matching lines...) Expand all Loading... |
640 ASSERT_EQ(1, browser()->selected_index()); | 789 ASSERT_EQ(1, browser()->selected_index()); |
641 | 790 |
642 // Ctrl+W should be blockable. | 791 // Ctrl+W should be blockable. |
643 browser()->SelectNumberedTab(0); | 792 browser()->SelectNumberedTab(0); |
644 ASSERT_EQ(0, browser()->selected_index()); | 793 ASSERT_EQ(0, browser()->selected_index()); |
645 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(0, kTestCtrlWBlocked)); | 794 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(0, kTestCtrlWBlocked)); |
646 ASSERT_EQ(2, browser()->tab_count()); | 795 ASSERT_EQ(2, browser()->tab_count()); |
647 | 796 |
648 // Ctrl+F4 to close the tab. | 797 // Ctrl+F4 to close the tab. |
649 ASSERT_NO_FATAL_FAILURE(SuppressAllEvents(0, true)); | 798 ASSERT_NO_FATAL_FAILURE(SuppressAllEvents(0, true)); |
650 ASSERT_NO_FATAL_FAILURE(SendKey(base::VKEY_F4, true, false, false)); | 799 ASSERT_NO_FATAL_FAILURE( SendKey(base::VKEY_F4, true, false, false, false)); |
651 ASSERT_EQ(1, browser()->tab_count()); | 800 ASSERT_EQ(1, browser()->tab_count()); |
652 #endif | 801 #endif |
653 } | 802 } |
| 803 |
| 804 #if defined(OS_MACOSX) |
| 805 IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, EditorKeyBindings) { |
| 806 static const KeyEventTestData kTestCtrlA = { |
| 807 base::VKEY_A, true, false, false, false, |
| 808 false, false, false, false, 4, |
| 809 { "D 17 0 true false false false", |
| 810 "D 65 0 true false false false", |
| 811 "U 65 0 true false false false", |
| 812 "U 17 0 true false false false" } |
| 813 }; |
| 814 |
| 815 static const KeyEventTestData kTestCtrlF = { |
| 816 base::VKEY_F, true, false, false, false, |
| 817 false, false, false, false, 4, |
| 818 { "D 17 0 true false false false", |
| 819 "D 70 0 true false false false", |
| 820 "U 70 0 true false false false", |
| 821 "U 17 0 true false false false" } |
| 822 }; |
| 823 |
| 824 static const KeyEventTestData kTestCtrlK = { |
| 825 base::VKEY_K, true, false, false, false, |
| 826 false, false, false, false, 4, |
| 827 { "D 17 0 true false false false", |
| 828 "D 75 0 true false false false", |
| 829 "U 75 0 true false false false", |
| 830 "U 17 0 true false false false" } |
| 831 }; |
| 832 |
| 833 HTTPTestServer* server = StartHTTPServer(); |
| 834 ASSERT_TRUE(server); |
| 835 |
| 836 BringBrowserWindowToFront(); |
| 837 GURL url = server->TestServerPage(kTestingPage); |
| 838 ui_test_utils::NavigateToURL(browser(), url); |
| 839 |
| 840 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER)); |
| 841 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW)); |
| 842 |
| 843 int tab_index = browser()->selected_index(); |
| 844 ASSERT_NO_FATAL_FAILURE(SetFocusedElement(tab_index, L"A")); |
| 845 ASSERT_NO_FATAL_FAILURE(SetTextBoxValue(tab_index, L"A", L"Hello")); |
| 846 // Move the caret to the beginning of the line. |
| 847 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlA)); |
| 848 // Forward one character |
| 849 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlF)); |
| 850 // Delete to the end of the line. |
| 851 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlK)); |
| 852 EXPECT_NO_FATAL_FAILURE(CheckTextBoxValue(tab_index, L"A", L"H")); |
| 853 } |
| 854 #endif |
| 855 |
| 856 IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, PageUpDownKeys) { |
| 857 static const KeyEventTestData kTestPageUp = { |
| 858 base::VKEY_PRIOR, false, false, false, false, |
| 859 false, false, false, false, 2, |
| 860 { "D 33 0 false false false false", |
| 861 "U 33 0 false false false false" } |
| 862 }; |
| 863 |
| 864 static const KeyEventTestData kTestPageDown = { |
| 865 base::VKEY_NEXT, false, false, false, false, |
| 866 false, false, false, false, 2, |
| 867 { "D 34 0 false false false false", |
| 868 "U 34 0 false false false false" } |
| 869 }; |
| 870 |
| 871 HTTPTestServer* server = StartHTTPServer(); |
| 872 ASSERT_TRUE(server); |
| 873 |
| 874 BringBrowserWindowToFront(); |
| 875 GURL url = server->TestServerPage(kTestingPage); |
| 876 ui_test_utils::NavigateToURL(browser(), url); |
| 877 |
| 878 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER)); |
| 879 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW)); |
| 880 |
| 881 int tab_index = browser()->selected_index(); |
| 882 ASSERT_NO_FATAL_FAILURE(SetFocusedElement(tab_index, L"A")); |
| 883 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestPageUp)); |
| 884 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestPageDown)); |
| 885 EXPECT_NO_FATAL_FAILURE(CheckTextBoxValue(tab_index, L"A", L"")); |
| 886 } |
OLD | NEW |