blob: ee1bbc5e44b5ba26a905fd3358c90ffd2fec3480 [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]b6d81262011-01-13 17:36:0929#include "ui/base/keycodes/keyboard_codes.h"
[email protected]5c4e4482013-03-03 00:09:1830#include "ui/views/controls/textfield/textfield.h"
[email protected]21abcc742009-10-23 02:52:0631
[email protected]984aecc2013-03-24 03:53:2332// TODO(kbr): remove: http://crbug.com/222296
33#if defined(OS_MACOSX)
34#import "base/mac/mac_util.h"
35#endif
36
[email protected]766a7082012-02-03 23:39:1537using content::DomOperationNotificationDetails;
[email protected]c5eed492012-01-04 17:07:5038using content::NavigationController;
[email protected]eaabba22012-03-07 15:02:1139using content::RenderViewHost;
[email protected]c5eed492012-01-04 17:07:5040
[email protected]21abcc742009-10-23 02:52:0641namespace {
42
[email protected]c1dffe82013-06-26 20:59:0543const char kTestingPage[] = "/keyevents_test.html";
[email protected]06bc5d92013-01-02 22:44:1344const char kSuppressEventJS[] =
45 "window.domAutomationController.send(setDefaultAction('%ls', %ls));";
46const char kGetResultJS[] =
47 "window.domAutomationController.send(keyEventResult[%d]);";
48const char kGetResultLengthJS[] =
49 "window.domAutomationController.send(keyEventResult.length);";
50const char kGetFocusedElementJS[] =
51 "window.domAutomationController.send(focusedElement);";
52const char kSetFocusedElementJS[] =
53 "window.domAutomationController.send(setFocusedElement('%ls'));";
54const char kGetTextBoxValueJS[] =
55 "window.domAutomationController.send("
56 " document.getElementById('%ls').value);";
57const char kSetTextBoxValueJS[] =
58 "window.domAutomationController.send("
59 " document.getElementById('%ls').value = '%ls');";
60const char kStartTestJS[] =
61 "window.domAutomationController.send(startTest(%d));";
[email protected]21abcc742009-10-23 02:52:0662
63// Maximum lenght of the result array in KeyEventTestData structure.
64const size_t kMaxResultLength = 10;
65
66// A structure holding test data of a keyboard event.
67// Each keyboard event may generate multiple result strings representing
68// the result of keydown, keypress, keyup and textInput events.
69// For keydown, keypress and keyup events, the format of the result string is:
[email protected]853300a82010-07-27 21:17:5770// <type> <keyCode> <charCode> <ctrlKey> <shiftKey> <altKey> <commandKey>
[email protected]21abcc742009-10-23 02:52:0671// where <type> may be 'D' (keydown), 'P' (keypress) or 'U' (keyup).
[email protected]853300a82010-07-27 21:17:5772// <ctrlKey>, <shiftKey> <altKey> and <commandKey> are boolean value indicating
73// the state of corresponding modifier key.
[email protected]21abcc742009-10-23 02:52:0674// For textInput event, the format is: T <text>, where <text> is the text to be
75// input.
76// Please refer to chrome/test/data/keyevents_test.html for details.
77struct KeyEventTestData {
[email protected]b6d81262011-01-13 17:36:0978 ui::KeyboardCode key;
[email protected]21abcc742009-10-23 02:52:0679 bool ctrl;
80 bool shift;
81 bool alt;
[email protected]853300a82010-07-27 21:17:5782 bool command;
[email protected]21abcc742009-10-23 02:52:0683
84 bool suppress_keydown;
85 bool suppress_keypress;
86 bool suppress_keyup;
87 bool suppress_textinput;
88
89 int result_length;
90 const char* const result[kMaxResultLength];
91};
92
93const wchar_t* GetBoolString(bool value) {
94 return value ? L"true" : L"false";
95}
96
97// A class to help wait for the finish of a key event test.
[email protected]6c2381d2011-10-19 02:52:5398class TestFinishObserver : public content::NotificationObserver {
[email protected]21abcc742009-10-23 02:52:0699 public:
100 explicit TestFinishObserver(RenderViewHost* render_view_host)
101 : finished_(false), waiting_(false) {
[email protected]766a7082012-02-03 23:39:15102 registrar_.Add(this, content::NOTIFICATION_DOM_OPERATION_RESPONSE,
[email protected]6c2381d2011-10-19 02:52:53103 content::Source<RenderViewHost>(render_view_host));
[email protected]21abcc742009-10-23 02:52:06104 }
105
106 bool WaitForFinish() {
107 if (!finished_) {
108 waiting_ = true;
[email protected]729eb632012-07-26 04:45:26109 content::RunMessageLoop();
[email protected]21abcc742009-10-23 02:52:06110 waiting_ = false;
111 }
112 return finished_;
113 }
114
[email protected]432115822011-07-10 15:52:27115 virtual void Observe(int type,
[email protected]6c2381d2011-10-19 02:52:53116 const content::NotificationSource& source,
[email protected]b94584a2013-02-07 03:02:08117 const content::NotificationDetails& details) OVERRIDE {
[email protected]766a7082012-02-03 23:39:15118 DCHECK(type == content::NOTIFICATION_DOM_OPERATION_RESPONSE);
[email protected]6c2381d2011-10-19 02:52:53119 content::Details<DomOperationNotificationDetails> dom_op_details(details);
[email protected]21abcc742009-10-23 02:52:06120 // We might receive responses for other script execution, but we only
121 // care about the test finished message.
[email protected]766a7082012-02-03 23:39:15122 if (dom_op_details->json == "\"FINISHED\"") {
[email protected]21abcc742009-10-23 02:52:06123 finished_ = true;
124 if (waiting_)
[email protected]b3a25092013-05-28 22:08:16125 base::MessageLoopForUI::current()->Quit();
[email protected]21abcc742009-10-23 02:52:06126 }
127 }
128
129 private:
130 bool finished_;
131 bool waiting_;
[email protected]6c2381d2011-10-19 02:52:53132 content::NotificationRegistrar registrar_;
[email protected]21abcc742009-10-23 02:52:06133
134 DISALLOW_COPY_AND_ASSIGN(TestFinishObserver);
135};
136
137class BrowserKeyEventsTest : public InProcessBrowserTest {
138 public:
[email protected]90ca44272012-07-18 18:15:48139 BrowserKeyEventsTest() {}
[email protected]21abcc742009-10-23 02:52:06140
[email protected]21abcc742009-10-23 02:52:06141 bool IsViewFocused(ViewID vid) {
142 return ui_test_utils::IsViewFocused(browser(), vid);
143 }
144
145 void ClickOnView(ViewID vid) {
146 ui_test_utils::ClickOnView(browser(), vid);
147 }
148
149 // Set the suppress flag of an event specified by |type|. If |suppress| is
150 // true then the web page will suppress all events with |type|. Following
151 // event types are supported: keydown, keypress, keyup and textInput.
152 void SuppressEventByType(int tab_index, const wchar_t* type, bool suppress) {
[email protected]ee496952013-01-10 23:17:33153 ASSERT_LT(tab_index, browser()->tab_strip_model()->count());
[email protected]21abcc742009-10-23 02:52:06154 bool actual;
[email protected]b6987e02013-01-04 18:30:43155 ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
[email protected]ee496952013-01-10 23:17:33156 browser()->tab_strip_model()->GetWebContentsAt(tab_index),
[email protected]1870d5cf2011-05-12 01:55:40157 base::StringPrintf(kSuppressEventJS, type, GetBoolString(!suppress)),
[email protected]21abcc742009-10-23 02:52:06158 &actual));
159 ASSERT_EQ(!suppress, actual);
160 }
161
162 void SuppressEvents(int tab_index, bool keydown, bool keypress,
163 bool keyup, bool textinput) {
164 ASSERT_NO_FATAL_FAILURE(
165 SuppressEventByType(tab_index, L"keydown", keydown));
166 ASSERT_NO_FATAL_FAILURE(
167 SuppressEventByType(tab_index, L"keypress", keypress));
168 ASSERT_NO_FATAL_FAILURE(
169 SuppressEventByType(tab_index, L"keyup", keyup));
170 ASSERT_NO_FATAL_FAILURE(
171 SuppressEventByType(tab_index, L"textInput", textinput));
172 }
173
174 void SuppressAllEvents(int tab_index, bool suppress) {
175 SuppressEvents(tab_index, suppress, suppress, suppress, suppress);
176 }
177
178 void GetResultLength(int tab_index, int* length) {
[email protected]ee496952013-01-10 23:17:33179 ASSERT_LT(tab_index, browser()->tab_strip_model()->count());
[email protected]b6987e02013-01-04 18:30:43180 ASSERT_TRUE(content::ExecuteScriptAndExtractInt(
[email protected]ee496952013-01-10 23:17:33181 browser()->tab_strip_model()->GetWebContentsAt(tab_index),
[email protected]06bc5d92013-01-02 22:44:13182 kGetResultLengthJS,
183 length));
[email protected]21abcc742009-10-23 02:52:06184 }
185
186 void CheckResult(int tab_index, int length, const char* const result[]) {
[email protected]ee496952013-01-10 23:17:33187 ASSERT_LT(tab_index, browser()->tab_strip_model()->count());
[email protected]21abcc742009-10-23 02:52:06188 int actual_length;
189 ASSERT_NO_FATAL_FAILURE(GetResultLength(tab_index, &actual_length));
190 ASSERT_GE(actual_length, length);
191 for (int i = 0; i < actual_length; ++i) {
192 std::string actual;
[email protected]b6987e02013-01-04 18:30:43193 ASSERT_TRUE(content::ExecuteScriptAndExtractString(
[email protected]ee496952013-01-10 23:17:33194 browser()->tab_strip_model()->GetWebContentsAt(tab_index),
[email protected]06bc5d92013-01-02 22:44:13195 base::StringPrintf(kGetResultJS, i),
196 &actual));
[email protected]21abcc742009-10-23 02:52:06197
198 // If more events were received than expected, then the additional events
199 // must be keyup events.
200 if (i < length)
201 ASSERT_STREQ(result[i], actual.c_str());
202 else
203 ASSERT_EQ('U', actual[0]);
204 }
205 }
206
207 void CheckFocusedElement(int tab_index, const wchar_t* focused) {
[email protected]ee496952013-01-10 23:17:33208 ASSERT_LT(tab_index, browser()->tab_strip_model()->count());
[email protected]21abcc742009-10-23 02:52:06209 std::string actual;
[email protected]b6987e02013-01-04 18:30:43210 ASSERT_TRUE(content::ExecuteScriptAndExtractString(
[email protected]ee496952013-01-10 23:17:33211 browser()->tab_strip_model()->GetWebContentsAt(tab_index),
[email protected]06bc5d92013-01-02 22:44:13212 kGetFocusedElementJS,
213 &actual));
[email protected]47e870b2013-02-24 21:14:53214 ASSERT_EQ(WideToUTF8(focused), actual);
[email protected]21abcc742009-10-23 02:52:06215 }
216
217 void SetFocusedElement(int tab_index, const wchar_t* focused) {
[email protected]ee496952013-01-10 23:17:33218 ASSERT_LT(tab_index, browser()->tab_strip_model()->count());
[email protected]21abcc742009-10-23 02:52:06219 bool actual;
[email protected]b6987e02013-01-04 18:30:43220 ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
[email protected]ee496952013-01-10 23:17:33221 browser()->tab_strip_model()->GetWebContentsAt(tab_index),
[email protected]1870d5cf2011-05-12 01:55:40222 base::StringPrintf(kSetFocusedElementJS, focused),
[email protected]21abcc742009-10-23 02:52:06223 &actual));
224 ASSERT_TRUE(actual);
225 }
226
227 void CheckTextBoxValue(int tab_index, const wchar_t* id,
228 const wchar_t* value) {
[email protected]ee496952013-01-10 23:17:33229 ASSERT_LT(tab_index, browser()->tab_strip_model()->count());
[email protected]21abcc742009-10-23 02:52:06230 std::string actual;
[email protected]b6987e02013-01-04 18:30:43231 ASSERT_TRUE(content::ExecuteScriptAndExtractString(
[email protected]ee496952013-01-10 23:17:33232 browser()->tab_strip_model()->GetWebContentsAt(tab_index),
[email protected]1870d5cf2011-05-12 01:55:40233 base::StringPrintf(kGetTextBoxValueJS, id),
[email protected]21abcc742009-10-23 02:52:06234 &actual));
[email protected]47e870b2013-02-24 21:14:53235 ASSERT_EQ(WideToUTF8(value), actual);
[email protected]21abcc742009-10-23 02:52:06236 }
237
[email protected]853300a82010-07-27 21:17:57238 void SetTextBoxValue(int tab_index, const wchar_t* id,
239 const wchar_t* value) {
[email protected]ee496952013-01-10 23:17:33240 ASSERT_LT(tab_index, browser()->tab_strip_model()->count());
[email protected]853300a82010-07-27 21:17:57241 std::string actual;
[email protected]b6987e02013-01-04 18:30:43242 ASSERT_TRUE(content::ExecuteScriptAndExtractString(
[email protected]ee496952013-01-10 23:17:33243 browser()->tab_strip_model()->GetWebContentsAt(tab_index),
[email protected]1870d5cf2011-05-12 01:55:40244 base::StringPrintf(kSetTextBoxValueJS, id, value),
[email protected]853300a82010-07-27 21:17:57245 &actual));
[email protected]47e870b2013-02-24 21:14:53246 ASSERT_EQ(WideToUTF8(value), actual);
[email protected]853300a82010-07-27 21:17:57247 }
248
249 void StartTest(int tab_index, int result_length) {
[email protected]ee496952013-01-10 23:17:33250 ASSERT_LT(tab_index, browser()->tab_strip_model()->count());
[email protected]21abcc742009-10-23 02:52:06251 bool actual;
[email protected]b6987e02013-01-04 18:30:43252 ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
[email protected]ee496952013-01-10 23:17:33253 browser()->tab_strip_model()->GetWebContentsAt(tab_index),
[email protected]06bc5d92013-01-02 22:44:13254 base::StringPrintf(kStartTestJS, result_length),
255 &actual));
[email protected]21abcc742009-10-23 02:52:06256 ASSERT_TRUE(actual);
257 }
258
259 void TestKeyEvent(int tab_index, const KeyEventTestData& test) {
[email protected]ee496952013-01-10 23:17:33260 ASSERT_LT(tab_index, browser()->tab_strip_model()->count());
261 ASSERT_EQ(tab_index, browser()->tab_strip_model()->active_index());
[email protected]21abcc742009-10-23 02:52:06262
263 // Inform our testing web page that we are about to start testing a key
264 // event.
[email protected]853300a82010-07-27 21:17:57265 ASSERT_NO_FATAL_FAILURE(StartTest(tab_index, test.result_length));
[email protected]21abcc742009-10-23 02:52:06266 ASSERT_NO_FATAL_FAILURE(SuppressEvents(
267 tab_index, test.suppress_keydown, test.suppress_keypress,
268 test.suppress_keyup, test.suppress_textinput));
269
270 // We need to create a finish observer before sending the key event,
271 // because the test finished message might be arrived before returning
[email protected]a6e602f2010-09-28 22:28:30272 // from the SendKeyPressSync() method.
[email protected]21abcc742009-10-23 02:52:06273 TestFinishObserver finish_observer(
[email protected]ee496952013-01-10 23:17:33274 browser()->tab_strip_model()->GetWebContentsAt(tab_index)->
275 GetRenderViewHost());
[email protected]21abcc742009-10-23 02:52:06276
[email protected]a6e602f2010-09-28 22:28:30277 ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
278 browser(), test.key, test.ctrl, test.shift, test.alt, test.command));
[email protected]21abcc742009-10-23 02:52:06279 ASSERT_TRUE(finish_observer.WaitForFinish());
280 ASSERT_NO_FATAL_FAILURE(CheckResult(
281 tab_index, test.result_length, test.result));
282 }
283
284 std::string GetTestDataDescription(const KeyEventTestData& data) {
[email protected]1870d5cf2011-05-12 01:55:40285 std::string desc = base::StringPrintf(
[email protected]853300a82010-07-27 21:17:57286 " VKEY:0x%02x, ctrl:%d, shift:%d, alt:%d, command:%d\n"
[email protected]21abcc742009-10-23 02:52:06287 " Suppress: keydown:%d, keypress:%d, keyup:%d, textInput:%d\n"
288 " Expected results(%d):\n",
[email protected]853300a82010-07-27 21:17:57289 data.key, data.ctrl, data.shift, data.alt, data.command,
[email protected]21abcc742009-10-23 02:52:06290 data.suppress_keydown, data.suppress_keypress, data.suppress_keyup,
291 data.suppress_textinput, data.result_length);
292 for (int i = 0; i < data.result_length; ++i) {
293 desc.append(" ");
294 desc.append(data.result[i]);
295 desc.append("\n");
296 }
297 return desc;
298 }
299};
300
[email protected]cb931932011-05-03 19:57:33301#if defined(OS_MACOSX)
[email protected]92c01742011-05-04 23:35:21302// http://crbug.com/81451
[email protected]bf43a382012-05-22 23:33:53303#define MAYBE_NormalKeyEvents DISABLED_NormalKeyEvents
304#elif defined(OS_LINUX)
305// http://crbug.com/129235
[email protected]e00ccc92012-11-01 17:32:30306#define MAYBE_NormalKeyEvents DISABLED_NormalKeyEvents
[email protected]cb931932011-05-03 19:57:33307#else
[email protected]bf43a382012-05-22 23:33:53308#define MAYBE_NormalKeyEvents NormalKeyEvents
[email protected]cb931932011-05-03 19:57:33309#endif
310
[email protected]bf43a382012-05-22 23:33:53311IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, MAYBE_NormalKeyEvents) {
[email protected]21abcc742009-10-23 02:52:06312 static const KeyEventTestData kTestNoInput[] = {
313 // a
[email protected]b6d81262011-01-13 17:36:09314 { ui::VKEY_A, false, false, false, false,
[email protected]21abcc742009-10-23 02:52:06315 false, false, false, false, 3,
[email protected]853300a82010-07-27 21:17:57316 { "D 65 0 false false false false",
317 "P 97 97 false false false false",
318 "U 65 0 false false false false" } },
[email protected]21abcc742009-10-23 02:52:06319 // shift-a
[email protected]b6d81262011-01-13 17:36:09320 { ui::VKEY_A, false, true, false, false,
[email protected]21abcc742009-10-23 02:52:06321 false, false, false, false, 5,
[email protected]853300a82010-07-27 21:17:57322 { "D 16 0 false true false false",
323 "D 65 0 false true false false",
324 "P 65 65 false true false false",
325 "U 65 0 false true false false",
326 "U 16 0 false true false false" } },
[email protected]21abcc742009-10-23 02:52:06327 // a, suppress keydown
[email protected]b6d81262011-01-13 17:36:09328 { ui::VKEY_A, false, false, false, false,
[email protected]21abcc742009-10-23 02:52:06329 true, false, false, false, 2,
[email protected]853300a82010-07-27 21:17:57330 { "D 65 0 false false false false",
331 "U 65 0 false false false false" } },
[email protected]21abcc742009-10-23 02:52:06332 };
333
334 static const KeyEventTestData kTestWithInput[] = {
335 // a
[email protected]b6d81262011-01-13 17:36:09336 { ui::VKEY_A, false, false, false, false,
[email protected]21abcc742009-10-23 02:52:06337 false, false, false, false, 4,
[email protected]853300a82010-07-27 21:17:57338 { "D 65 0 false false false false",
339 "P 97 97 false false false false",
[email protected]21abcc742009-10-23 02:52:06340 "T a",
[email protected]853300a82010-07-27 21:17:57341 "U 65 0 false false false false" } },
[email protected]21abcc742009-10-23 02:52:06342 // shift-a
[email protected]b6d81262011-01-13 17:36:09343 { ui::VKEY_A, false, true, false, false,
[email protected]21abcc742009-10-23 02:52:06344 false, false, false, false, 6,
[email protected]853300a82010-07-27 21:17:57345 { "D 16 0 false true false false",
346 "D 65 0 false true false false",
347 "P 65 65 false true false false",
[email protected]21abcc742009-10-23 02:52:06348 "T A",
[email protected]853300a82010-07-27 21:17:57349 "U 65 0 false true false false",
350 "U 16 0 false true false false" } },
[email protected]21abcc742009-10-23 02:52:06351 // a, suppress keydown
[email protected]b6d81262011-01-13 17:36:09352 { ui::VKEY_A, false, false, false, false,
[email protected]21abcc742009-10-23 02:52:06353 true, false, false, false, 2,
[email protected]853300a82010-07-27 21:17:57354 { "D 65 0 false false false false",
355 "U 65 0 false false false false" } },
[email protected]21abcc742009-10-23 02:52:06356 // a, suppress keypress
[email protected]b6d81262011-01-13 17:36:09357 { ui::VKEY_A, false, false, false, false,
[email protected]21abcc742009-10-23 02:52:06358 false, true, false, false, 3,
[email protected]853300a82010-07-27 21:17:57359 { "D 65 0 false false false false",
360 "P 97 97 false false false false",
361 "U 65 0 false false false false" } },
[email protected]21abcc742009-10-23 02:52:06362 // a, suppress textInput
[email protected]b6d81262011-01-13 17:36:09363 { ui::VKEY_A, false, false, false, false,
[email protected]21abcc742009-10-23 02:52:06364 false, false, false, true, 4,
[email protected]853300a82010-07-27 21:17:57365 { "D 65 0 false false false false",
366 "P 97 97 false false false false",
[email protected]21abcc742009-10-23 02:52:06367 "T a",
[email protected]853300a82010-07-27 21:17:57368 "U 65 0 false false false false" } },
[email protected]21abcc742009-10-23 02:52:06369 };
370
[email protected]c1dffe82013-06-26 20:59:05371 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
[email protected]21abcc742009-10-23 02:52:06372
[email protected]a6e602f2010-09-28 22:28:30373 ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
[email protected]c1dffe82013-06-26 20:59:05374 GURL url = embedded_test_server()->GetURL(kTestingPage);
[email protected]21abcc742009-10-23 02:52:06375 ui_test_utils::NavigateToURL(browser(), url);
376
377 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
[email protected]f2159ba2012-04-17 19:13:21378 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]21abcc742009-10-23 02:52:06379
[email protected]ee496952013-01-10 23:17:33380 int tab_index = browser()->tab_strip_model()->active_index();
[email protected]21abcc742009-10-23 02:52:06381 for (size_t i = 0; i < arraysize(kTestNoInput); ++i) {
382 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestNoInput[i]))
383 << "kTestNoInput[" << i << "] failed:\n"
384 << GetTestDataDescription(kTestNoInput[i]);
385 }
386
[email protected]853300a82010-07-27 21:17:57387 // Input in normal text box.
[email protected]21abcc742009-10-23 02:52:06388 ASSERT_NO_FATAL_FAILURE(SetFocusedElement(tab_index, L"A"));
389 for (size_t i = 0; i < arraysize(kTestWithInput); ++i) {
390 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestWithInput[i]))
[email protected]853300a82010-07-27 21:17:57391 << "kTestWithInput[" << i << "] in text box failed:\n"
[email protected]21abcc742009-10-23 02:52:06392 << GetTestDataDescription(kTestWithInput[i]);
393 }
[email protected]21abcc742009-10-23 02:52:06394 EXPECT_NO_FATAL_FAILURE(CheckTextBoxValue(tab_index, L"A", L"aA"));
[email protected]853300a82010-07-27 21:17:57395
396 // Input in password box.
397 ASSERT_NO_FATAL_FAILURE(SetFocusedElement(tab_index, L"B"));
398 for (size_t i = 0; i < arraysize(kTestWithInput); ++i) {
399 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestWithInput[i]))
400 << "kTestWithInput[" << i << "] in password box failed:\n"
401 << GetTestDataDescription(kTestWithInput[i]);
402 }
403 EXPECT_NO_FATAL_FAILURE(CheckTextBoxValue(tab_index, L"B", L"aA"));
[email protected]21abcc742009-10-23 02:52:06404}
405
[email protected]853300a82010-07-27 21:17:57406#if defined(OS_WIN) || defined(OS_LINUX)
[email protected]bf43a382012-05-22 23:33:53407
[email protected]e8248a22013-08-07 18:25:20408#if defined(OS_LINUX) || (defined(OS_WIN) && defined(USE_AURA))
409// Linux: http://crbug.com/129235
410// Win Aura: crbug.com/269564
[email protected]e00ccc92012-11-01 17:32:30411#define MAYBE_CtrlKeyEvents DISABLED_CtrlKeyEvents
[email protected]bf43a382012-05-22 23:33:53412#else
413#define MAYBE_CtrlKeyEvents CtrlKeyEvents
414#endif
415
416IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, MAYBE_CtrlKeyEvents) {
[email protected]21abcc742009-10-23 02:52:06417 static const KeyEventTestData kTestCtrlF = {
[email protected]b6d81262011-01-13 17:36:09418 ui::VKEY_F, true, false, false, false,
[email protected]21abcc742009-10-23 02:52:06419 false, false, false, false, 2,
[email protected]853300a82010-07-27 21:17:57420 { "D 17 0 true false false false",
421 "D 70 0 true false false false" }
[email protected]21abcc742009-10-23 02:52:06422 };
423
424 static const KeyEventTestData kTestCtrlFSuppressKeyDown = {
[email protected]b6d81262011-01-13 17:36:09425 ui::VKEY_F, 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 70 0 true false false false",
429 "U 70 0 true false false false",
430 "U 17 0 true false false false" }
[email protected]21abcc742009-10-23 02:52:06431 };
432
433 // Ctrl+Z doesn't bind to any accelerators, which then should generate a
434 // keypress event with charCode=26.
435 static const KeyEventTestData kTestCtrlZ = {
[email protected]b6d81262011-01-13 17:36:09436 ui::VKEY_Z, true, false, false, false,
[email protected]21abcc742009-10-23 02:52:06437 false, false, false, false, 5,
[email protected]853300a82010-07-27 21:17:57438 { "D 17 0 true false false false",
439 "D 90 0 true false false false",
440 "P 26 26 true false false false",
441 "U 90 0 true false false false",
442 "U 17 0 true false false false" }
[email protected]21abcc742009-10-23 02:52:06443 };
444
445 static const KeyEventTestData kTestCtrlZSuppressKeyDown = {
[email protected]b6d81262011-01-13 17:36:09446 ui::VKEY_Z, true, false, false, false,
[email protected]21abcc742009-10-23 02:52:06447 true, false, false, false, 4,
[email protected]853300a82010-07-27 21:17:57448 { "D 17 0 true false false false",
449 "D 90 0 true false false false",
450 "U 90 0 true false false false",
451 "U 17 0 true false false false" }
[email protected]21abcc742009-10-23 02:52:06452 };
453
454 // Ctrl+Enter shall generate a keypress event with charCode=10 (LF).
455 static const KeyEventTestData kTestCtrlEnter = {
[email protected]b6d81262011-01-13 17:36:09456 ui::VKEY_RETURN, true, false, false, false,
[email protected]21abcc742009-10-23 02:52:06457 false, false, false, false, 5,
[email protected]853300a82010-07-27 21:17:57458 { "D 17 0 true false false false",
459 "D 13 0 true false false false",
460 "P 10 10 true false false false",
461 "U 13 0 true false false false",
462 "U 17 0 true false false false" }
[email protected]21abcc742009-10-23 02:52:06463 };
464
[email protected]c1dffe82013-06-26 20:59:05465 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
[email protected]21abcc742009-10-23 02:52:06466
[email protected]a6e602f2010-09-28 22:28:30467 ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
[email protected]c1dffe82013-06-26 20:59:05468 GURL url = embedded_test_server()->GetURL(kTestingPage);
[email protected]21abcc742009-10-23 02:52:06469 ui_test_utils::NavigateToURL(browser(), url);
470
471 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
[email protected]f2159ba2012-04-17 19:13:21472 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]21abcc742009-10-23 02:52:06473
[email protected]ee496952013-01-10 23:17:33474 int tab_index = browser()->tab_strip_model()->active_index();
[email protected]21abcc742009-10-23 02:52:06475 // Press Ctrl+F, which will make the Find box open and request focus.
476 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlF));
477 EXPECT_TRUE(IsViewFocused(VIEW_ID_FIND_IN_PAGE_TEXT_FIELD));
478
479 // Press Escape to close the Find box and move the focus back to the web page.
[email protected]a6e602f2010-09-28 22:28:30480 ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
[email protected]b6d81262011-01-13 17:36:09481 browser(), ui::VKEY_ESCAPE, false, false, false, false));
[email protected]f2159ba2012-04-17 19:13:21482 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]21abcc742009-10-23 02:52:06483
484 // Press Ctrl+F with keydown suppressed shall not open the find box.
485 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlFSuppressKeyDown));
[email protected]f2159ba2012-04-17 19:13:21486 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]21abcc742009-10-23 02:52:06487
488 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlZ));
489 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlZSuppressKeyDown));
490 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlEnter));
491}
[email protected]853300a82010-07-27 21:17:57492#elif defined(OS_MACOSX)
[email protected]cb931932011-05-03 19:57:33493// http://crbug.com/81451
[email protected]4d2451652012-02-14 23:54:26494IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, DISABLED_CommandKeyEvents) {
[email protected]853300a82010-07-27 21:17:57495 static const KeyEventTestData kTestCmdF = {
[email protected]b6d81262011-01-13 17:36:09496 ui::VKEY_F, false, false, false, true,
[email protected]853300a82010-07-27 21:17:57497 false, false, false, false, 2,
498 { "D 91 0 false false false true",
499 "D 70 0 false false false true" }
500 };
501
502 // On Mac we don't send key up events when command modifier is down.
503 static const KeyEventTestData kTestCmdFSuppressKeyDown = {
[email protected]b6d81262011-01-13 17:36:09504 ui::VKEY_F, false, false, false, true,
[email protected]853300a82010-07-27 21:17:57505 true, false, false, false, 3,
506 { "D 91 0 false false false true",
507 "D 70 0 false false false true",
508 "U 91 0 false false false true" }
509 };
510
[email protected]c1dffe82013-06-26 20:59:05511 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
[email protected]853300a82010-07-27 21:17:57512
[email protected]a6e602f2010-09-28 22:28:30513 ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
[email protected]c1dffe82013-06-26 20:59:05514 GURL url = embedded_test_server()->GetURL(kTestingPage);
[email protected]853300a82010-07-27 21:17:57515 ui_test_utils::NavigateToURL(browser(), url);
516
517 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
[email protected]f2159ba2012-04-17 19:13:21518 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]853300a82010-07-27 21:17:57519
[email protected]ee496952013-01-10 23:17:33520 int tab_index = browser()->tab_strip_model()->active_index();
[email protected]853300a82010-07-27 21:17:57521 // Press Cmd+F, which will make the Find box open and request focus.
522 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCmdF));
523 EXPECT_TRUE(IsViewFocused(VIEW_ID_FIND_IN_PAGE_TEXT_FIELD));
524
525 // Press Escape to close the Find box and move the focus back to the web page.
[email protected]a6e602f2010-09-28 22:28:30526 ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
[email protected]b6d81262011-01-13 17:36:09527 browser(), ui::VKEY_ESCAPE, false, false, false, false));
[email protected]f2159ba2012-04-17 19:13:21528 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]853300a82010-07-27 21:17:57529
530 // Press Cmd+F with keydown suppressed shall not open the find box.
531 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCmdFSuppressKeyDown));
[email protected]f2159ba2012-04-17 19:13:21532 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]853300a82010-07-27 21:17:57533}
534#endif
[email protected]21abcc742009-10-23 02:52:06535
[email protected]7ec41882013-05-14 18:24:16536// Flaky: http://crbug.com/81451 , http://crbug.com/129235 ,
537// also fails on Windows.
538IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, DISABLED_AccessKeys) {
[email protected]853300a82010-07-27 21:17:57539#if defined(OS_MACOSX)
540 // On Mac, access keys use ctrl+alt modifiers.
541 static const KeyEventTestData kTestAccessA = {
[email protected]b6d81262011-01-13 17:36:09542 ui::VKEY_A, true, false, true, false,
[email protected]853300a82010-07-27 21:17:57543 false, false, false, false, 6,
544 { "D 17 0 true false false false",
545 "D 18 0 true false true false",
546 "D 65 0 true false true false",
547 "U 65 0 true false true false",
548 "U 18 0 true false true false",
549 "U 17 0 true false false false" }
[email protected]21abcc742009-10-23 02:52:06550 };
551
[email protected]853300a82010-07-27 21:17:57552 static const KeyEventTestData kTestAccessDSuppress = {
[email protected]b6d81262011-01-13 17:36:09553 ui::VKEY_D, true, false, true, false,
[email protected]853300a82010-07-27 21:17:57554 true, true, true, false, 6,
555 { "D 17 0 true false false false",
556 "D 18 0 true false true false",
557 "D 68 0 true false true false",
558 "U 68 0 true false true false",
559 "U 18 0 true false true false",
560 "U 17 0 true false false false" }
561 };
562
563 static const KeyEventTestData kTestAccess1 = {
[email protected]b6d81262011-01-13 17:36:09564 ui::VKEY_1, true, false, true, false,
[email protected]853300a82010-07-27 21:17:57565 false, false, false, false, 6,
566 { "D 17 0 true false false false",
567 "D 18 0 true false true false",
568 "D 49 0 true false true false",
569 "U 49 0 true false true false",
570 "U 18 0 true false true false",
571 "U 17 0 true false false false" }
572 };
573#else
574 static const KeyEventTestData kTestAccessA = {
[email protected]b6d81262011-01-13 17:36:09575 ui::VKEY_A, false, false, true, false,
[email protected]853300a82010-07-27 21:17:57576 false, false, false, false, 4,
577 { "D 18 0 false false true false",
578 "D 65 0 false false true false",
579 "U 65 0 false false true false",
580 "U 18 0 false false true false" }
581 };
582
583 static const KeyEventTestData kTestAccessD = {
[email protected]b6d81262011-01-13 17:36:09584 ui::VKEY_D, false, false, true, false,
[email protected]21abcc742009-10-23 02:52:06585 false, false, false, false, 2,
[email protected]853300a82010-07-27 21:17:57586 { "D 18 0 false false true false",
587 "D 68 0 false false true false" }
[email protected]21abcc742009-10-23 02:52:06588 };
589
[email protected]853300a82010-07-27 21:17:57590 static const KeyEventTestData kTestAccessDSuppress = {
[email protected]b6d81262011-01-13 17:36:09591 ui::VKEY_D, false, false, true, false,
[email protected]21abcc742009-10-23 02:52:06592 true, true, true, false, 4,
[email protected]853300a82010-07-27 21:17:57593 { "D 18 0 false false true false",
594 "D 68 0 false false true false",
595 "U 68 0 false false true false",
596 "U 18 0 false false true false" }
[email protected]21abcc742009-10-23 02:52:06597 };
598
[email protected]ed172d22012-05-10 08:17:13599#if !defined(USE_ASH)
[email protected]853300a82010-07-27 21:17:57600 static const KeyEventTestData kTestAccess1 = {
[email protected]b6d81262011-01-13 17:36:09601 ui::VKEY_1, false, false, true, false,
[email protected]21abcc742009-10-23 02:52:06602 false, false, false, false, 4,
[email protected]853300a82010-07-27 21:17:57603 { "D 18 0 false false true false",
604 "D 49 0 false false true false",
605 "U 49 0 false false true false",
606 "U 18 0 false false true false" }
[email protected]21abcc742009-10-23 02:52:06607 };
[email protected]853300a82010-07-27 21:17:57608#endif
[email protected]ed172d22012-05-10 08:17:13609#endif
[email protected]21abcc742009-10-23 02:52:06610
[email protected]c1dffe82013-06-26 20:59:05611 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
[email protected]21abcc742009-10-23 02:52:06612
[email protected]a6e602f2010-09-28 22:28:30613 ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
[email protected]c1dffe82013-06-26 20:59:05614 GURL url = embedded_test_server()->GetURL(kTestingPage);
[email protected]21abcc742009-10-23 02:52:06615 ui_test_utils::NavigateToURL(browser(), url);
616
[email protected]b8deecd2012-07-30 21:09:44617 content::RunAllPendingInMessageLoop();
[email protected]21abcc742009-10-23 02:52:06618 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
[email protected]f2159ba2012-04-17 19:13:21619 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]21abcc742009-10-23 02:52:06620
[email protected]ee496952013-01-10 23:17:33621 int tab_index = browser()->tab_strip_model()->active_index();
[email protected]21abcc742009-10-23 02:52:06622 // Make sure no element is focused.
623 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L""));
624 // Alt+A should focus the element with accesskey = "A".
[email protected]853300a82010-07-27 21:17:57625 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestAccessA));
[email protected]21abcc742009-10-23 02:52:06626 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L"A"));
627
628 // Blur the focused element.
629 EXPECT_NO_FATAL_FAILURE(SetFocusedElement(tab_index, L""));
630 // Make sure no element is focused.
631 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L""));
[email protected]853300a82010-07-27 21:17:57632
633#if !defined(OS_MACOSX)
[email protected]21abcc742009-10-23 02:52:06634 // Alt+D should move the focus to the location entry.
[email protected]853300a82010-07-27 21:17:57635 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestAccessD));
[email protected]095b55f62010-09-24 08:06:04636
637 // TODO(isherman): This is an experimental change to help diagnose
638 // http://crbug.com/55713
[email protected]b8deecd2012-07-30 21:09:44639 content::RunAllPendingInMessageLoop();
[email protected]0b8fa8b2011-12-07 00:54:52640 EXPECT_TRUE(IsViewFocused(VIEW_ID_OMNIBOX));
[email protected]21abcc742009-10-23 02:52:06641 // No element should be focused, as Alt+D was handled by the browser.
642 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L""));
643
644 // Move the focus back to the web page.
645 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
[email protected]f2159ba2012-04-17 19:13:21646 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]21abcc742009-10-23 02:52:06647
648 // Make sure no element is focused.
649 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L""));
[email protected]853300a82010-07-27 21:17:57650#endif
651
[email protected]21abcc742009-10-23 02:52:06652 // If the keydown event is suppressed, then Alt+D should be handled as an
653 // accesskey rather than an accelerator key. Activation of an accesskey is not
654 // a part of the default action of the key event, so it should not be
655 // suppressed at all.
[email protected]853300a82010-07-27 21:17:57656 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestAccessDSuppress));
[email protected]f2159ba2012-04-17 19:13:21657 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]21abcc742009-10-23 02:52:06658 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L"D"));
659
660 // Blur the focused element.
661 EXPECT_NO_FATAL_FAILURE(SetFocusedElement(tab_index, L""));
662 // Make sure no element is focused.
663 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L""));
[email protected]ed172d22012-05-10 08:17:13664#if !defined(USE_ASH)
665 // On Ash, alt-1..9 are assigned as window selection global accelerators, so
666 // they can not be used as accesskeys.
[email protected]853300a82010-07-27 21:17:57667 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestAccess1));
[email protected]753efc42010-03-09 19:52:16668#if defined(TOOLKIT_GTK)
669 // On GTK, alt-0..9 are assigned as tab selection accelerators, so they can
[email protected]21abcc742009-10-23 02:52:06670 // not be used as accesskeys.
671 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L""));
[email protected]853300a82010-07-27 21:17:57672#else
[email protected]21abcc742009-10-23 02:52:06673 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L"1"));
674#endif
[email protected]ed172d22012-05-10 08:17:13675#endif
[email protected]21abcc742009-10-23 02:52:06676}
677
[email protected]6db98962011-10-04 22:42:49678// Flaky, http://crbug.com/69475.
679#if defined(OS_LINUX)
[email protected]4d2451652012-02-14 23:54:26680#define MAYBE_ReservedAccelerators DISABLED_ReservedAccelerators
[email protected]6db98962011-10-04 22:42:49681#else
682#define MAYBE_ReservedAccelerators ReservedAccelerators
683#endif
684IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, MAYBE_ReservedAccelerators) {
[email protected]c1dffe82013-06-26 20:59:05685 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
[email protected]21abcc742009-10-23 02:52:06686
[email protected]a6e602f2010-09-28 22:28:30687 ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
[email protected]c1dffe82013-06-26 20:59:05688 GURL url = embedded_test_server()->GetURL(kTestingPage);
[email protected]21abcc742009-10-23 02:52:06689 ui_test_utils::NavigateToURL(browser(), url);
690
691 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
[email protected]f2159ba2012-04-17 19:13:21692 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]21abcc742009-10-23 02:52:06693
[email protected]ee496952013-01-10 23:17:33694 ASSERT_EQ(1, browser()->tab_strip_model()->count());
[email protected]0f72a2dc2010-12-06 19:40:23695
[email protected]e4292a232010-12-11 01:46:41696 static const KeyEventTestData kTestCtrlOrCmdT = {
[email protected]3ab6796d32010-12-21 23:56:07697#if defined(OS_MACOSX)
[email protected]b6d81262011-01-13 17:36:09698 ui::VKEY_T, false, false, false, true,
[email protected]853300a82010-07-27 21:17:57699 true, false, false, false, 1,
700 { "D 91 0 false false false true" }
[email protected]3ab6796d32010-12-21 23:56:07701#else
[email protected]b6d81262011-01-13 17:36:09702 ui::VKEY_T, true, false, false, false,
[email protected]3ab6796d32010-12-21 23:56:07703 true, false, false, false, 1,
704 { "D 17 0 true false false false" }
[email protected]e4292a232010-12-11 01:46:41705#endif
[email protected]853300a82010-07-27 21:17:57706 };
[email protected]867125a02009-12-10 06:01:48707
[email protected]a7fe9112012-07-20 02:34:45708 content::WindowedNotificationObserver wait_for_new_tab(
[email protected]884033e2012-04-16 19:38:42709 chrome::NOTIFICATION_TAB_PARENTED,
[email protected]ad50def52011-10-19 23:17:07710 content::NotificationService::AllSources());
[email protected]0f72a2dc2010-12-06 19:40:23711
[email protected]e4292a232010-12-11 01:46:41712 // Press Ctrl/Cmd+T, which will open a new tab. It cannot be suppressed.
713 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(0, kTestCtrlOrCmdT));
[email protected]ae673742011-08-24 19:48:37714 wait_for_new_tab.Wait();
[email protected]853300a82010-07-27 21:17:57715
716 int result_length;
717 ASSERT_NO_FATAL_FAILURE(GetResultLength(0, &result_length));
718 EXPECT_EQ(1, result_length);
719
[email protected]ee496952013-01-10 23:17:33720 EXPECT_EQ(2, browser()->tab_strip_model()->count());
721 ASSERT_EQ(1, browser()->tab_strip_model()->active_index());
[email protected]0f72a2dc2010-12-06 19:40:23722
[email protected]884033e2012-04-16 19:38:42723 // Because of issue <http://crbug.com/65375>, switching back to the first tab
[email protected]0f72a2dc2010-12-06 19:40:23724 // may cause the focus to be grabbed by omnibox. So instead, we load our
725 // testing page in the newly created tab and try Cmd-W here.
726 ui_test_utils::NavigateToURL(browser(), url);
727
728 // Make sure the focus is in the testing page.
729 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
[email protected]f2159ba2012-04-17 19:13:21730 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]0f72a2dc2010-12-06 19:40:23731
[email protected]853300a82010-07-27 21:17:57732 // Reserved accelerators can't be suppressed.
[email protected]0f72a2dc2010-12-06 19:40:23733 ASSERT_NO_FATAL_FAILURE(SuppressAllEvents(1, true));
734
[email protected]a7fe9112012-07-20 02:34:45735 content::WindowedNotificationObserver wait_for_tab_closed(
[email protected]884033e2012-04-16 19:38:42736 content::NOTIFICATION_WEB_CONTENTS_DESTROYED,
[email protected]ee496952013-01-10 23:17:33737 content::Source<content::WebContents>(
738 browser()->tab_strip_model()->GetWebContentsAt(1)));
[email protected]e4292a232010-12-11 01:46:41739
740 // Press Ctrl/Cmd+W, which will close the tab.
[email protected]3ab6796d32010-12-21 23:56:07741#if defined(OS_MACOSX)
[email protected]a6e602f2010-09-28 22:28:30742 ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
[email protected]b6d81262011-01-13 17:36:09743 browser(), ui::VKEY_W, false, false, false, true));
[email protected]3ab6796d32010-12-21 23:56:07744#else
745 ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
[email protected]b6d81262011-01-13 17:36:09746 browser(), ui::VKEY_W, true, false, false, false));
[email protected]e4292a232010-12-11 01:46:41747#endif
748
749 ASSERT_NO_FATAL_FAILURE(wait_for_tab_closed.Wait());
750
[email protected]ee496952013-01-10 23:17:33751 EXPECT_EQ(1, browser()->tab_strip_model()->count());
[email protected]21abcc742009-10-23 02:52:06752}
[email protected]853300a82010-07-27 21:17:57753
754#if defined(OS_MACOSX)
755IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, EditorKeyBindings) {
[email protected]984aecc2013-03-24 03:53:23756 // TODO(kbr): re-enable: http://crbug.com/222296
757 if (base::mac::IsOSMountainLionOrLater())
758 return;
759
[email protected]853300a82010-07-27 21:17:57760 static const KeyEventTestData kTestCtrlA = {
[email protected]b6d81262011-01-13 17:36:09761 ui::VKEY_A, true, false, false, false,
[email protected]853300a82010-07-27 21:17:57762 false, false, false, false, 4,
763 { "D 17 0 true false false false",
764 "D 65 0 true false false false",
765 "U 65 0 true false false false",
766 "U 17 0 true false false false" }
767 };
768
769 static const KeyEventTestData kTestCtrlF = {
[email protected]b6d81262011-01-13 17:36:09770 ui::VKEY_F, true, false, false, false,
[email protected]853300a82010-07-27 21:17:57771 false, false, false, false, 4,
772 { "D 17 0 true false false false",
773 "D 70 0 true false false false",
774 "U 70 0 true false false false",
775 "U 17 0 true false false false" }
776 };
777
778 static const KeyEventTestData kTestCtrlK = {
[email protected]b6d81262011-01-13 17:36:09779 ui::VKEY_K, true, false, false, false,
[email protected]853300a82010-07-27 21:17:57780 false, false, false, false, 4,
781 { "D 17 0 true false false false",
782 "D 75 0 true false false false",
783 "U 75 0 true false false false",
784 "U 17 0 true false false false" }
785 };
786
[email protected]c1dffe82013-06-26 20:59:05787 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
[email protected]853300a82010-07-27 21:17:57788
[email protected]a6e602f2010-09-28 22:28:30789 ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
[email protected]c1dffe82013-06-26 20:59:05790 GURL url = embedded_test_server()->GetURL(kTestingPage);
[email protected]853300a82010-07-27 21:17:57791 ui_test_utils::NavigateToURL(browser(), url);
792
793 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
[email protected]f2159ba2012-04-17 19:13:21794 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]853300a82010-07-27 21:17:57795
[email protected]ee496952013-01-10 23:17:33796 int tab_index = browser()->tab_strip_model()->active_index();
[email protected]853300a82010-07-27 21:17:57797 ASSERT_NO_FATAL_FAILURE(SetFocusedElement(tab_index, L"A"));
798 ASSERT_NO_FATAL_FAILURE(SetTextBoxValue(tab_index, L"A", L"Hello"));
799 // Move the caret to the beginning of the line.
800 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlA));
801 // Forward one character
802 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlF));
803 // Delete to the end of the line.
804 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlK));
805 EXPECT_NO_FATAL_FAILURE(CheckTextBoxValue(tab_index, L"A", L"H"));
806}
807#endif
808
[email protected]6f39373f2012-09-10 16:02:31809// See http://crbug.com/147579
[email protected]1e09ec82012-12-21 22:48:09810IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, DISABLED_PageUpDownKeys) {
[email protected]853300a82010-07-27 21:17:57811 static const KeyEventTestData kTestPageUp = {
[email protected]b6d81262011-01-13 17:36:09812 ui::VKEY_PRIOR, false, false, false, false,
[email protected]853300a82010-07-27 21:17:57813 false, false, false, false, 2,
814 { "D 33 0 false false false false",
815 "U 33 0 false false false false" }
816 };
817
818 static const KeyEventTestData kTestPageDown = {
[email protected]b6d81262011-01-13 17:36:09819 ui::VKEY_NEXT, false, false, false, false,
[email protected]853300a82010-07-27 21:17:57820 false, false, false, false, 2,
821 { "D 34 0 false false false false",
822 "U 34 0 false false false false" }
823 };
824
[email protected]c1dffe82013-06-26 20:59:05825 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
[email protected]853300a82010-07-27 21:17:57826
[email protected]a6e602f2010-09-28 22:28:30827 ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
[email protected]c1dffe82013-06-26 20:59:05828 GURL url = embedded_test_server()->GetURL(kTestingPage);
[email protected]853300a82010-07-27 21:17:57829 ui_test_utils::NavigateToURL(browser(), url);
830
831 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
[email protected]f2159ba2012-04-17 19:13:21832 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]853300a82010-07-27 21:17:57833
[email protected]ee496952013-01-10 23:17:33834 int tab_index = browser()->tab_strip_model()->active_index();
[email protected]853300a82010-07-27 21:17:57835 ASSERT_NO_FATAL_FAILURE(SetFocusedElement(tab_index, L"A"));
836 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestPageUp));
837 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestPageDown));
838 EXPECT_NO_FATAL_FAILURE(CheckTextBoxValue(tab_index, L"A", L""));
839}
[email protected]629e0342010-07-27 23:30:13840
[email protected]33b36dc2012-02-25 04:46:32841#if defined(OS_WIN)
842// AltKey is enabled only on Windows. See crbug.com/114537.
[email protected]ee19cb202010-08-04 19:48:19843IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, FocusMenuBarByAltKey) {
844 static const KeyEventTestData kTestAltKey = {
[email protected]b6d81262011-01-13 17:36:09845 ui::VKEY_MENU, false, false, false, false,
[email protected]ee19cb202010-08-04 19:48:19846 false, false, false, false, 2,
847 { "D 18 0 false false true false",
848 "U 18 0 false false true false" }
849 };
850
851 static const KeyEventTestData kTestAltKeySuppress = {
[email protected]b6d81262011-01-13 17:36:09852 ui::VKEY_MENU, false, false, false, false,
[email protected]ee19cb202010-08-04 19:48:19853 true, false, false, false, 2,
854 { "D 18 0 false false true false",
855 "U 18 0 false false true false" }
856 };
857
858 static const KeyEventTestData kTestCtrlAltKey = {
[email protected]b6d81262011-01-13 17:36:09859 ui::VKEY_MENU, true, false, false, false,
[email protected]ee19cb202010-08-04 19:48:19860 false, false, false, false, 4,
861 { "D 17 0 true false false false",
862 "D 18 0 true false true false",
863 "U 18 0 true false true false",
864 "U 17 0 true false false false" }
865 };
866
[email protected]c1dffe82013-06-26 20:59:05867 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
[email protected]ee19cb202010-08-04 19:48:19868
[email protected]a6e602f2010-09-28 22:28:30869 ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
[email protected]c1dffe82013-06-26 20:59:05870 GURL url = embedded_test_server()->GetURL(kTestingPage);
[email protected]ee19cb202010-08-04 19:48:19871 ui_test_utils::NavigateToURL(browser(), url);
872
873 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
[email protected]f2159ba2012-04-17 19:13:21874 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]ee19cb202010-08-04 19:48:19875
[email protected]ee496952013-01-10 23:17:33876 int tab_index = browser()->tab_strip_model()->active_index();
[email protected]ee19cb202010-08-04 19:48:19877 // Press and release Alt key to focus wrench menu button.
878 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestAltKey));
879 EXPECT_TRUE(IsViewFocused(VIEW_ID_APP_MENU));
880
881 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
[email protected]f2159ba2012-04-17 19:13:21882 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]ee19cb202010-08-04 19:48:19883
884 // Alt key can be suppressed.
885 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestAltKeySuppress));
[email protected]f2159ba2012-04-17 19:13:21886 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]ee19cb202010-08-04 19:48:19887
888 // Ctrl+Alt should have no effect.
889 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlAltKey));
[email protected]f2159ba2012-04-17 19:13:21890 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]ee19cb202010-08-04 19:48:19891}
892#endif
893
[email protected]629e0342010-07-27 23:30:13894} // namespace