blob: 724dbeacb4f1d18757f14d01b2e45ed3f42f49f5 [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"
[email protected]fa1e0e12013-07-18 00:10:149#include "base/message_loop/message_loop.h"
[email protected]e7463412013-06-10 22:53:4610#include "base/strings/stringprintf.h"
[email protected]135cb802013-06-09 16:44:2011#include "base/strings/utf_string_conversions.h"
[email protected]21abcc742009-10-23 02:52:0612#include "base/values.h"
[email protected]fdf40f3e2013-07-11 23:55:4613#include "chrome/browser/chrome_notification_types.h"
[email protected]2ad4a902010-11-17 06:05:1314#include "chrome/browser/ui/browser.h"
[email protected]ee496952013-01-10 23:17:3315#include "chrome/browser/ui/tabs/tab_strip_model.h"
[email protected]21abcc742009-10-23 02:52:0616#include "chrome/common/chrome_paths.h"
[email protected]af44e7fb2011-07-29 18:32:3217#include "chrome/test/base/in_process_browser_test.h"
[email protected]ce7d0cbc2013-05-03 18:57:2218#include "chrome/test/base/interactive_test_utils.h"
[email protected]af44e7fb2011-07-29 18:32:3219#include "chrome/test/base/ui_test_utils.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]9c1662b2012-03-06 15:44:3323#include "content/public/browser/render_view_host.h"
[email protected]5626b0892012-02-20 14:46:5824#include "content/public/browser/render_widget_host_view.h"
[email protected]6acde6352012-01-04 16:52:2025#include "content/public/browser/web_contents.h"
[email protected]8643e6d2012-01-18 20:26:1026#include "content/public/browser/web_contents_view.h"
[email protected]7d478cb2012-07-24 17:19:4227#include "content/public/test/browser_test_utils.h"
[email protected]c1dffe82013-06-26 20:59:0528#include "net/test/embedded_test_server/embedded_test_server.h"
[email protected]7e9acd082013-09-17 23:31:1629#include "ui/events/keycodes/keyboard_codes.h"
[email protected]21abcc742009-10-23 02:52:0630
[email protected]984aecc2013-03-24 03:53:2331// TODO(kbr): remove: http://crbug.com/222296
32#if defined(OS_MACOSX)
33#import "base/mac/mac_util.h"
34#endif
35
[email protected]766a7082012-02-03 23:39:1536using content::DomOperationNotificationDetails;
[email protected]c5eed492012-01-04 17:07:5037using content::NavigationController;
[email protected]eaabba22012-03-07 15:02:1138using content::RenderViewHost;
[email protected]c5eed492012-01-04 17:07:5039
[email protected]21abcc742009-10-23 02:52:0640namespace {
41
[email protected]c1dffe82013-06-26 20:59:0542const char kTestingPage[] = "/keyevents_test.html";
[email protected]06bc5d92013-01-02 22:44:1343const char kSuppressEventJS[] =
44 "window.domAutomationController.send(setDefaultAction('%ls', %ls));";
45const char kGetResultJS[] =
46 "window.domAutomationController.send(keyEventResult[%d]);";
47const char kGetResultLengthJS[] =
48 "window.domAutomationController.send(keyEventResult.length);";
49const char kGetFocusedElementJS[] =
50 "window.domAutomationController.send(focusedElement);";
51const char kSetFocusedElementJS[] =
52 "window.domAutomationController.send(setFocusedElement('%ls'));";
53const char kGetTextBoxValueJS[] =
54 "window.domAutomationController.send("
55 " document.getElementById('%ls').value);";
56const char kSetTextBoxValueJS[] =
57 "window.domAutomationController.send("
58 " document.getElementById('%ls').value = '%ls');";
59const char kStartTestJS[] =
60 "window.domAutomationController.send(startTest(%d));";
[email protected]21abcc742009-10-23 02:52:0661
62// Maximum lenght of the result array in KeyEventTestData structure.
63const size_t kMaxResultLength = 10;
64
65// A structure holding test data of a keyboard event.
66// Each keyboard event may generate multiple result strings representing
67// the result of keydown, keypress, keyup and textInput events.
68// For keydown, keypress and keyup events, the format of the result string is:
[email protected]853300a82010-07-27 21:17:5769// <type> <keyCode> <charCode> <ctrlKey> <shiftKey> <altKey> <commandKey>
[email protected]21abcc742009-10-23 02:52:0670// where <type> may be 'D' (keydown), 'P' (keypress) or 'U' (keyup).
[email protected]853300a82010-07-27 21:17:5771// <ctrlKey>, <shiftKey> <altKey> and <commandKey> are boolean value indicating
72// the state of corresponding modifier key.
[email protected]21abcc742009-10-23 02:52:0673// For textInput event, the format is: T <text>, where <text> is the text to be
74// input.
75// Please refer to chrome/test/data/keyevents_test.html for details.
76struct KeyEventTestData {
[email protected]b6d81262011-01-13 17:36:0977 ui::KeyboardCode key;
[email protected]21abcc742009-10-23 02:52:0678 bool ctrl;
79 bool shift;
80 bool alt;
[email protected]853300a82010-07-27 21:17:5781 bool command;
[email protected]21abcc742009-10-23 02:52:0682
83 bool suppress_keydown;
84 bool suppress_keypress;
85 bool suppress_keyup;
86 bool suppress_textinput;
87
88 int result_length;
89 const char* const result[kMaxResultLength];
90};
91
92const wchar_t* GetBoolString(bool value) {
93 return value ? L"true" : L"false";
94}
95
96// A class to help wait for the finish of a key event test.
[email protected]6c2381d2011-10-19 02:52:5397class TestFinishObserver : public content::NotificationObserver {
[email protected]21abcc742009-10-23 02:52:0698 public:
99 explicit TestFinishObserver(RenderViewHost* render_view_host)
100 : finished_(false), waiting_(false) {
[email protected]766a7082012-02-03 23:39:15101 registrar_.Add(this, content::NOTIFICATION_DOM_OPERATION_RESPONSE,
[email protected]6c2381d2011-10-19 02:52:53102 content::Source<RenderViewHost>(render_view_host));
[email protected]21abcc742009-10-23 02:52:06103 }
104
105 bool WaitForFinish() {
106 if (!finished_) {
107 waiting_ = true;
[email protected]729eb632012-07-26 04:45:26108 content::RunMessageLoop();
[email protected]21abcc742009-10-23 02:52:06109 waiting_ = false;
110 }
111 return finished_;
112 }
113
[email protected]432115822011-07-10 15:52:27114 virtual void Observe(int type,
[email protected]6c2381d2011-10-19 02:52:53115 const content::NotificationSource& source,
[email protected]b94584a2013-02-07 03:02:08116 const content::NotificationDetails& details) OVERRIDE {
[email protected]766a7082012-02-03 23:39:15117 DCHECK(type == content::NOTIFICATION_DOM_OPERATION_RESPONSE);
[email protected]6c2381d2011-10-19 02:52:53118 content::Details<DomOperationNotificationDetails> dom_op_details(details);
[email protected]21abcc742009-10-23 02:52:06119 // We might receive responses for other script execution, but we only
120 // care about the test finished message.
[email protected]766a7082012-02-03 23:39:15121 if (dom_op_details->json == "\"FINISHED\"") {
[email protected]21abcc742009-10-23 02:52:06122 finished_ = true;
123 if (waiting_)
[email protected]b3a25092013-05-28 22:08:16124 base::MessageLoopForUI::current()->Quit();
[email protected]21abcc742009-10-23 02:52:06125 }
126 }
127
128 private:
129 bool finished_;
130 bool waiting_;
[email protected]6c2381d2011-10-19 02:52:53131 content::NotificationRegistrar registrar_;
[email protected]21abcc742009-10-23 02:52:06132
133 DISALLOW_COPY_AND_ASSIGN(TestFinishObserver);
134};
135
136class BrowserKeyEventsTest : public InProcessBrowserTest {
137 public:
[email protected]90ca44272012-07-18 18:15:48138 BrowserKeyEventsTest() {}
[email protected]21abcc742009-10-23 02:52:06139
[email protected]21abcc742009-10-23 02:52:06140 bool IsViewFocused(ViewID vid) {
141 return ui_test_utils::IsViewFocused(browser(), vid);
142 }
143
144 void ClickOnView(ViewID vid) {
145 ui_test_utils::ClickOnView(browser(), vid);
146 }
147
148 // Set the suppress flag of an event specified by |type|. If |suppress| is
149 // true then the web page will suppress all events with |type|. Following
150 // event types are supported: keydown, keypress, keyup and textInput.
151 void SuppressEventByType(int tab_index, const wchar_t* type, bool suppress) {
[email protected]ee496952013-01-10 23:17:33152 ASSERT_LT(tab_index, browser()->tab_strip_model()->count());
[email protected]21abcc742009-10-23 02:52:06153 bool actual;
[email protected]b6987e02013-01-04 18:30:43154 ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
[email protected]ee496952013-01-10 23:17:33155 browser()->tab_strip_model()->GetWebContentsAt(tab_index),
[email protected]1870d5cf2011-05-12 01:55:40156 base::StringPrintf(kSuppressEventJS, type, GetBoolString(!suppress)),
[email protected]21abcc742009-10-23 02:52:06157 &actual));
158 ASSERT_EQ(!suppress, actual);
159 }
160
161 void SuppressEvents(int tab_index, bool keydown, bool keypress,
162 bool keyup, bool textinput) {
163 ASSERT_NO_FATAL_FAILURE(
164 SuppressEventByType(tab_index, L"keydown", keydown));
165 ASSERT_NO_FATAL_FAILURE(
166 SuppressEventByType(tab_index, L"keypress", keypress));
167 ASSERT_NO_FATAL_FAILURE(
168 SuppressEventByType(tab_index, L"keyup", keyup));
169 ASSERT_NO_FATAL_FAILURE(
170 SuppressEventByType(tab_index, L"textInput", textinput));
171 }
172
173 void SuppressAllEvents(int tab_index, bool suppress) {
174 SuppressEvents(tab_index, suppress, suppress, suppress, suppress);
175 }
176
177 void GetResultLength(int tab_index, int* length) {
[email protected]ee496952013-01-10 23:17:33178 ASSERT_LT(tab_index, browser()->tab_strip_model()->count());
[email protected]b6987e02013-01-04 18:30:43179 ASSERT_TRUE(content::ExecuteScriptAndExtractInt(
[email protected]ee496952013-01-10 23:17:33180 browser()->tab_strip_model()->GetWebContentsAt(tab_index),
[email protected]06bc5d92013-01-02 22:44:13181 kGetResultLengthJS,
182 length));
[email protected]21abcc742009-10-23 02:52:06183 }
184
185 void CheckResult(int tab_index, int length, const char* const result[]) {
[email protected]ee496952013-01-10 23:17:33186 ASSERT_LT(tab_index, browser()->tab_strip_model()->count());
[email protected]21abcc742009-10-23 02:52:06187 int actual_length;
188 ASSERT_NO_FATAL_FAILURE(GetResultLength(tab_index, &actual_length));
189 ASSERT_GE(actual_length, length);
190 for (int i = 0; i < actual_length; ++i) {
191 std::string actual;
[email protected]b6987e02013-01-04 18:30:43192 ASSERT_TRUE(content::ExecuteScriptAndExtractString(
[email protected]ee496952013-01-10 23:17:33193 browser()->tab_strip_model()->GetWebContentsAt(tab_index),
[email protected]06bc5d92013-01-02 22:44:13194 base::StringPrintf(kGetResultJS, i),
195 &actual));
[email protected]21abcc742009-10-23 02:52:06196
197 // If more events were received than expected, then the additional events
198 // must be keyup events.
199 if (i < length)
200 ASSERT_STREQ(result[i], actual.c_str());
201 else
202 ASSERT_EQ('U', actual[0]);
203 }
204 }
205
206 void CheckFocusedElement(int tab_index, const wchar_t* focused) {
[email protected]ee496952013-01-10 23:17:33207 ASSERT_LT(tab_index, browser()->tab_strip_model()->count());
[email protected]21abcc742009-10-23 02:52:06208 std::string actual;
[email protected]b6987e02013-01-04 18:30:43209 ASSERT_TRUE(content::ExecuteScriptAndExtractString(
[email protected]ee496952013-01-10 23:17:33210 browser()->tab_strip_model()->GetWebContentsAt(tab_index),
[email protected]06bc5d92013-01-02 22:44:13211 kGetFocusedElementJS,
212 &actual));
[email protected]cc2a2a22013-12-24 23:12:15213 ASSERT_EQ(base::WideToUTF8(focused), actual);
[email protected]21abcc742009-10-23 02:52:06214 }
215
216 void SetFocusedElement(int tab_index, const wchar_t* focused) {
[email protected]ee496952013-01-10 23:17:33217 ASSERT_LT(tab_index, browser()->tab_strip_model()->count());
[email protected]21abcc742009-10-23 02:52:06218 bool actual;
[email protected]b6987e02013-01-04 18:30:43219 ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
[email protected]ee496952013-01-10 23:17:33220 browser()->tab_strip_model()->GetWebContentsAt(tab_index),
[email protected]1870d5cf2011-05-12 01:55:40221 base::StringPrintf(kSetFocusedElementJS, focused),
[email protected]21abcc742009-10-23 02:52:06222 &actual));
223 ASSERT_TRUE(actual);
224 }
225
226 void CheckTextBoxValue(int tab_index, const wchar_t* id,
227 const wchar_t* value) {
[email protected]ee496952013-01-10 23:17:33228 ASSERT_LT(tab_index, browser()->tab_strip_model()->count());
[email protected]21abcc742009-10-23 02:52:06229 std::string actual;
[email protected]b6987e02013-01-04 18:30:43230 ASSERT_TRUE(content::ExecuteScriptAndExtractString(
[email protected]ee496952013-01-10 23:17:33231 browser()->tab_strip_model()->GetWebContentsAt(tab_index),
[email protected]1870d5cf2011-05-12 01:55:40232 base::StringPrintf(kGetTextBoxValueJS, id),
[email protected]21abcc742009-10-23 02:52:06233 &actual));
[email protected]cc2a2a22013-12-24 23:12:15234 ASSERT_EQ(base::WideToUTF8(value), actual);
[email protected]21abcc742009-10-23 02:52:06235 }
236
[email protected]853300a82010-07-27 21:17:57237 void SetTextBoxValue(int tab_index, const wchar_t* id,
238 const wchar_t* value) {
[email protected]ee496952013-01-10 23:17:33239 ASSERT_LT(tab_index, browser()->tab_strip_model()->count());
[email protected]853300a82010-07-27 21:17:57240 std::string actual;
[email protected]b6987e02013-01-04 18:30:43241 ASSERT_TRUE(content::ExecuteScriptAndExtractString(
[email protected]ee496952013-01-10 23:17:33242 browser()->tab_strip_model()->GetWebContentsAt(tab_index),
[email protected]1870d5cf2011-05-12 01:55:40243 base::StringPrintf(kSetTextBoxValueJS, id, value),
[email protected]853300a82010-07-27 21:17:57244 &actual));
[email protected]cc2a2a22013-12-24 23:12:15245 ASSERT_EQ(base::WideToUTF8(value), actual);
[email protected]853300a82010-07-27 21:17:57246 }
247
248 void StartTest(int tab_index, int result_length) {
[email protected]ee496952013-01-10 23:17:33249 ASSERT_LT(tab_index, browser()->tab_strip_model()->count());
[email protected]21abcc742009-10-23 02:52:06250 bool actual;
[email protected]b6987e02013-01-04 18:30:43251 ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
[email protected]ee496952013-01-10 23:17:33252 browser()->tab_strip_model()->GetWebContentsAt(tab_index),
[email protected]06bc5d92013-01-02 22:44:13253 base::StringPrintf(kStartTestJS, result_length),
254 &actual));
[email protected]21abcc742009-10-23 02:52:06255 ASSERT_TRUE(actual);
256 }
257
258 void TestKeyEvent(int tab_index, const KeyEventTestData& test) {
[email protected]ee496952013-01-10 23:17:33259 ASSERT_LT(tab_index, browser()->tab_strip_model()->count());
260 ASSERT_EQ(tab_index, browser()->tab_strip_model()->active_index());
[email protected]21abcc742009-10-23 02:52:06261
262 // Inform our testing web page that we are about to start testing a key
263 // event.
[email protected]853300a82010-07-27 21:17:57264 ASSERT_NO_FATAL_FAILURE(StartTest(tab_index, test.result_length));
[email protected]21abcc742009-10-23 02:52:06265 ASSERT_NO_FATAL_FAILURE(SuppressEvents(
266 tab_index, test.suppress_keydown, test.suppress_keypress,
267 test.suppress_keyup, test.suppress_textinput));
268
269 // We need to create a finish observer before sending the key event,
270 // because the test finished message might be arrived before returning
[email protected]a6e602f2010-09-28 22:28:30271 // from the SendKeyPressSync() method.
[email protected]21abcc742009-10-23 02:52:06272 TestFinishObserver finish_observer(
[email protected]ee496952013-01-10 23:17:33273 browser()->tab_strip_model()->GetWebContentsAt(tab_index)->
274 GetRenderViewHost());
[email protected]21abcc742009-10-23 02:52:06275
[email protected]a6e602f2010-09-28 22:28:30276 ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
277 browser(), test.key, test.ctrl, test.shift, test.alt, test.command));
[email protected]21abcc742009-10-23 02:52:06278 ASSERT_TRUE(finish_observer.WaitForFinish());
279 ASSERT_NO_FATAL_FAILURE(CheckResult(
280 tab_index, test.result_length, test.result));
281 }
282
283 std::string GetTestDataDescription(const KeyEventTestData& data) {
[email protected]1870d5cf2011-05-12 01:55:40284 std::string desc = base::StringPrintf(
[email protected]853300a82010-07-27 21:17:57285 " VKEY:0x%02x, ctrl:%d, shift:%d, alt:%d, command:%d\n"
[email protected]21abcc742009-10-23 02:52:06286 " Suppress: keydown:%d, keypress:%d, keyup:%d, textInput:%d\n"
287 " Expected results(%d):\n",
[email protected]853300a82010-07-27 21:17:57288 data.key, data.ctrl, data.shift, data.alt, data.command,
[email protected]21abcc742009-10-23 02:52:06289 data.suppress_keydown, data.suppress_keypress, data.suppress_keyup,
290 data.suppress_textinput, data.result_length);
291 for (int i = 0; i < data.result_length; ++i) {
292 desc.append(" ");
293 desc.append(data.result[i]);
294 desc.append("\n");
295 }
296 return desc;
297 }
298};
299
[email protected]5f80e0792013-10-01 07:18:55300// Flaky: http://crbug.com/129235, http://crbug.com/81451.
301IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, DISABLED_NormalKeyEvents) {
[email protected]21abcc742009-10-23 02:52:06302 static const KeyEventTestData kTestNoInput[] = {
303 // a
[email protected]b6d81262011-01-13 17:36:09304 { ui::VKEY_A, false, false, false, false,
[email protected]21abcc742009-10-23 02:52:06305 false, false, false, false, 3,
[email protected]853300a82010-07-27 21:17:57306 { "D 65 0 false false false false",
307 "P 97 97 false false false false",
308 "U 65 0 false false false false" } },
[email protected]21abcc742009-10-23 02:52:06309 // shift-a
[email protected]b6d81262011-01-13 17:36:09310 { ui::VKEY_A, false, true, false, false,
[email protected]21abcc742009-10-23 02:52:06311 false, false, false, false, 5,
[email protected]853300a82010-07-27 21:17:57312 { "D 16 0 false true false false",
313 "D 65 0 false true false false",
314 "P 65 65 false true false false",
315 "U 65 0 false true false false",
316 "U 16 0 false true false false" } },
[email protected]21abcc742009-10-23 02:52:06317 // a, suppress keydown
[email protected]b6d81262011-01-13 17:36:09318 { ui::VKEY_A, false, false, false, false,
[email protected]21abcc742009-10-23 02:52:06319 true, false, false, false, 2,
[email protected]853300a82010-07-27 21:17:57320 { "D 65 0 false false false false",
321 "U 65 0 false false false false" } },
[email protected]21abcc742009-10-23 02:52:06322 };
323
324 static const KeyEventTestData kTestWithInput[] = {
325 // a
[email protected]b6d81262011-01-13 17:36:09326 { ui::VKEY_A, false, false, false, false,
[email protected]21abcc742009-10-23 02:52:06327 false, false, false, false, 4,
[email protected]853300a82010-07-27 21:17:57328 { "D 65 0 false false false false",
329 "P 97 97 false false false false",
[email protected]21abcc742009-10-23 02:52:06330 "T a",
[email protected]853300a82010-07-27 21:17:57331 "U 65 0 false false false false" } },
[email protected]21abcc742009-10-23 02:52:06332 // shift-a
[email protected]b6d81262011-01-13 17:36:09333 { ui::VKEY_A, false, true, false, false,
[email protected]21abcc742009-10-23 02:52:06334 false, false, false, false, 6,
[email protected]853300a82010-07-27 21:17:57335 { "D 16 0 false true false false",
336 "D 65 0 false true false false",
337 "P 65 65 false true false false",
[email protected]21abcc742009-10-23 02:52:06338 "T A",
[email protected]853300a82010-07-27 21:17:57339 "U 65 0 false true false false",
340 "U 16 0 false true false false" } },
[email protected]21abcc742009-10-23 02:52:06341 // a, suppress keydown
[email protected]b6d81262011-01-13 17:36:09342 { ui::VKEY_A, false, false, false, false,
[email protected]21abcc742009-10-23 02:52:06343 true, false, false, false, 2,
[email protected]853300a82010-07-27 21:17:57344 { "D 65 0 false false false false",
345 "U 65 0 false false false false" } },
[email protected]21abcc742009-10-23 02:52:06346 // a, suppress keypress
[email protected]b6d81262011-01-13 17:36:09347 { ui::VKEY_A, false, false, false, false,
[email protected]21abcc742009-10-23 02:52:06348 false, true, false, false, 3,
[email protected]853300a82010-07-27 21:17:57349 { "D 65 0 false false false false",
350 "P 97 97 false false false false",
351 "U 65 0 false false false false" } },
[email protected]21abcc742009-10-23 02:52:06352 // a, suppress textInput
[email protected]b6d81262011-01-13 17:36:09353 { ui::VKEY_A, false, false, false, false,
[email protected]21abcc742009-10-23 02:52:06354 false, false, false, true, 4,
[email protected]853300a82010-07-27 21:17:57355 { "D 65 0 false false false false",
356 "P 97 97 false false false false",
[email protected]21abcc742009-10-23 02:52:06357 "T a",
[email protected]853300a82010-07-27 21:17:57358 "U 65 0 false false false false" } },
[email protected]21abcc742009-10-23 02:52:06359 };
360
[email protected]c1dffe82013-06-26 20:59:05361 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
[email protected]21abcc742009-10-23 02:52:06362
[email protected]a6e602f2010-09-28 22:28:30363 ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
[email protected]c1dffe82013-06-26 20:59:05364 GURL url = embedded_test_server()->GetURL(kTestingPage);
[email protected]21abcc742009-10-23 02:52:06365 ui_test_utils::NavigateToURL(browser(), url);
366
367 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
[email protected]f2159ba2012-04-17 19:13:21368 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]21abcc742009-10-23 02:52:06369
[email protected]ee496952013-01-10 23:17:33370 int tab_index = browser()->tab_strip_model()->active_index();
[email protected]21abcc742009-10-23 02:52:06371 for (size_t i = 0; i < arraysize(kTestNoInput); ++i) {
372 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestNoInput[i]))
373 << "kTestNoInput[" << i << "] failed:\n"
374 << GetTestDataDescription(kTestNoInput[i]);
375 }
376
[email protected]853300a82010-07-27 21:17:57377 // Input in normal text box.
[email protected]21abcc742009-10-23 02:52:06378 ASSERT_NO_FATAL_FAILURE(SetFocusedElement(tab_index, L"A"));
379 for (size_t i = 0; i < arraysize(kTestWithInput); ++i) {
380 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestWithInput[i]))
[email protected]853300a82010-07-27 21:17:57381 << "kTestWithInput[" << i << "] in text box failed:\n"
[email protected]21abcc742009-10-23 02:52:06382 << GetTestDataDescription(kTestWithInput[i]);
383 }
[email protected]21abcc742009-10-23 02:52:06384 EXPECT_NO_FATAL_FAILURE(CheckTextBoxValue(tab_index, L"A", L"aA"));
[email protected]853300a82010-07-27 21:17:57385
386 // Input in password box.
387 ASSERT_NO_FATAL_FAILURE(SetFocusedElement(tab_index, L"B"));
388 for (size_t i = 0; i < arraysize(kTestWithInput); ++i) {
389 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestWithInput[i]))
390 << "kTestWithInput[" << i << "] in password box failed:\n"
391 << GetTestDataDescription(kTestWithInput[i]);
392 }
393 EXPECT_NO_FATAL_FAILURE(CheckTextBoxValue(tab_index, L"B", L"aA"));
[email protected]21abcc742009-10-23 02:52:06394}
395
[email protected]853300a82010-07-27 21:17:57396#if defined(OS_WIN) || defined(OS_LINUX)
[email protected]bf43a382012-05-22 23:33:53397
[email protected]e8248a22013-08-07 18:25:20398#if defined(OS_LINUX) || (defined(OS_WIN) && defined(USE_AURA))
399// Linux: http://crbug.com/129235
400// Win Aura: crbug.com/269564
[email protected]e00ccc92012-11-01 17:32:30401#define MAYBE_CtrlKeyEvents DISABLED_CtrlKeyEvents
[email protected]bf43a382012-05-22 23:33:53402#else
403#define MAYBE_CtrlKeyEvents CtrlKeyEvents
404#endif
405
406IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, MAYBE_CtrlKeyEvents) {
[email protected]21abcc742009-10-23 02:52:06407 static const KeyEventTestData kTestCtrlF = {
[email protected]b6d81262011-01-13 17:36:09408 ui::VKEY_F, true, false, false, false,
[email protected]21abcc742009-10-23 02:52:06409 false, false, false, false, 2,
[email protected]853300a82010-07-27 21:17:57410 { "D 17 0 true false false false",
411 "D 70 0 true false false false" }
[email protected]21abcc742009-10-23 02:52:06412 };
413
414 static const KeyEventTestData kTestCtrlFSuppressKeyDown = {
[email protected]b6d81262011-01-13 17:36:09415 ui::VKEY_F, true, false, false, false,
[email protected]21abcc742009-10-23 02:52:06416 true, false, false, false, 4,
[email protected]853300a82010-07-27 21:17:57417 { "D 17 0 true false false false",
418 "D 70 0 true false false false",
419 "U 70 0 true false false false",
420 "U 17 0 true false false false" }
[email protected]21abcc742009-10-23 02:52:06421 };
422
423 // Ctrl+Z doesn't bind to any accelerators, which then should generate a
424 // keypress event with charCode=26.
425 static const KeyEventTestData kTestCtrlZ = {
[email protected]b6d81262011-01-13 17:36:09426 ui::VKEY_Z, true, false, false, false,
[email protected]21abcc742009-10-23 02:52:06427 false, false, false, false, 5,
[email protected]853300a82010-07-27 21:17:57428 { "D 17 0 true false false false",
429 "D 90 0 true false false false",
430 "P 26 26 true false false false",
431 "U 90 0 true false false false",
432 "U 17 0 true false false false" }
[email protected]21abcc742009-10-23 02:52:06433 };
434
435 static const KeyEventTestData kTestCtrlZSuppressKeyDown = {
[email protected]b6d81262011-01-13 17:36:09436 ui::VKEY_Z, true, false, false, false,
[email protected]21abcc742009-10-23 02:52:06437 true, false, false, false, 4,
[email protected]853300a82010-07-27 21:17:57438 { "D 17 0 true false false false",
439 "D 90 0 true false false false",
440 "U 90 0 true false false false",
441 "U 17 0 true false false false" }
[email protected]21abcc742009-10-23 02:52:06442 };
443
444 // Ctrl+Enter shall generate a keypress event with charCode=10 (LF).
445 static const KeyEventTestData kTestCtrlEnter = {
[email protected]b6d81262011-01-13 17:36:09446 ui::VKEY_RETURN, true, false, false, false,
[email protected]21abcc742009-10-23 02:52:06447 false, false, false, false, 5,
[email protected]853300a82010-07-27 21:17:57448 { "D 17 0 true false false false",
449 "D 13 0 true false false false",
450 "P 10 10 true false false false",
451 "U 13 0 true false false false",
452 "U 17 0 true false false false" }
[email protected]21abcc742009-10-23 02:52:06453 };
454
[email protected]c1dffe82013-06-26 20:59:05455 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
[email protected]21abcc742009-10-23 02:52:06456
[email protected]a6e602f2010-09-28 22:28:30457 ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
[email protected]c1dffe82013-06-26 20:59:05458 GURL url = embedded_test_server()->GetURL(kTestingPage);
[email protected]21abcc742009-10-23 02:52:06459 ui_test_utils::NavigateToURL(browser(), url);
460
461 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
[email protected]f2159ba2012-04-17 19:13:21462 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]21abcc742009-10-23 02:52:06463
[email protected]ee496952013-01-10 23:17:33464 int tab_index = browser()->tab_strip_model()->active_index();
[email protected]21abcc742009-10-23 02:52:06465 // Press Ctrl+F, which will make the Find box open and request focus.
466 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlF));
467 EXPECT_TRUE(IsViewFocused(VIEW_ID_FIND_IN_PAGE_TEXT_FIELD));
468
469 // Press Escape to close the Find box and move the focus back to the web page.
[email protected]a6e602f2010-09-28 22:28:30470 ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
[email protected]b6d81262011-01-13 17:36:09471 browser(), ui::VKEY_ESCAPE, false, false, false, false));
[email protected]f2159ba2012-04-17 19:13:21472 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]21abcc742009-10-23 02:52:06473
474 // Press Ctrl+F with keydown suppressed shall not open the find box.
475 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlFSuppressKeyDown));
[email protected]f2159ba2012-04-17 19:13:21476 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]21abcc742009-10-23 02:52:06477
478 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlZ));
479 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlZSuppressKeyDown));
480 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlEnter));
481}
[email protected]853300a82010-07-27 21:17:57482#elif defined(OS_MACOSX)
[email protected]cb931932011-05-03 19:57:33483// http://crbug.com/81451
[email protected]4d2451652012-02-14 23:54:26484IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, DISABLED_CommandKeyEvents) {
[email protected]853300a82010-07-27 21:17:57485 static const KeyEventTestData kTestCmdF = {
[email protected]b6d81262011-01-13 17:36:09486 ui::VKEY_F, false, false, false, true,
[email protected]853300a82010-07-27 21:17:57487 false, false, false, false, 2,
488 { "D 91 0 false false false true",
489 "D 70 0 false false false true" }
490 };
491
492 // On Mac we don't send key up events when command modifier is down.
493 static const KeyEventTestData kTestCmdFSuppressKeyDown = {
[email protected]b6d81262011-01-13 17:36:09494 ui::VKEY_F, false, false, false, true,
[email protected]853300a82010-07-27 21:17:57495 true, false, false, false, 3,
496 { "D 91 0 false false false true",
497 "D 70 0 false false false true",
498 "U 91 0 false false false true" }
499 };
500
[email protected]c1dffe82013-06-26 20:59:05501 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
[email protected]853300a82010-07-27 21:17:57502
[email protected]a6e602f2010-09-28 22:28:30503 ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
[email protected]c1dffe82013-06-26 20:59:05504 GURL url = embedded_test_server()->GetURL(kTestingPage);
[email protected]853300a82010-07-27 21:17:57505 ui_test_utils::NavigateToURL(browser(), url);
506
507 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
[email protected]f2159ba2012-04-17 19:13:21508 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]853300a82010-07-27 21:17:57509
[email protected]ee496952013-01-10 23:17:33510 int tab_index = browser()->tab_strip_model()->active_index();
[email protected]853300a82010-07-27 21:17:57511 // Press Cmd+F, which will make the Find box open and request focus.
512 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCmdF));
513 EXPECT_TRUE(IsViewFocused(VIEW_ID_FIND_IN_PAGE_TEXT_FIELD));
514
515 // Press Escape to close the Find box and move the focus back to the web page.
[email protected]a6e602f2010-09-28 22:28:30516 ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
[email protected]b6d81262011-01-13 17:36:09517 browser(), ui::VKEY_ESCAPE, false, false, false, false));
[email protected]f2159ba2012-04-17 19:13:21518 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]853300a82010-07-27 21:17:57519
520 // Press Cmd+F with keydown suppressed shall not open the find box.
521 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCmdFSuppressKeyDown));
[email protected]f2159ba2012-04-17 19:13:21522 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]853300a82010-07-27 21:17:57523}
524#endif
[email protected]21abcc742009-10-23 02:52:06525
[email protected]7ec41882013-05-14 18:24:16526// Flaky: http://crbug.com/81451 , http://crbug.com/129235 ,
527// also fails on Windows.
528IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, DISABLED_AccessKeys) {
[email protected]853300a82010-07-27 21:17:57529#if defined(OS_MACOSX)
530 // On Mac, access keys use ctrl+alt modifiers.
531 static const KeyEventTestData kTestAccessA = {
[email protected]b6d81262011-01-13 17:36:09532 ui::VKEY_A, true, false, true, false,
[email protected]853300a82010-07-27 21:17:57533 false, false, false, false, 6,
534 { "D 17 0 true false false false",
535 "D 18 0 true false true false",
536 "D 65 0 true false true false",
537 "U 65 0 true false true false",
538 "U 18 0 true false true false",
539 "U 17 0 true false false false" }
[email protected]21abcc742009-10-23 02:52:06540 };
541
[email protected]853300a82010-07-27 21:17:57542 static const KeyEventTestData kTestAccessDSuppress = {
[email protected]b6d81262011-01-13 17:36:09543 ui::VKEY_D, true, false, true, false,
[email protected]853300a82010-07-27 21:17:57544 true, true, true, false, 6,
545 { "D 17 0 true false false false",
546 "D 18 0 true false true false",
547 "D 68 0 true false true false",
548 "U 68 0 true false true false",
549 "U 18 0 true false true false",
550 "U 17 0 true false false false" }
551 };
552
553 static const KeyEventTestData kTestAccess1 = {
[email protected]b6d81262011-01-13 17:36:09554 ui::VKEY_1, true, false, true, false,
[email protected]853300a82010-07-27 21:17:57555 false, false, false, false, 6,
556 { "D 17 0 true false false false",
557 "D 18 0 true false true false",
558 "D 49 0 true false true false",
559 "U 49 0 true false true false",
560 "U 18 0 true false true false",
561 "U 17 0 true false false false" }
562 };
563#else
564 static const KeyEventTestData kTestAccessA = {
[email protected]b6d81262011-01-13 17:36:09565 ui::VKEY_A, false, false, true, false,
[email protected]853300a82010-07-27 21:17:57566 false, false, false, false, 4,
567 { "D 18 0 false false true false",
568 "D 65 0 false false true false",
569 "U 65 0 false false true false",
570 "U 18 0 false false true false" }
571 };
572
573 static const KeyEventTestData kTestAccessD = {
[email protected]b6d81262011-01-13 17:36:09574 ui::VKEY_D, false, false, true, false,
[email protected]21abcc742009-10-23 02:52:06575 false, false, false, false, 2,
[email protected]853300a82010-07-27 21:17:57576 { "D 18 0 false false true false",
577 "D 68 0 false false true false" }
[email protected]21abcc742009-10-23 02:52:06578 };
579
[email protected]853300a82010-07-27 21:17:57580 static const KeyEventTestData kTestAccessDSuppress = {
[email protected]b6d81262011-01-13 17:36:09581 ui::VKEY_D, false, false, true, false,
[email protected]21abcc742009-10-23 02:52:06582 true, true, true, false, 4,
[email protected]853300a82010-07-27 21:17:57583 { "D 18 0 false false true false",
584 "D 68 0 false false true false",
585 "U 68 0 false false true false",
586 "U 18 0 false false true false" }
[email protected]21abcc742009-10-23 02:52:06587 };
588
[email protected]ed172d22012-05-10 08:17:13589#if !defined(USE_ASH)
[email protected]853300a82010-07-27 21:17:57590 static const KeyEventTestData kTestAccess1 = {
[email protected]b6d81262011-01-13 17:36:09591 ui::VKEY_1, false, false, true, false,
[email protected]21abcc742009-10-23 02:52:06592 false, false, false, false, 4,
[email protected]853300a82010-07-27 21:17:57593 { "D 18 0 false false true false",
594 "D 49 0 false false true false",
595 "U 49 0 false false true false",
596 "U 18 0 false false true false" }
[email protected]21abcc742009-10-23 02:52:06597 };
[email protected]853300a82010-07-27 21:17:57598#endif
[email protected]ed172d22012-05-10 08:17:13599#endif
[email protected]21abcc742009-10-23 02:52:06600
[email protected]c1dffe82013-06-26 20:59:05601 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
[email protected]21abcc742009-10-23 02:52:06602
[email protected]a6e602f2010-09-28 22:28:30603 ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
[email protected]c1dffe82013-06-26 20:59:05604 GURL url = embedded_test_server()->GetURL(kTestingPage);
[email protected]21abcc742009-10-23 02:52:06605 ui_test_utils::NavigateToURL(browser(), url);
606
[email protected]b8deecd2012-07-30 21:09:44607 content::RunAllPendingInMessageLoop();
[email protected]21abcc742009-10-23 02:52:06608 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
[email protected]f2159ba2012-04-17 19:13:21609 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]21abcc742009-10-23 02:52:06610
[email protected]ee496952013-01-10 23:17:33611 int tab_index = browser()->tab_strip_model()->active_index();
[email protected]21abcc742009-10-23 02:52:06612 // Make sure no element is focused.
613 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L""));
614 // Alt+A should focus the element with accesskey = "A".
[email protected]853300a82010-07-27 21:17:57615 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestAccessA));
[email protected]21abcc742009-10-23 02:52:06616 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L"A"));
617
618 // Blur the focused element.
619 EXPECT_NO_FATAL_FAILURE(SetFocusedElement(tab_index, L""));
620 // Make sure no element is focused.
621 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L""));
[email protected]853300a82010-07-27 21:17:57622
623#if !defined(OS_MACOSX)
[email protected]21abcc742009-10-23 02:52:06624 // Alt+D should move the focus to the location entry.
[email protected]853300a82010-07-27 21:17:57625 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestAccessD));
[email protected]095b55f62010-09-24 08:06:04626
627 // TODO(isherman): This is an experimental change to help diagnose
628 // http://crbug.com/55713
[email protected]b8deecd2012-07-30 21:09:44629 content::RunAllPendingInMessageLoop();
[email protected]0b8fa8b2011-12-07 00:54:52630 EXPECT_TRUE(IsViewFocused(VIEW_ID_OMNIBOX));
[email protected]21abcc742009-10-23 02:52:06631 // No element should be focused, as Alt+D was handled by the browser.
632 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L""));
633
634 // Move the focus back to the web page.
635 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
[email protected]f2159ba2012-04-17 19:13:21636 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]21abcc742009-10-23 02:52:06637
638 // Make sure no element is focused.
639 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L""));
[email protected]853300a82010-07-27 21:17:57640#endif
641
[email protected]21abcc742009-10-23 02:52:06642 // If the keydown event is suppressed, then Alt+D should be handled as an
643 // accesskey rather than an accelerator key. Activation of an accesskey is not
644 // a part of the default action of the key event, so it should not be
645 // suppressed at all.
[email protected]853300a82010-07-27 21:17:57646 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestAccessDSuppress));
[email protected]f2159ba2012-04-17 19:13:21647 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]21abcc742009-10-23 02:52:06648 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L"D"));
649
650 // Blur the focused element.
651 EXPECT_NO_FATAL_FAILURE(SetFocusedElement(tab_index, L""));
652 // Make sure no element is focused.
653 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L""));
[email protected]ed172d22012-05-10 08:17:13654#if !defined(USE_ASH)
655 // On Ash, alt-1..9 are assigned as window selection global accelerators, so
656 // they can not be used as accesskeys.
[email protected]853300a82010-07-27 21:17:57657 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestAccess1));
[email protected]753efc42010-03-09 19:52:16658#if defined(TOOLKIT_GTK)
659 // On GTK, alt-0..9 are assigned as tab selection accelerators, so they can
[email protected]21abcc742009-10-23 02:52:06660 // not be used as accesskeys.
661 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L""));
[email protected]853300a82010-07-27 21:17:57662#else
[email protected]21abcc742009-10-23 02:52:06663 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L"1"));
664#endif
[email protected]ed172d22012-05-10 08:17:13665#endif
[email protected]21abcc742009-10-23 02:52:06666}
667
[email protected]6db98962011-10-04 22:42:49668// Flaky, http://crbug.com/69475.
[email protected]c3bd2972013-09-19 17:48:48669#if defined(OS_LINUX) || (defined(OS_WIN) && defined(USE_AURA))
[email protected]4d2451652012-02-14 23:54:26670#define MAYBE_ReservedAccelerators DISABLED_ReservedAccelerators
[email protected]6db98962011-10-04 22:42:49671#else
672#define MAYBE_ReservedAccelerators ReservedAccelerators
673#endif
674IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, MAYBE_ReservedAccelerators) {
[email protected]c1dffe82013-06-26 20:59:05675 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
[email protected]21abcc742009-10-23 02:52:06676
[email protected]a6e602f2010-09-28 22:28:30677 ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
[email protected]c1dffe82013-06-26 20:59:05678 GURL url = embedded_test_server()->GetURL(kTestingPage);
[email protected]21abcc742009-10-23 02:52:06679 ui_test_utils::NavigateToURL(browser(), url);
680
681 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
[email protected]f2159ba2012-04-17 19:13:21682 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]21abcc742009-10-23 02:52:06683
[email protected]ee496952013-01-10 23:17:33684 ASSERT_EQ(1, browser()->tab_strip_model()->count());
[email protected]0f72a2dc2010-12-06 19:40:23685
[email protected]e4292a232010-12-11 01:46:41686 static const KeyEventTestData kTestCtrlOrCmdT = {
[email protected]3ab6796d32010-12-21 23:56:07687#if defined(OS_MACOSX)
[email protected]b6d81262011-01-13 17:36:09688 ui::VKEY_T, false, false, false, true,
[email protected]853300a82010-07-27 21:17:57689 true, false, false, false, 1,
690 { "D 91 0 false false false true" }
[email protected]3ab6796d32010-12-21 23:56:07691#else
[email protected]b6d81262011-01-13 17:36:09692 ui::VKEY_T, true, false, false, false,
[email protected]3ab6796d32010-12-21 23:56:07693 true, false, false, false, 1,
694 { "D 17 0 true false false false" }
[email protected]e4292a232010-12-11 01:46:41695#endif
[email protected]853300a82010-07-27 21:17:57696 };
[email protected]867125a02009-12-10 06:01:48697
[email protected]a7fe9112012-07-20 02:34:45698 content::WindowedNotificationObserver wait_for_new_tab(
[email protected]884033e2012-04-16 19:38:42699 chrome::NOTIFICATION_TAB_PARENTED,
[email protected]ad50def52011-10-19 23:17:07700 content::NotificationService::AllSources());
[email protected]0f72a2dc2010-12-06 19:40:23701
[email protected]e4292a232010-12-11 01:46:41702 // Press Ctrl/Cmd+T, which will open a new tab. It cannot be suppressed.
703 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(0, kTestCtrlOrCmdT));
[email protected]ae673742011-08-24 19:48:37704 wait_for_new_tab.Wait();
[email protected]853300a82010-07-27 21:17:57705
706 int result_length;
707 ASSERT_NO_FATAL_FAILURE(GetResultLength(0, &result_length));
708 EXPECT_EQ(1, result_length);
709
[email protected]ee496952013-01-10 23:17:33710 EXPECT_EQ(2, browser()->tab_strip_model()->count());
711 ASSERT_EQ(1, browser()->tab_strip_model()->active_index());
[email protected]0f72a2dc2010-12-06 19:40:23712
[email protected]884033e2012-04-16 19:38:42713 // Because of issue <http://crbug.com/65375>, switching back to the first tab
[email protected]0f72a2dc2010-12-06 19:40:23714 // may cause the focus to be grabbed by omnibox. So instead, we load our
715 // testing page in the newly created tab and try Cmd-W here.
716 ui_test_utils::NavigateToURL(browser(), url);
717
718 // Make sure the focus is in the testing page.
719 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
[email protected]f2159ba2012-04-17 19:13:21720 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]0f72a2dc2010-12-06 19:40:23721
[email protected]853300a82010-07-27 21:17:57722 // Reserved accelerators can't be suppressed.
[email protected]0f72a2dc2010-12-06 19:40:23723 ASSERT_NO_FATAL_FAILURE(SuppressAllEvents(1, true));
724
[email protected]13c526cc2013-10-17 05:51:38725 content::WebContentsDestroyedWatcher destroyed_watcher(
726 browser()->tab_strip_model()->GetWebContentsAt(1));
[email protected]e4292a232010-12-11 01:46:41727
728 // Press Ctrl/Cmd+W, which will close the tab.
[email protected]3ab6796d32010-12-21 23:56:07729#if defined(OS_MACOSX)
[email protected]a6e602f2010-09-28 22:28:30730 ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
[email protected]b6d81262011-01-13 17:36:09731 browser(), ui::VKEY_W, false, false, false, true));
[email protected]3ab6796d32010-12-21 23:56:07732#else
733 ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
[email protected]b6d81262011-01-13 17:36:09734 browser(), ui::VKEY_W, true, false, false, false));
[email protected]e4292a232010-12-11 01:46:41735#endif
736
[email protected]13c526cc2013-10-17 05:51:38737 ASSERT_NO_FATAL_FAILURE(destroyed_watcher.Wait());
[email protected]e4292a232010-12-11 01:46:41738
[email protected]ee496952013-01-10 23:17:33739 EXPECT_EQ(1, browser()->tab_strip_model()->count());
[email protected]21abcc742009-10-23 02:52:06740}
[email protected]853300a82010-07-27 21:17:57741
742#if defined(OS_MACOSX)
743IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, EditorKeyBindings) {
[email protected]984aecc2013-03-24 03:53:23744 // TODO(kbr): re-enable: http://crbug.com/222296
745 if (base::mac::IsOSMountainLionOrLater())
746 return;
747
[email protected]853300a82010-07-27 21:17:57748 static const KeyEventTestData kTestCtrlA = {
[email protected]b6d81262011-01-13 17:36:09749 ui::VKEY_A, true, false, false, false,
[email protected]853300a82010-07-27 21:17:57750 false, false, false, false, 4,
751 { "D 17 0 true false false false",
752 "D 65 0 true false false false",
753 "U 65 0 true false false false",
754 "U 17 0 true false false false" }
755 };
756
757 static const KeyEventTestData kTestCtrlF = {
[email protected]b6d81262011-01-13 17:36:09758 ui::VKEY_F, true, false, false, false,
[email protected]853300a82010-07-27 21:17:57759 false, false, false, false, 4,
760 { "D 17 0 true false false false",
761 "D 70 0 true false false false",
762 "U 70 0 true false false false",
763 "U 17 0 true false false false" }
764 };
765
766 static const KeyEventTestData kTestCtrlK = {
[email protected]b6d81262011-01-13 17:36:09767 ui::VKEY_K, true, false, false, false,
[email protected]853300a82010-07-27 21:17:57768 false, false, false, false, 4,
769 { "D 17 0 true false false false",
770 "D 75 0 true false false false",
771 "U 75 0 true false false false",
772 "U 17 0 true false false false" }
773 };
774
[email protected]c1dffe82013-06-26 20:59:05775 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
[email protected]853300a82010-07-27 21:17:57776
[email protected]a6e602f2010-09-28 22:28:30777 ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
[email protected]c1dffe82013-06-26 20:59:05778 GURL url = embedded_test_server()->GetURL(kTestingPage);
[email protected]853300a82010-07-27 21:17:57779 ui_test_utils::NavigateToURL(browser(), url);
780
781 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
[email protected]f2159ba2012-04-17 19:13:21782 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]853300a82010-07-27 21:17:57783
[email protected]ee496952013-01-10 23:17:33784 int tab_index = browser()->tab_strip_model()->active_index();
[email protected]853300a82010-07-27 21:17:57785 ASSERT_NO_FATAL_FAILURE(SetFocusedElement(tab_index, L"A"));
786 ASSERT_NO_FATAL_FAILURE(SetTextBoxValue(tab_index, L"A", L"Hello"));
787 // Move the caret to the beginning of the line.
788 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlA));
789 // Forward one character
790 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlF));
791 // Delete to the end of the line.
792 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlK));
793 EXPECT_NO_FATAL_FAILURE(CheckTextBoxValue(tab_index, L"A", L"H"));
794}
795#endif
796
[email protected]6f39373f2012-09-10 16:02:31797// See http://crbug.com/147579
[email protected]1e09ec82012-12-21 22:48:09798IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, DISABLED_PageUpDownKeys) {
[email protected]853300a82010-07-27 21:17:57799 static const KeyEventTestData kTestPageUp = {
[email protected]b6d81262011-01-13 17:36:09800 ui::VKEY_PRIOR, false, false, false, false,
[email protected]853300a82010-07-27 21:17:57801 false, false, false, false, 2,
802 { "D 33 0 false false false false",
803 "U 33 0 false false false false" }
804 };
805
806 static const KeyEventTestData kTestPageDown = {
[email protected]b6d81262011-01-13 17:36:09807 ui::VKEY_NEXT, false, false, false, false,
[email protected]853300a82010-07-27 21:17:57808 false, false, false, false, 2,
809 { "D 34 0 false false false false",
810 "U 34 0 false false false false" }
811 };
812
[email protected]c1dffe82013-06-26 20:59:05813 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
[email protected]853300a82010-07-27 21:17:57814
[email protected]a6e602f2010-09-28 22:28:30815 ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
[email protected]c1dffe82013-06-26 20:59:05816 GURL url = embedded_test_server()->GetURL(kTestingPage);
[email protected]853300a82010-07-27 21:17:57817 ui_test_utils::NavigateToURL(browser(), url);
818
819 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
[email protected]f2159ba2012-04-17 19:13:21820 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]853300a82010-07-27 21:17:57821
[email protected]ee496952013-01-10 23:17:33822 int tab_index = browser()->tab_strip_model()->active_index();
[email protected]853300a82010-07-27 21:17:57823 ASSERT_NO_FATAL_FAILURE(SetFocusedElement(tab_index, L"A"));
824 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestPageUp));
825 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestPageDown));
826 EXPECT_NO_FATAL_FAILURE(CheckTextBoxValue(tab_index, L"A", L""));
827}
[email protected]629e0342010-07-27 23:30:13828
[email protected]33b36dc2012-02-25 04:46:32829#if defined(OS_WIN)
830// AltKey is enabled only on Windows. See crbug.com/114537.
[email protected]ee19cb202010-08-04 19:48:19831IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, FocusMenuBarByAltKey) {
832 static const KeyEventTestData kTestAltKey = {
[email protected]b6d81262011-01-13 17:36:09833 ui::VKEY_MENU, false, false, false, false,
[email protected]ee19cb202010-08-04 19:48:19834 false, false, false, false, 2,
835 { "D 18 0 false false true false",
836 "U 18 0 false false true false" }
837 };
838
839 static const KeyEventTestData kTestAltKeySuppress = {
[email protected]b6d81262011-01-13 17:36:09840 ui::VKEY_MENU, false, false, false, false,
[email protected]ee19cb202010-08-04 19:48:19841 true, false, false, false, 2,
842 { "D 18 0 false false true false",
843 "U 18 0 false false true false" }
844 };
845
846 static const KeyEventTestData kTestCtrlAltKey = {
[email protected]b6d81262011-01-13 17:36:09847 ui::VKEY_MENU, true, false, false, false,
[email protected]ee19cb202010-08-04 19:48:19848 false, false, false, false, 4,
849 { "D 17 0 true false false false",
850 "D 18 0 true false true false",
851 "U 18 0 true false true false",
852 "U 17 0 true false false false" }
853 };
854
[email protected]c1dffe82013-06-26 20:59:05855 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
[email protected]ee19cb202010-08-04 19:48:19856
[email protected]a6e602f2010-09-28 22:28:30857 ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
[email protected]c1dffe82013-06-26 20:59:05858 GURL url = embedded_test_server()->GetURL(kTestingPage);
[email protected]ee19cb202010-08-04 19:48:19859 ui_test_utils::NavigateToURL(browser(), url);
860
861 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
[email protected]f2159ba2012-04-17 19:13:21862 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]ee19cb202010-08-04 19:48:19863
[email protected]ee496952013-01-10 23:17:33864 int tab_index = browser()->tab_strip_model()->active_index();
[email protected]ee19cb202010-08-04 19:48:19865 // Press and release Alt key to focus wrench menu button.
866 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestAltKey));
867 EXPECT_TRUE(IsViewFocused(VIEW_ID_APP_MENU));
868
869 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
[email protected]f2159ba2012-04-17 19:13:21870 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]ee19cb202010-08-04 19:48:19871
872 // Alt key can be suppressed.
873 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestAltKeySuppress));
[email protected]f2159ba2012-04-17 19:13:21874 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]ee19cb202010-08-04 19:48:19875
876 // Ctrl+Alt should have no effect.
877 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlAltKey));
[email protected]f2159ba2012-04-17 19:13:21878 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]ee19cb202010-08-04 19:48:19879}
880#endif
881
[email protected]629e0342010-07-27 23:30:13882} // namespace