blob: 8281c825f36ee256924d8d4c7b041dc803b0464e [file] [log] [blame]
[email protected]4da3d852012-01-12 02:46:251// Copyright (c) 2012 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
7#include "base/basictypes.h"
[email protected]21abcc742009-10-23 02:52:068#include "base/logging.h"
9#include "base/message_loop.h"
[email protected]1870d5cf2011-05-12 01:55:4010#include "base/stringprintf.h"
[email protected]21abcc742009-10-23 02:52:0611#include "base/utf_string_conversions.h"
12#include "base/values.h"
[email protected]2ad4a902010-11-17 06:05:1313#include "chrome/browser/ui/browser.h"
[email protected]432115822011-07-10 15:52:2714#include "chrome/common/chrome_notification_types.h"
[email protected]21abcc742009-10-23 02:52:0615#include "chrome/common/chrome_paths.h"
[email protected]af44e7fb2011-07-29 18:32:3216#include "chrome/test/base/in_process_browser_test.h"
17#include "chrome/test/base/ui_test_utils.h"
[email protected]5de634712011-03-02 00:20:1918#include "content/browser/renderer_host/render_view_host.h"
19#include "content/browser/renderer_host/render_widget_host_view.h"
[email protected]766a7082012-02-03 23:39:1520#include "content/public/browser/dom_operation_notification_details.h"
[email protected]6c2381d2011-10-19 02:52:5321#include "content/public/browser/notification_registrar.h"
[email protected]ad50def52011-10-19 23:17:0722#include "content/public/browser/notification_service.h"
[email protected]6acde6352012-01-04 16:52:2023#include "content/public/browser/web_contents.h"
[email protected]8643e6d2012-01-18 20:26:1024#include "content/public/browser/web_contents_view.h"
[email protected]3985ba82010-07-29 21:44:1225#include "net/test/test_server.h"
[email protected]b6d81262011-01-13 17:36:0926#include "ui/base/keycodes/keyboard_codes.h"
[email protected]21abcc742009-10-23 02:52:0627
[email protected]766a7082012-02-03 23:39:1528using content::DomOperationNotificationDetails;
[email protected]c5eed492012-01-04 17:07:5029using content::NavigationController;
30
[email protected]21abcc742009-10-23 02:52:0631namespace {
32
[email protected]f72a1cc2010-04-30 07:17:3033const char kTestingPage[] = "files/keyevents_test.html";
[email protected]21abcc742009-10-23 02:52:0634const wchar_t kSuppressEventJS[] =
35 L"window.domAutomationController.send(setDefaultAction('%ls', %ls));";
36const wchar_t kGetResultJS[] =
37 L"window.domAutomationController.send(keyEventResult[%d]);";
38const wchar_t kGetResultLengthJS[] =
39 L"window.domAutomationController.send(keyEventResult.length);";
40const wchar_t kGetFocusedElementJS[] =
41 L"window.domAutomationController.send(focusedElement);";
42const wchar_t kSetFocusedElementJS[] =
43 L"window.domAutomationController.send(setFocusedElement('%ls'));";
44const wchar_t kGetTextBoxValueJS[] =
45 L"window.domAutomationController.send("
46 L"document.getElementById('%ls').value);";
[email protected]853300a82010-07-27 21:17:5747const wchar_t kSetTextBoxValueJS[] =
48 L"window.domAutomationController.send("
49 L"document.getElementById('%ls').value = '%ls');";
[email protected]21abcc742009-10-23 02:52:0650const wchar_t kStartTestJS[] =
[email protected]853300a82010-07-27 21:17:5751 L"window.domAutomationController.send(startTest(%d));";
[email protected]21abcc742009-10-23 02:52:0652
53// Maximum lenght of the result array in KeyEventTestData structure.
54const size_t kMaxResultLength = 10;
55
56// A structure holding test data of a keyboard event.
57// Each keyboard event may generate multiple result strings representing
58// the result of keydown, keypress, keyup and textInput events.
59// For keydown, keypress and keyup events, the format of the result string is:
[email protected]853300a82010-07-27 21:17:5760// <type> <keyCode> <charCode> <ctrlKey> <shiftKey> <altKey> <commandKey>
[email protected]21abcc742009-10-23 02:52:0661// where <type> may be 'D' (keydown), 'P' (keypress) or 'U' (keyup).
[email protected]853300a82010-07-27 21:17:5762// <ctrlKey>, <shiftKey> <altKey> and <commandKey> are boolean value indicating
63// the state of corresponding modifier key.
[email protected]21abcc742009-10-23 02:52:0664// For textInput event, the format is: T <text>, where <text> is the text to be
65// input.
66// Please refer to chrome/test/data/keyevents_test.html for details.
67struct KeyEventTestData {
[email protected]b6d81262011-01-13 17:36:0968 ui::KeyboardCode key;
[email protected]21abcc742009-10-23 02:52:0669 bool ctrl;
70 bool shift;
71 bool alt;
[email protected]853300a82010-07-27 21:17:5772 bool command;
[email protected]21abcc742009-10-23 02:52:0673
74 bool suppress_keydown;
75 bool suppress_keypress;
76 bool suppress_keyup;
77 bool suppress_textinput;
78
79 int result_length;
80 const char* const result[kMaxResultLength];
81};
82
83const wchar_t* GetBoolString(bool value) {
84 return value ? L"true" : L"false";
85}
86
87// A class to help wait for the finish of a key event test.
[email protected]6c2381d2011-10-19 02:52:5388class TestFinishObserver : public content::NotificationObserver {
[email protected]21abcc742009-10-23 02:52:0689 public:
90 explicit TestFinishObserver(RenderViewHost* render_view_host)
91 : finished_(false), waiting_(false) {
[email protected]766a7082012-02-03 23:39:1592 registrar_.Add(this, content::NOTIFICATION_DOM_OPERATION_RESPONSE,
[email protected]6c2381d2011-10-19 02:52:5393 content::Source<RenderViewHost>(render_view_host));
[email protected]21abcc742009-10-23 02:52:0694 }
95
96 bool WaitForFinish() {
97 if (!finished_) {
98 waiting_ = true;
99 ui_test_utils::RunMessageLoop();
100 waiting_ = false;
101 }
102 return finished_;
103 }
104
[email protected]432115822011-07-10 15:52:27105 virtual void Observe(int type,
[email protected]6c2381d2011-10-19 02:52:53106 const content::NotificationSource& source,
107 const content::NotificationDetails& details) {
[email protected]766a7082012-02-03 23:39:15108 DCHECK(type == content::NOTIFICATION_DOM_OPERATION_RESPONSE);
[email protected]6c2381d2011-10-19 02:52:53109 content::Details<DomOperationNotificationDetails> dom_op_details(details);
[email protected]21abcc742009-10-23 02:52:06110 // We might receive responses for other script execution, but we only
111 // care about the test finished message.
[email protected]766a7082012-02-03 23:39:15112 if (dom_op_details->json == "\"FINISHED\"") {
[email protected]21abcc742009-10-23 02:52:06113 finished_ = true;
114 if (waiting_)
115 MessageLoopForUI::current()->Quit();
116 }
117 }
118
119 private:
120 bool finished_;
121 bool waiting_;
[email protected]6c2381d2011-10-19 02:52:53122 content::NotificationRegistrar registrar_;
[email protected]21abcc742009-10-23 02:52:06123
124 DISALLOW_COPY_AND_ASSIGN(TestFinishObserver);
125};
126
127class BrowserKeyEventsTest : public InProcessBrowserTest {
128 public:
129 BrowserKeyEventsTest() {
130 set_show_window(true);
131 EnableDOMAutomation();
132 }
133
[email protected]21abcc742009-10-23 02:52:06134 bool IsViewFocused(ViewID vid) {
135 return ui_test_utils::IsViewFocused(browser(), vid);
136 }
137
138 void ClickOnView(ViewID vid) {
139 ui_test_utils::ClickOnView(browser(), vid);
140 }
141
142 // Set the suppress flag of an event specified by |type|. If |suppress| is
143 // true then the web page will suppress all events with |type|. Following
144 // event types are supported: keydown, keypress, keyup and textInput.
145 void SuppressEventByType(int tab_index, const wchar_t* type, bool suppress) {
146 ASSERT_LT(tab_index, browser()->tab_count());
147 bool actual;
148 ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool(
[email protected]6acde6352012-01-04 16:52:20149 browser()->GetWebContentsAt(tab_index)->GetRenderViewHost(),
[email protected]21abcc742009-10-23 02:52:06150 L"",
[email protected]1870d5cf2011-05-12 01:55:40151 base::StringPrintf(kSuppressEventJS, type, GetBoolString(!suppress)),
[email protected]21abcc742009-10-23 02:52:06152 &actual));
153 ASSERT_EQ(!suppress, actual);
154 }
155
156 void SuppressEvents(int tab_index, bool keydown, bool keypress,
157 bool keyup, bool textinput) {
158 ASSERT_NO_FATAL_FAILURE(
159 SuppressEventByType(tab_index, L"keydown", keydown));
160 ASSERT_NO_FATAL_FAILURE(
161 SuppressEventByType(tab_index, L"keypress", keypress));
162 ASSERT_NO_FATAL_FAILURE(
163 SuppressEventByType(tab_index, L"keyup", keyup));
164 ASSERT_NO_FATAL_FAILURE(
165 SuppressEventByType(tab_index, L"textInput", textinput));
166 }
167
168 void SuppressAllEvents(int tab_index, bool suppress) {
169 SuppressEvents(tab_index, suppress, suppress, suppress, suppress);
170 }
171
172 void GetResultLength(int tab_index, int* length) {
173 ASSERT_LT(tab_index, browser()->tab_count());
174 ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractInt(
[email protected]6acde6352012-01-04 16:52:20175 browser()->GetWebContentsAt(tab_index)->GetRenderViewHost(),
[email protected]21abcc742009-10-23 02:52:06176 L"", kGetResultLengthJS, length));
177 }
178
179 void CheckResult(int tab_index, int length, const char* const result[]) {
180 ASSERT_LT(tab_index, browser()->tab_count());
181 int actual_length;
182 ASSERT_NO_FATAL_FAILURE(GetResultLength(tab_index, &actual_length));
183 ASSERT_GE(actual_length, length);
184 for (int i = 0; i < actual_length; ++i) {
185 std::string actual;
186 ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractString(
[email protected]6acde6352012-01-04 16:52:20187 browser()->GetWebContentsAt(tab_index)->GetRenderViewHost(),
[email protected]1870d5cf2011-05-12 01:55:40188 L"", base::StringPrintf(kGetResultJS, i), &actual));
[email protected]21abcc742009-10-23 02:52:06189
190 // If more events were received than expected, then the additional events
191 // must be keyup events.
192 if (i < length)
193 ASSERT_STREQ(result[i], actual.c_str());
194 else
195 ASSERT_EQ('U', actual[0]);
196 }
197 }
198
199 void CheckFocusedElement(int tab_index, const wchar_t* focused) {
200 ASSERT_LT(tab_index, browser()->tab_count());
201 std::string actual;
202 ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractString(
[email protected]6acde6352012-01-04 16:52:20203 browser()->GetWebContentsAt(tab_index)->GetRenderViewHost(),
[email protected]21abcc742009-10-23 02:52:06204 L"", kGetFocusedElementJS, &actual));
205 ASSERT_EQ(WideToUTF8(focused), actual);
206 }
207
208 void SetFocusedElement(int tab_index, const wchar_t* focused) {
209 ASSERT_LT(tab_index, browser()->tab_count());
210 bool actual;
211 ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool(
[email protected]6acde6352012-01-04 16:52:20212 browser()->GetWebContentsAt(tab_index)->GetRenderViewHost(),
[email protected]21abcc742009-10-23 02:52:06213 L"",
[email protected]1870d5cf2011-05-12 01:55:40214 base::StringPrintf(kSetFocusedElementJS, focused),
[email protected]21abcc742009-10-23 02:52:06215 &actual));
216 ASSERT_TRUE(actual);
217 }
218
219 void CheckTextBoxValue(int tab_index, const wchar_t* id,
220 const wchar_t* value) {
221 ASSERT_LT(tab_index, browser()->tab_count());
222 std::string actual;
223 ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractString(
[email protected]6acde6352012-01-04 16:52:20224 browser()->GetWebContentsAt(tab_index)->GetRenderViewHost(),
[email protected]21abcc742009-10-23 02:52:06225 L"",
[email protected]1870d5cf2011-05-12 01:55:40226 base::StringPrintf(kGetTextBoxValueJS, id),
[email protected]21abcc742009-10-23 02:52:06227 &actual));
228 ASSERT_EQ(WideToUTF8(value), actual);
229 }
230
[email protected]853300a82010-07-27 21:17:57231 void SetTextBoxValue(int tab_index, const wchar_t* id,
232 const wchar_t* value) {
233 ASSERT_LT(tab_index, browser()->tab_count());
234 std::string actual;
235 ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractString(
[email protected]6acde6352012-01-04 16:52:20236 browser()->GetWebContentsAt(tab_index)->GetRenderViewHost(),
[email protected]853300a82010-07-27 21:17:57237 L"",
[email protected]1870d5cf2011-05-12 01:55:40238 base::StringPrintf(kSetTextBoxValueJS, id, value),
[email protected]853300a82010-07-27 21:17:57239 &actual));
240 ASSERT_EQ(WideToUTF8(value), actual);
241 }
242
243 void StartTest(int tab_index, int result_length) {
[email protected]21abcc742009-10-23 02:52:06244 ASSERT_LT(tab_index, browser()->tab_count());
245 bool actual;
246 ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool(
[email protected]6acde6352012-01-04 16:52:20247 browser()->GetWebContentsAt(tab_index)->GetRenderViewHost(),
[email protected]1870d5cf2011-05-12 01:55:40248 L"", base::StringPrintf(kStartTestJS, result_length), &actual));
[email protected]21abcc742009-10-23 02:52:06249 ASSERT_TRUE(actual);
250 }
251
252 void TestKeyEvent(int tab_index, const KeyEventTestData& test) {
253 ASSERT_LT(tab_index, browser()->tab_count());
[email protected]1ea49d52011-04-12 17:44:44254 ASSERT_EQ(tab_index, browser()->active_index());
[email protected]21abcc742009-10-23 02:52:06255
256 // Inform our testing web page that we are about to start testing a key
257 // event.
[email protected]853300a82010-07-27 21:17:57258 ASSERT_NO_FATAL_FAILURE(StartTest(tab_index, test.result_length));
[email protected]21abcc742009-10-23 02:52:06259 ASSERT_NO_FATAL_FAILURE(SuppressEvents(
260 tab_index, test.suppress_keydown, test.suppress_keypress,
261 test.suppress_keyup, test.suppress_textinput));
262
263 // We need to create a finish observer before sending the key event,
264 // because the test finished message might be arrived before returning
[email protected]a6e602f2010-09-28 22:28:30265 // from the SendKeyPressSync() method.
[email protected]21abcc742009-10-23 02:52:06266 TestFinishObserver finish_observer(
[email protected]6acde6352012-01-04 16:52:20267 browser()->GetWebContentsAt(tab_index)->GetRenderViewHost());
[email protected]21abcc742009-10-23 02:52:06268
[email protected]a6e602f2010-09-28 22:28:30269 ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
270 browser(), test.key, test.ctrl, test.shift, test.alt, test.command));
[email protected]21abcc742009-10-23 02:52:06271 ASSERT_TRUE(finish_observer.WaitForFinish());
272 ASSERT_NO_FATAL_FAILURE(CheckResult(
273 tab_index, test.result_length, test.result));
274 }
275
276 std::string GetTestDataDescription(const KeyEventTestData& data) {
[email protected]1870d5cf2011-05-12 01:55:40277 std::string desc = base::StringPrintf(
[email protected]853300a82010-07-27 21:17:57278 " VKEY:0x%02x, ctrl:%d, shift:%d, alt:%d, command:%d\n"
[email protected]21abcc742009-10-23 02:52:06279 " Suppress: keydown:%d, keypress:%d, keyup:%d, textInput:%d\n"
280 " Expected results(%d):\n",
[email protected]853300a82010-07-27 21:17:57281 data.key, data.ctrl, data.shift, data.alt, data.command,
[email protected]21abcc742009-10-23 02:52:06282 data.suppress_keydown, data.suppress_keypress, data.suppress_keyup,
283 data.suppress_textinput, data.result_length);
284 for (int i = 0; i < data.result_length; ++i) {
285 desc.append(" ");
286 desc.append(data.result[i]);
287 desc.append("\n");
288 }
289 return desc;
290 }
291};
292
[email protected]cb931932011-05-03 19:57:33293#if defined(OS_MACOSX)
[email protected]92c01742011-05-04 23:35:21294// http://crbug.com/81451
295IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, DISABLED_NormalKeyEvents) {
[email protected]cb931932011-05-03 19:57:33296#else
[email protected]853300a82010-07-27 21:17:57297IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, NormalKeyEvents) {
[email protected]cb931932011-05-03 19:57:33298#endif
299
[email protected]21abcc742009-10-23 02:52:06300 static const KeyEventTestData kTestNoInput[] = {
301 // a
[email protected]b6d81262011-01-13 17:36:09302 { ui::VKEY_A, false, false, false, false,
[email protected]21abcc742009-10-23 02:52:06303 false, false, false, false, 3,
[email protected]853300a82010-07-27 21:17:57304 { "D 65 0 false false false false",
305 "P 97 97 false false false false",
306 "U 65 0 false false false false" } },
[email protected]21abcc742009-10-23 02:52:06307 // shift-a
[email protected]b6d81262011-01-13 17:36:09308 { ui::VKEY_A, false, true, false, false,
[email protected]21abcc742009-10-23 02:52:06309 false, false, false, false, 5,
[email protected]853300a82010-07-27 21:17:57310 { "D 16 0 false true false false",
311 "D 65 0 false true false false",
312 "P 65 65 false true false false",
313 "U 65 0 false true false false",
314 "U 16 0 false true false false" } },
[email protected]21abcc742009-10-23 02:52:06315 // a, suppress keydown
[email protected]b6d81262011-01-13 17:36:09316 { ui::VKEY_A, false, false, false, false,
[email protected]21abcc742009-10-23 02:52:06317 true, false, false, false, 2,
[email protected]853300a82010-07-27 21:17:57318 { "D 65 0 false false false false",
319 "U 65 0 false false false false" } },
[email protected]21abcc742009-10-23 02:52:06320 };
321
322 static const KeyEventTestData kTestWithInput[] = {
323 // a
[email protected]b6d81262011-01-13 17:36:09324 { ui::VKEY_A, false, false, false, false,
[email protected]21abcc742009-10-23 02:52:06325 false, false, false, false, 4,
[email protected]853300a82010-07-27 21:17:57326 { "D 65 0 false false false false",
327 "P 97 97 false false false false",
[email protected]21abcc742009-10-23 02:52:06328 "T a",
[email protected]853300a82010-07-27 21:17:57329 "U 65 0 false false false false" } },
[email protected]21abcc742009-10-23 02:52:06330 // shift-a
[email protected]b6d81262011-01-13 17:36:09331 { ui::VKEY_A, false, true, false, false,
[email protected]21abcc742009-10-23 02:52:06332 false, false, false, false, 6,
[email protected]853300a82010-07-27 21:17:57333 { "D 16 0 false true false false",
334 "D 65 0 false true false false",
335 "P 65 65 false true false false",
[email protected]21abcc742009-10-23 02:52:06336 "T A",
[email protected]853300a82010-07-27 21:17:57337 "U 65 0 false true false false",
338 "U 16 0 false true false false" } },
[email protected]21abcc742009-10-23 02:52:06339 // a, suppress keydown
[email protected]b6d81262011-01-13 17:36:09340 { ui::VKEY_A, false, false, false, false,
[email protected]21abcc742009-10-23 02:52:06341 true, false, false, false, 2,
[email protected]853300a82010-07-27 21:17:57342 { "D 65 0 false false false false",
343 "U 65 0 false false false false" } },
[email protected]21abcc742009-10-23 02:52:06344 // a, suppress keypress
[email protected]b6d81262011-01-13 17:36:09345 { ui::VKEY_A, false, false, false, false,
[email protected]21abcc742009-10-23 02:52:06346 false, true, false, false, 3,
[email protected]853300a82010-07-27 21:17:57347 { "D 65 0 false false false false",
348 "P 97 97 false false false false",
349 "U 65 0 false false false false" } },
[email protected]21abcc742009-10-23 02:52:06350 // a, suppress textInput
[email protected]b6d81262011-01-13 17:36:09351 { ui::VKEY_A, false, false, false, false,
[email protected]21abcc742009-10-23 02:52:06352 false, false, false, true, 4,
[email protected]853300a82010-07-27 21:17:57353 { "D 65 0 false false false false",
354 "P 97 97 false false false false",
[email protected]21abcc742009-10-23 02:52:06355 "T a",
[email protected]853300a82010-07-27 21:17:57356 "U 65 0 false false false false" } },
[email protected]21abcc742009-10-23 02:52:06357 };
358
[email protected]95409e12010-08-17 20:07:11359 ASSERT_TRUE(test_server()->Start());
[email protected]21abcc742009-10-23 02:52:06360
[email protected]a6e602f2010-09-28 22:28:30361 ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
[email protected]95409e12010-08-17 20:07:11362 GURL url = test_server()->GetURL(kTestingPage);
[email protected]21abcc742009-10-23 02:52:06363 ui_test_utils::NavigateToURL(browser(), url);
364
365 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
366 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
367
[email protected]1ea49d52011-04-12 17:44:44368 int tab_index = browser()->active_index();
[email protected]21abcc742009-10-23 02:52:06369 for (size_t i = 0; i < arraysize(kTestNoInput); ++i) {
370 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestNoInput[i]))
371 << "kTestNoInput[" << i << "] failed:\n"
372 << GetTestDataDescription(kTestNoInput[i]);
373 }
374
[email protected]853300a82010-07-27 21:17:57375 // Input in normal text box.
[email protected]21abcc742009-10-23 02:52:06376 ASSERT_NO_FATAL_FAILURE(SetFocusedElement(tab_index, L"A"));
377 for (size_t i = 0; i < arraysize(kTestWithInput); ++i) {
378 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestWithInput[i]))
[email protected]853300a82010-07-27 21:17:57379 << "kTestWithInput[" << i << "] in text box failed:\n"
[email protected]21abcc742009-10-23 02:52:06380 << GetTestDataDescription(kTestWithInput[i]);
381 }
[email protected]21abcc742009-10-23 02:52:06382 EXPECT_NO_FATAL_FAILURE(CheckTextBoxValue(tab_index, L"A", L"aA"));
[email protected]853300a82010-07-27 21:17:57383
384 // Input in password box.
385 ASSERT_NO_FATAL_FAILURE(SetFocusedElement(tab_index, L"B"));
386 for (size_t i = 0; i < arraysize(kTestWithInput); ++i) {
387 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestWithInput[i]))
388 << "kTestWithInput[" << i << "] in password box failed:\n"
389 << GetTestDataDescription(kTestWithInput[i]);
390 }
391 EXPECT_NO_FATAL_FAILURE(CheckTextBoxValue(tab_index, L"B", L"aA"));
[email protected]21abcc742009-10-23 02:52:06392}
393
[email protected]853300a82010-07-27 21:17:57394#if defined(OS_WIN) || defined(OS_LINUX)
[email protected]21abcc742009-10-23 02:52:06395IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, CtrlKeyEvents) {
396 static const KeyEventTestData kTestCtrlF = {
[email protected]b6d81262011-01-13 17:36:09397 ui::VKEY_F, true, false, false, false,
[email protected]21abcc742009-10-23 02:52:06398 false, false, false, false, 2,
[email protected]853300a82010-07-27 21:17:57399 { "D 17 0 true false false false",
400 "D 70 0 true false false false" }
[email protected]21abcc742009-10-23 02:52:06401 };
402
403 static const KeyEventTestData kTestCtrlFSuppressKeyDown = {
[email protected]b6d81262011-01-13 17:36:09404 ui::VKEY_F, true, false, false, false,
[email protected]21abcc742009-10-23 02:52:06405 true, false, false, false, 4,
[email protected]853300a82010-07-27 21:17:57406 { "D 17 0 true false false false",
407 "D 70 0 true false false false",
408 "U 70 0 true false false false",
409 "U 17 0 true false false false" }
[email protected]21abcc742009-10-23 02:52:06410 };
411
412 // Ctrl+Z doesn't bind to any accelerators, which then should generate a
413 // keypress event with charCode=26.
414 static const KeyEventTestData kTestCtrlZ = {
[email protected]b6d81262011-01-13 17:36:09415 ui::VKEY_Z, true, false, false, false,
[email protected]21abcc742009-10-23 02:52:06416 false, false, false, false, 5,
[email protected]853300a82010-07-27 21:17:57417 { "D 17 0 true false false false",
418 "D 90 0 true false false false",
419 "P 26 26 true false false false",
420 "U 90 0 true false false false",
421 "U 17 0 true false false false" }
[email protected]21abcc742009-10-23 02:52:06422 };
423
424 static const KeyEventTestData kTestCtrlZSuppressKeyDown = {
[email protected]b6d81262011-01-13 17:36:09425 ui::VKEY_Z, true, false, false, false,
[email protected]21abcc742009-10-23 02:52:06426 true, false, false, false, 4,
[email protected]853300a82010-07-27 21:17:57427 { "D 17 0 true false false false",
428 "D 90 0 true false false false",
429 "U 90 0 true false false false",
430 "U 17 0 true false false false" }
[email protected]21abcc742009-10-23 02:52:06431 };
432
433 // Ctrl+Enter shall generate a keypress event with charCode=10 (LF).
434 static const KeyEventTestData kTestCtrlEnter = {
[email protected]b6d81262011-01-13 17:36:09435 ui::VKEY_RETURN, true, false, false, false,
[email protected]21abcc742009-10-23 02:52:06436 false, false, false, false, 5,
[email protected]853300a82010-07-27 21:17:57437 { "D 17 0 true false false false",
438 "D 13 0 true false false false",
439 "P 10 10 true false false false",
440 "U 13 0 true false false false",
441 "U 17 0 true false false false" }
[email protected]21abcc742009-10-23 02:52:06442 };
443
[email protected]95409e12010-08-17 20:07:11444 ASSERT_TRUE(test_server()->Start());
[email protected]21abcc742009-10-23 02:52:06445
[email protected]a6e602f2010-09-28 22:28:30446 ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
[email protected]95409e12010-08-17 20:07:11447 GURL url = test_server()->GetURL(kTestingPage);
[email protected]21abcc742009-10-23 02:52:06448 ui_test_utils::NavigateToURL(browser(), url);
449
450 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
451 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
452
[email protected]1ea49d52011-04-12 17:44:44453 int tab_index = browser()->active_index();
[email protected]21abcc742009-10-23 02:52:06454 // Press Ctrl+F, which will make the Find box open and request focus.
455 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlF));
456 EXPECT_TRUE(IsViewFocused(VIEW_ID_FIND_IN_PAGE_TEXT_FIELD));
457
458 // Press Escape to close the Find box and move the focus back to the web page.
[email protected]a6e602f2010-09-28 22:28:30459 ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
[email protected]b6d81262011-01-13 17:36:09460 browser(), ui::VKEY_ESCAPE, false, false, false, false));
[email protected]21abcc742009-10-23 02:52:06461 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
462
463 // Press Ctrl+F with keydown suppressed shall not open the find box.
464 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlFSuppressKeyDown));
465 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
466
467 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlZ));
468 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlZSuppressKeyDown));
469 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlEnter));
470}
[email protected]853300a82010-07-27 21:17:57471#elif defined(OS_MACOSX)
[email protected]cb931932011-05-03 19:57:33472// http://crbug.com/81451
[email protected]4d2451652012-02-14 23:54:26473IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, DISABLED_CommandKeyEvents) {
[email protected]853300a82010-07-27 21:17:57474 static const KeyEventTestData kTestCmdF = {
[email protected]b6d81262011-01-13 17:36:09475 ui::VKEY_F, false, false, false, true,
[email protected]853300a82010-07-27 21:17:57476 false, false, false, false, 2,
477 { "D 91 0 false false false true",
478 "D 70 0 false false false true" }
479 };
480
481 // On Mac we don't send key up events when command modifier is down.
482 static const KeyEventTestData kTestCmdFSuppressKeyDown = {
[email protected]b6d81262011-01-13 17:36:09483 ui::VKEY_F, false, false, false, true,
[email protected]853300a82010-07-27 21:17:57484 true, false, false, false, 3,
485 { "D 91 0 false false false true",
486 "D 70 0 false false false true",
487 "U 91 0 false false false true" }
488 };
489
[email protected]95409e12010-08-17 20:07:11490 ASSERT_TRUE(test_server()->Start());
[email protected]853300a82010-07-27 21:17:57491
[email protected]a6e602f2010-09-28 22:28:30492 ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
[email protected]95409e12010-08-17 20:07:11493 GURL url = test_server()->GetURL(kTestingPage);
[email protected]853300a82010-07-27 21:17:57494 ui_test_utils::NavigateToURL(browser(), url);
495
496 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
497 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
498
[email protected]1ea49d52011-04-12 17:44:44499 int tab_index = browser()->active_index();
[email protected]853300a82010-07-27 21:17:57500 // Press Cmd+F, which will make the Find box open and request focus.
501 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCmdF));
502 EXPECT_TRUE(IsViewFocused(VIEW_ID_FIND_IN_PAGE_TEXT_FIELD));
503
504 // Press Escape to close the Find box and move the focus back to the web page.
[email protected]a6e602f2010-09-28 22:28:30505 ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
[email protected]b6d81262011-01-13 17:36:09506 browser(), ui::VKEY_ESCAPE, false, false, false, false));
[email protected]853300a82010-07-27 21:17:57507 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
508
509 // Press Cmd+F with keydown suppressed shall not open the find box.
510 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCmdFSuppressKeyDown));
511 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
512}
513#endif
[email protected]21abcc742009-10-23 02:52:06514
[email protected]4da3d852012-01-12 02:46:25515#if defined(OS_MACOSX)
[email protected]98977bc2011-12-09 23:13:05516// http://crbug.com/81451 for mac
[email protected]ce09a712011-05-05 22:31:51517IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, DISABLED_AccessKeys) {
[email protected]cb931932011-05-03 19:57:33518#else
[email protected]ce09a712011-05-05 22:31:51519IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, AccessKeys) {
[email protected]cb931932011-05-03 19:57:33520#endif
[email protected]853300a82010-07-27 21:17:57521#if defined(OS_MACOSX)
522 // On Mac, access keys use ctrl+alt modifiers.
523 static const KeyEventTestData kTestAccessA = {
[email protected]b6d81262011-01-13 17:36:09524 ui::VKEY_A, true, false, true, false,
[email protected]853300a82010-07-27 21:17:57525 false, false, false, false, 6,
526 { "D 17 0 true false false false",
527 "D 18 0 true false true false",
528 "D 65 0 true false true false",
529 "U 65 0 true false true false",
530 "U 18 0 true false true false",
531 "U 17 0 true false false false" }
[email protected]21abcc742009-10-23 02:52:06532 };
533
[email protected]853300a82010-07-27 21:17:57534 static const KeyEventTestData kTestAccessDSuppress = {
[email protected]b6d81262011-01-13 17:36:09535 ui::VKEY_D, true, false, true, false,
[email protected]853300a82010-07-27 21:17:57536 true, true, true, false, 6,
537 { "D 17 0 true false false false",
538 "D 18 0 true false true false",
539 "D 68 0 true false true false",
540 "U 68 0 true false true false",
541 "U 18 0 true false true false",
542 "U 17 0 true false false false" }
543 };
544
545 static const KeyEventTestData kTestAccess1 = {
[email protected]b6d81262011-01-13 17:36:09546 ui::VKEY_1, true, false, true, false,
[email protected]853300a82010-07-27 21:17:57547 false, false, false, false, 6,
548 { "D 17 0 true false false false",
549 "D 18 0 true false true false",
550 "D 49 0 true false true false",
551 "U 49 0 true false true false",
552 "U 18 0 true false true false",
553 "U 17 0 true false false false" }
554 };
555#else
556 static const KeyEventTestData kTestAccessA = {
[email protected]b6d81262011-01-13 17:36:09557 ui::VKEY_A, false, false, true, false,
[email protected]853300a82010-07-27 21:17:57558 false, false, false, false, 4,
559 { "D 18 0 false false true false",
560 "D 65 0 false false true false",
561 "U 65 0 false false true false",
562 "U 18 0 false false true false" }
563 };
564
565 static const KeyEventTestData kTestAccessD = {
[email protected]b6d81262011-01-13 17:36:09566 ui::VKEY_D, false, false, true, false,
[email protected]21abcc742009-10-23 02:52:06567 false, false, false, false, 2,
[email protected]853300a82010-07-27 21:17:57568 { "D 18 0 false false true false",
569 "D 68 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 kTestAccessDSuppress = {
[email protected]b6d81262011-01-13 17:36:09573 ui::VKEY_D, false, false, true, false,
[email protected]21abcc742009-10-23 02:52:06574 true, true, true, false, 4,
[email protected]853300a82010-07-27 21:17:57575 { "D 18 0 false false true false",
576 "D 68 0 false false true false",
577 "U 68 0 false false true false",
578 "U 18 0 false false true false" }
[email protected]21abcc742009-10-23 02:52:06579 };
580
[email protected]853300a82010-07-27 21:17:57581 static const KeyEventTestData kTestAccess1 = {
[email protected]b6d81262011-01-13 17:36:09582 ui::VKEY_1, false, false, true, false,
[email protected]21abcc742009-10-23 02:52:06583 false, false, false, false, 4,
[email protected]853300a82010-07-27 21:17:57584 { "D 18 0 false false true false",
585 "D 49 0 false false true false",
586 "U 49 0 false false true false",
587 "U 18 0 false false true false" }
[email protected]21abcc742009-10-23 02:52:06588 };
[email protected]853300a82010-07-27 21:17:57589#endif
[email protected]21abcc742009-10-23 02:52:06590
[email protected]95409e12010-08-17 20:07:11591 ASSERT_TRUE(test_server()->Start());
[email protected]21abcc742009-10-23 02:52:06592
[email protected]a6e602f2010-09-28 22:28:30593 ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
[email protected]95409e12010-08-17 20:07:11594 GURL url = test_server()->GetURL(kTestingPage);
[email protected]21abcc742009-10-23 02:52:06595 ui_test_utils::NavigateToURL(browser(), url);
596
[email protected]f07d7bf2010-04-06 08:02:42597 ui_test_utils::RunAllPendingInMessageLoop();
[email protected]21abcc742009-10-23 02:52:06598 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
599 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
600
[email protected]1ea49d52011-04-12 17:44:44601 int tab_index = browser()->active_index();
[email protected]21abcc742009-10-23 02:52:06602 // Make sure no element is focused.
603 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L""));
604 // Alt+A should focus the element with accesskey = "A".
[email protected]853300a82010-07-27 21:17:57605 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestAccessA));
[email protected]21abcc742009-10-23 02:52:06606 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L"A"));
607
608 // Blur the focused element.
609 EXPECT_NO_FATAL_FAILURE(SetFocusedElement(tab_index, L""));
610 // Make sure no element is focused.
611 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L""));
[email protected]853300a82010-07-27 21:17:57612
613#if !defined(OS_MACOSX)
[email protected]21abcc742009-10-23 02:52:06614 // Alt+D should move the focus to the location entry.
[email protected]853300a82010-07-27 21:17:57615 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestAccessD));
[email protected]095b55f62010-09-24 08:06:04616
617 // TODO(isherman): This is an experimental change to help diagnose
618 // http://crbug.com/55713
619 ui_test_utils::RunAllPendingInMessageLoop();
[email protected]0b8fa8b2011-12-07 00:54:52620#if defined(USE_AURA)
621 EXPECT_TRUE(IsViewFocused(VIEW_ID_OMNIBOX));
622#else
[email protected]21abcc742009-10-23 02:52:06623 EXPECT_TRUE(IsViewFocused(VIEW_ID_LOCATION_BAR));
[email protected]0b8fa8b2011-12-07 00:54:52624#endif
[email protected]21abcc742009-10-23 02:52:06625 // No element should be focused, as Alt+D was handled by the browser.
626 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L""));
627
628 // Move the focus back to the web page.
629 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
630 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
631
632 // Make sure no element is focused.
633 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L""));
[email protected]853300a82010-07-27 21:17:57634#endif
635
[email protected]21abcc742009-10-23 02:52:06636 // If the keydown event is suppressed, then Alt+D should be handled as an
637 // accesskey rather than an accelerator key. Activation of an accesskey is not
638 // a part of the default action of the key event, so it should not be
639 // suppressed at all.
[email protected]853300a82010-07-27 21:17:57640 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestAccessDSuppress));
[email protected]21abcc742009-10-23 02:52:06641 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
642 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L"D"));
643
644 // Blur the focused element.
645 EXPECT_NO_FATAL_FAILURE(SetFocusedElement(tab_index, L""));
646 // Make sure no element is focused.
647 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L""));
[email protected]853300a82010-07-27 21:17:57648 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestAccess1));
[email protected]753efc42010-03-09 19:52:16649#if defined(TOOLKIT_GTK)
650 // On GTK, alt-0..9 are assigned as tab selection accelerators, so they can
[email protected]21abcc742009-10-23 02:52:06651 // not be used as accesskeys.
652 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L""));
[email protected]853300a82010-07-27 21:17:57653#else
[email protected]21abcc742009-10-23 02:52:06654 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L"1"));
655#endif
656}
657
[email protected]6db98962011-10-04 22:42:49658// Flaky, http://crbug.com/69475.
659#if defined(OS_LINUX)
[email protected]4d2451652012-02-14 23:54:26660#define MAYBE_ReservedAccelerators DISABLED_ReservedAccelerators
[email protected]6db98962011-10-04 22:42:49661#else
662#define MAYBE_ReservedAccelerators ReservedAccelerators
663#endif
664IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, MAYBE_ReservedAccelerators) {
[email protected]95409e12010-08-17 20:07:11665 ASSERT_TRUE(test_server()->Start());
[email protected]21abcc742009-10-23 02:52:06666
[email protected]a6e602f2010-09-28 22:28:30667 ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
[email protected]95409e12010-08-17 20:07:11668 GURL url = test_server()->GetURL(kTestingPage);
[email protected]21abcc742009-10-23 02:52:06669 ui_test_utils::NavigateToURL(browser(), url);
670
671 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
672 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
673
[email protected]0f72a2dc2010-12-06 19:40:23674 ASSERT_EQ(1, browser()->tab_count());
675
[email protected]e4292a232010-12-11 01:46:41676 static const KeyEventTestData kTestCtrlOrCmdT = {
[email protected]3ab6796d32010-12-21 23:56:07677#if defined(OS_MACOSX)
[email protected]b6d81262011-01-13 17:36:09678 ui::VKEY_T, false, false, false, true,
[email protected]853300a82010-07-27 21:17:57679 true, false, false, false, 1,
680 { "D 91 0 false false false true" }
[email protected]3ab6796d32010-12-21 23:56:07681#else
[email protected]b6d81262011-01-13 17:36:09682 ui::VKEY_T, true, false, false, false,
[email protected]3ab6796d32010-12-21 23:56:07683 true, false, false, false, 1,
684 { "D 17 0 true false false false" }
[email protected]e4292a232010-12-11 01:46:41685#endif
[email protected]853300a82010-07-27 21:17:57686 };
[email protected]867125a02009-12-10 06:01:48687
[email protected]0f72a2dc2010-12-06 19:40:23688 ui_test_utils::WindowedNotificationObserver wait_for_new_tab(
[email protected]432115822011-07-10 15:52:27689 content::NOTIFICATION_TAB_PARENTED,
[email protected]ad50def52011-10-19 23:17:07690 content::NotificationService::AllSources());
[email protected]0f72a2dc2010-12-06 19:40:23691
[email protected]e4292a232010-12-11 01:46:41692 // Press Ctrl/Cmd+T, which will open a new tab. It cannot be suppressed.
693 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(0, kTestCtrlOrCmdT));
[email protected]ae673742011-08-24 19:48:37694 wait_for_new_tab.Wait();
[email protected]853300a82010-07-27 21:17:57695
696 int result_length;
697 ASSERT_NO_FATAL_FAILURE(GetResultLength(0, &result_length));
698 EXPECT_EQ(1, result_length);
699
[email protected]0f72a2dc2010-12-06 19:40:23700 EXPECT_EQ(2, browser()->tab_count());
[email protected]1ea49d52011-04-12 17:44:44701 ASSERT_EQ(1, browser()->active_index());
[email protected]0f72a2dc2010-12-06 19:40:23702
703 // Because of issue http://crbug.com/65375, switching back to the first tab
704 // may cause the focus to be grabbed by omnibox. So instead, we load our
705 // testing page in the newly created tab and try Cmd-W here.
706 ui_test_utils::NavigateToURL(browser(), url);
707
708 // Make sure the focus is in the testing page.
709 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
710 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
711
[email protected]853300a82010-07-27 21:17:57712 // Reserved accelerators can't be suppressed.
[email protected]0f72a2dc2010-12-06 19:40:23713 ASSERT_NO_FATAL_FAILURE(SuppressAllEvents(1, true));
714
[email protected]e4292a232010-12-11 01:46:41715 ui_test_utils::WindowedNotificationObserver wait_for_tab_closed(
[email protected]cca0f1e2012-01-03 18:27:46716 content::NOTIFICATION_TAB_CLOSED,
[email protected]c5eed492012-01-04 17:07:50717 content::Source<NavigationController>(
[email protected]6acde6352012-01-04 16:52:20718 &browser()->GetWebContentsAt(1)->GetController()));
[email protected]e4292a232010-12-11 01:46:41719
720 // Press Ctrl/Cmd+W, which will close the tab.
[email protected]3ab6796d32010-12-21 23:56:07721#if defined(OS_MACOSX)
[email protected]a6e602f2010-09-28 22:28:30722 ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
[email protected]b6d81262011-01-13 17:36:09723 browser(), ui::VKEY_W, false, false, false, true));
[email protected]3ab6796d32010-12-21 23:56:07724#else
725 ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
[email protected]b6d81262011-01-13 17:36:09726 browser(), ui::VKEY_W, true, false, false, false));
[email protected]e4292a232010-12-11 01:46:41727#endif
728
729 ASSERT_NO_FATAL_FAILURE(wait_for_tab_closed.Wait());
730
[email protected]853300a82010-07-27 21:17:57731 EXPECT_EQ(1, browser()->tab_count());
[email protected]21abcc742009-10-23 02:52:06732}
[email protected]853300a82010-07-27 21:17:57733
734#if defined(OS_MACOSX)
735IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, EditorKeyBindings) {
736 static const KeyEventTestData kTestCtrlA = {
[email protected]b6d81262011-01-13 17:36:09737 ui::VKEY_A, true, false, false, false,
[email protected]853300a82010-07-27 21:17:57738 false, false, false, false, 4,
739 { "D 17 0 true false false false",
740 "D 65 0 true false false false",
741 "U 65 0 true false false false",
742 "U 17 0 true false false false" }
743 };
744
745 static const KeyEventTestData kTestCtrlF = {
[email protected]b6d81262011-01-13 17:36:09746 ui::VKEY_F, true, false, false, false,
[email protected]853300a82010-07-27 21:17:57747 false, false, false, false, 4,
748 { "D 17 0 true false false false",
749 "D 70 0 true false false false",
750 "U 70 0 true false false false",
751 "U 17 0 true false false false" }
752 };
753
754 static const KeyEventTestData kTestCtrlK = {
[email protected]b6d81262011-01-13 17:36:09755 ui::VKEY_K, true, false, false, false,
[email protected]853300a82010-07-27 21:17:57756 false, false, false, false, 4,
757 { "D 17 0 true false false false",
758 "D 75 0 true false false false",
759 "U 75 0 true false false false",
760 "U 17 0 true false false false" }
761 };
762
[email protected]95409e12010-08-17 20:07:11763 ASSERT_TRUE(test_server()->Start());
[email protected]853300a82010-07-27 21:17:57764
[email protected]a6e602f2010-09-28 22:28:30765 ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
[email protected]95409e12010-08-17 20:07:11766 GURL url = test_server()->GetURL(kTestingPage);
[email protected]853300a82010-07-27 21:17:57767 ui_test_utils::NavigateToURL(browser(), url);
768
769 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
770 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
771
[email protected]1ea49d52011-04-12 17:44:44772 int tab_index = browser()->active_index();
[email protected]853300a82010-07-27 21:17:57773 ASSERT_NO_FATAL_FAILURE(SetFocusedElement(tab_index, L"A"));
774 ASSERT_NO_FATAL_FAILURE(SetTextBoxValue(tab_index, L"A", L"Hello"));
775 // Move the caret to the beginning of the line.
776 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlA));
777 // Forward one character
778 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlF));
779 // Delete to the end of the line.
780 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlK));
781 EXPECT_NO_FATAL_FAILURE(CheckTextBoxValue(tab_index, L"A", L"H"));
782}
783#endif
784
785IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, PageUpDownKeys) {
786 static const KeyEventTestData kTestPageUp = {
[email protected]b6d81262011-01-13 17:36:09787 ui::VKEY_PRIOR, false, false, false, false,
[email protected]853300a82010-07-27 21:17:57788 false, false, false, false, 2,
789 { "D 33 0 false false false false",
790 "U 33 0 false false false false" }
791 };
792
793 static const KeyEventTestData kTestPageDown = {
[email protected]b6d81262011-01-13 17:36:09794 ui::VKEY_NEXT, false, false, false, false,
[email protected]853300a82010-07-27 21:17:57795 false, false, false, false, 2,
796 { "D 34 0 false false false false",
797 "U 34 0 false false false false" }
798 };
799
[email protected]95409e12010-08-17 20:07:11800 ASSERT_TRUE(test_server()->Start());
[email protected]853300a82010-07-27 21:17:57801
[email protected]a6e602f2010-09-28 22:28:30802 ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
[email protected]95409e12010-08-17 20:07:11803 GURL url = test_server()->GetURL(kTestingPage);
[email protected]853300a82010-07-27 21:17:57804 ui_test_utils::NavigateToURL(browser(), url);
805
806 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
807 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
808
[email protected]1ea49d52011-04-12 17:44:44809 int tab_index = browser()->active_index();
[email protected]853300a82010-07-27 21:17:57810 ASSERT_NO_FATAL_FAILURE(SetFocusedElement(tab_index, L"A"));
811 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestPageUp));
812 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestPageDown));
813 EXPECT_NO_FATAL_FAILURE(CheckTextBoxValue(tab_index, L"A", L""));
814}
[email protected]629e0342010-07-27 23:30:13815
[email protected]ee19cb202010-08-04 19:48:19816#if defined(OS_WIN) || defined(TOOLKIT_VIEWS)
817IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, FocusMenuBarByAltKey) {
818 static const KeyEventTestData kTestAltKey = {
[email protected]b6d81262011-01-13 17:36:09819 ui::VKEY_MENU, false, false, false, false,
[email protected]ee19cb202010-08-04 19:48:19820 false, false, false, false, 2,
821 { "D 18 0 false false true false",
822 "U 18 0 false false true false" }
823 };
824
825 static const KeyEventTestData kTestAltKeySuppress = {
[email protected]b6d81262011-01-13 17:36:09826 ui::VKEY_MENU, false, false, false, false,
[email protected]ee19cb202010-08-04 19:48:19827 true, false, false, false, 2,
828 { "D 18 0 false false true false",
829 "U 18 0 false false true false" }
830 };
831
832 static const KeyEventTestData kTestCtrlAltKey = {
[email protected]b6d81262011-01-13 17:36:09833 ui::VKEY_MENU, true, false, false, false,
[email protected]ee19cb202010-08-04 19:48:19834 false, false, false, false, 4,
835 { "D 17 0 true false false false",
836 "D 18 0 true false true false",
837 "U 18 0 true false true false",
838 "U 17 0 true false false false" }
839 };
840
[email protected]95409e12010-08-17 20:07:11841 ASSERT_TRUE(test_server()->Start());
[email protected]ee19cb202010-08-04 19:48:19842
[email protected]a6e602f2010-09-28 22:28:30843 ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
[email protected]95409e12010-08-17 20:07:11844 GURL url = test_server()->GetURL(kTestingPage);
[email protected]ee19cb202010-08-04 19:48:19845 ui_test_utils::NavigateToURL(browser(), url);
846
847 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
848 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
849
[email protected]1ea49d52011-04-12 17:44:44850 int tab_index = browser()->active_index();
[email protected]ee19cb202010-08-04 19:48:19851 // Press and release Alt key to focus wrench menu button.
852 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestAltKey));
853 EXPECT_TRUE(IsViewFocused(VIEW_ID_APP_MENU));
854
855 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
856 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
857
858 // Alt key can be suppressed.
859 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestAltKeySuppress));
860 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
861
862 // Ctrl+Alt should have no effect.
863 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlAltKey));
864 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
865}
866#endif
867
[email protected]629e0342010-07-27 23:30:13868} // namespace