blob: a50d3fdda54a680bbb19bc8d90ff37275ca1b88c [file] [log] [blame]
[email protected]4da3d852012-01-12 02:46:251// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]21abcc742009-10-23 02:52:062// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "build/build_config.h"
6
7#include "base/basictypes.h"
[email protected]21abcc742009-10-23 02:52:068#include "base/logging.h"
9#include "base/message_loop.h"
[email protected]1870d5cf2011-05-12 01:55:4010#include "base/stringprintf.h"
[email protected]21abcc742009-10-23 02:52:0611#include "base/utf_string_conversions.h"
12#include "base/values.h"
[email protected]2ad4a902010-11-17 06:05:1313#include "chrome/browser/ui/browser.h"
[email protected]ee496952013-01-10 23:17:3314#include "chrome/browser/ui/tabs/tab_strip_model.h"
[email protected]432115822011-07-10 15:52:2715#include "chrome/common/chrome_notification_types.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]89b32522013-05-07 20:04:2128#include "net/test/spawned_test_server/spawned_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]f72a1cc2010-04-30 07:17:3043const char kTestingPage[] = "files/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]95409e12010-08-17 20:07:11371 ASSERT_TRUE(test_server()->Start());
[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]95409e12010-08-17 20:07:11374 GURL url = 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
408#if defined(OS_LINUX)
409// http://crbug.com/129235
[email protected]e00ccc92012-11-01 17:32:30410#define MAYBE_CtrlKeyEvents DISABLED_CtrlKeyEvents
[email protected]bf43a382012-05-22 23:33:53411#else
412#define MAYBE_CtrlKeyEvents CtrlKeyEvents
413#endif
414
415IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, MAYBE_CtrlKeyEvents) {
[email protected]21abcc742009-10-23 02:52:06416 static const KeyEventTestData kTestCtrlF = {
[email protected]b6d81262011-01-13 17:36:09417 ui::VKEY_F, true, false, false, false,
[email protected]21abcc742009-10-23 02:52:06418 false, false, false, false, 2,
[email protected]853300a82010-07-27 21:17:57419 { "D 17 0 true false false false",
420 "D 70 0 true false false false" }
[email protected]21abcc742009-10-23 02:52:06421 };
422
423 static const KeyEventTestData kTestCtrlFSuppressKeyDown = {
[email protected]b6d81262011-01-13 17:36:09424 ui::VKEY_F, true, false, false, false,
[email protected]21abcc742009-10-23 02:52:06425 true, false, false, false, 4,
[email protected]853300a82010-07-27 21:17:57426 { "D 17 0 true false false false",
427 "D 70 0 true false false false",
428 "U 70 0 true false false false",
429 "U 17 0 true false false false" }
[email protected]21abcc742009-10-23 02:52:06430 };
431
432 // Ctrl+Z doesn't bind to any accelerators, which then should generate a
433 // keypress event with charCode=26.
434 static const KeyEventTestData kTestCtrlZ = {
[email protected]b6d81262011-01-13 17:36:09435 ui::VKEY_Z, true, false, false, false,
[email protected]21abcc742009-10-23 02:52:06436 false, false, false, false, 5,
[email protected]853300a82010-07-27 21:17:57437 { "D 17 0 true false false false",
438 "D 90 0 true false false false",
439 "P 26 26 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 static const KeyEventTestData kTestCtrlZSuppressKeyDown = {
[email protected]b6d81262011-01-13 17:36:09445 ui::VKEY_Z, true, false, false, false,
[email protected]21abcc742009-10-23 02:52:06446 true, false, false, false, 4,
[email protected]853300a82010-07-27 21:17:57447 { "D 17 0 true false false false",
448 "D 90 0 true false false false",
449 "U 90 0 true false false false",
450 "U 17 0 true false false false" }
[email protected]21abcc742009-10-23 02:52:06451 };
452
453 // Ctrl+Enter shall generate a keypress event with charCode=10 (LF).
454 static const KeyEventTestData kTestCtrlEnter = {
[email protected]b6d81262011-01-13 17:36:09455 ui::VKEY_RETURN, true, false, false, false,
[email protected]21abcc742009-10-23 02:52:06456 false, false, false, false, 5,
[email protected]853300a82010-07-27 21:17:57457 { "D 17 0 true false false false",
458 "D 13 0 true false false false",
459 "P 10 10 true false false false",
460 "U 13 0 true false false false",
461 "U 17 0 true false false false" }
[email protected]21abcc742009-10-23 02:52:06462 };
463
[email protected]95409e12010-08-17 20:07:11464 ASSERT_TRUE(test_server()->Start());
[email protected]21abcc742009-10-23 02:52:06465
[email protected]a6e602f2010-09-28 22:28:30466 ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
[email protected]95409e12010-08-17 20:07:11467 GURL url = test_server()->GetURL(kTestingPage);
[email protected]21abcc742009-10-23 02:52:06468 ui_test_utils::NavigateToURL(browser(), url);
469
470 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
[email protected]f2159ba2012-04-17 19:13:21471 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]21abcc742009-10-23 02:52:06472
[email protected]ee496952013-01-10 23:17:33473 int tab_index = browser()->tab_strip_model()->active_index();
[email protected]21abcc742009-10-23 02:52:06474 // Press Ctrl+F, which will make the Find box open and request focus.
475 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlF));
476 EXPECT_TRUE(IsViewFocused(VIEW_ID_FIND_IN_PAGE_TEXT_FIELD));
477
478 // Press Escape to close the Find box and move the focus back to the web page.
[email protected]a6e602f2010-09-28 22:28:30479 ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
[email protected]b6d81262011-01-13 17:36:09480 browser(), ui::VKEY_ESCAPE, false, false, false, false));
[email protected]f2159ba2012-04-17 19:13:21481 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]21abcc742009-10-23 02:52:06482
483 // Press Ctrl+F with keydown suppressed shall not open the find box.
484 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlFSuppressKeyDown));
[email protected]f2159ba2012-04-17 19:13:21485 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]21abcc742009-10-23 02:52:06486
487 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlZ));
488 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlZSuppressKeyDown));
489 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlEnter));
490}
[email protected]853300a82010-07-27 21:17:57491#elif defined(OS_MACOSX)
[email protected]cb931932011-05-03 19:57:33492// http://crbug.com/81451
[email protected]4d2451652012-02-14 23:54:26493IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, DISABLED_CommandKeyEvents) {
[email protected]853300a82010-07-27 21:17:57494 static const KeyEventTestData kTestCmdF = {
[email protected]b6d81262011-01-13 17:36:09495 ui::VKEY_F, false, false, false, true,
[email protected]853300a82010-07-27 21:17:57496 false, false, false, false, 2,
497 { "D 91 0 false false false true",
498 "D 70 0 false false false true" }
499 };
500
501 // On Mac we don't send key up events when command modifier is down.
502 static const KeyEventTestData kTestCmdFSuppressKeyDown = {
[email protected]b6d81262011-01-13 17:36:09503 ui::VKEY_F, false, false, false, true,
[email protected]853300a82010-07-27 21:17:57504 true, false, false, false, 3,
505 { "D 91 0 false false false true",
506 "D 70 0 false false false true",
507 "U 91 0 false false false true" }
508 };
509
[email protected]95409e12010-08-17 20:07:11510 ASSERT_TRUE(test_server()->Start());
[email protected]853300a82010-07-27 21:17:57511
[email protected]a6e602f2010-09-28 22:28:30512 ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
[email protected]95409e12010-08-17 20:07:11513 GURL url = test_server()->GetURL(kTestingPage);
[email protected]853300a82010-07-27 21:17:57514 ui_test_utils::NavigateToURL(browser(), url);
515
516 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
[email protected]f2159ba2012-04-17 19:13:21517 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]853300a82010-07-27 21:17:57518
[email protected]ee496952013-01-10 23:17:33519 int tab_index = browser()->tab_strip_model()->active_index();
[email protected]853300a82010-07-27 21:17:57520 // Press Cmd+F, which will make the Find box open and request focus.
521 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCmdF));
522 EXPECT_TRUE(IsViewFocused(VIEW_ID_FIND_IN_PAGE_TEXT_FIELD));
523
524 // Press Escape to close the Find box and move the focus back to the web page.
[email protected]a6e602f2010-09-28 22:28:30525 ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
[email protected]b6d81262011-01-13 17:36:09526 browser(), ui::VKEY_ESCAPE, false, false, false, false));
[email protected]f2159ba2012-04-17 19:13:21527 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]853300a82010-07-27 21:17:57528
529 // Press Cmd+F with keydown suppressed shall not open the find box.
530 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCmdFSuppressKeyDown));
[email protected]f2159ba2012-04-17 19:13:21531 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]853300a82010-07-27 21:17:57532}
533#endif
[email protected]21abcc742009-10-23 02:52:06534
[email protected]7ec41882013-05-14 18:24:16535// Flaky: http://crbug.com/81451 , http://crbug.com/129235 ,
536// also fails on Windows.
537IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, DISABLED_AccessKeys) {
[email protected]853300a82010-07-27 21:17:57538#if defined(OS_MACOSX)
539 // On Mac, access keys use ctrl+alt modifiers.
540 static const KeyEventTestData kTestAccessA = {
[email protected]b6d81262011-01-13 17:36:09541 ui::VKEY_A, true, false, true, false,
[email protected]853300a82010-07-27 21:17:57542 false, false, false, false, 6,
543 { "D 17 0 true false false false",
544 "D 18 0 true false true false",
545 "D 65 0 true false true false",
546 "U 65 0 true false true false",
547 "U 18 0 true false true false",
548 "U 17 0 true false false false" }
[email protected]21abcc742009-10-23 02:52:06549 };
550
[email protected]853300a82010-07-27 21:17:57551 static const KeyEventTestData kTestAccessDSuppress = {
[email protected]b6d81262011-01-13 17:36:09552 ui::VKEY_D, true, false, true, false,
[email protected]853300a82010-07-27 21:17:57553 true, true, true, false, 6,
554 { "D 17 0 true false false false",
555 "D 18 0 true false true false",
556 "D 68 0 true false true false",
557 "U 68 0 true false true false",
558 "U 18 0 true false true false",
559 "U 17 0 true false false false" }
560 };
561
562 static const KeyEventTestData kTestAccess1 = {
[email protected]b6d81262011-01-13 17:36:09563 ui::VKEY_1, true, false, true, false,
[email protected]853300a82010-07-27 21:17:57564 false, false, false, false, 6,
565 { "D 17 0 true false false false",
566 "D 18 0 true false true false",
567 "D 49 0 true false true false",
568 "U 49 0 true false true false",
569 "U 18 0 true false true false",
570 "U 17 0 true false false false" }
571 };
572#else
573 static const KeyEventTestData kTestAccessA = {
[email protected]b6d81262011-01-13 17:36:09574 ui::VKEY_A, false, false, true, false,
[email protected]853300a82010-07-27 21:17:57575 false, false, false, false, 4,
576 { "D 18 0 false false true false",
577 "D 65 0 false false true false",
578 "U 65 0 false false true false",
579 "U 18 0 false false true false" }
580 };
581
582 static const KeyEventTestData kTestAccessD = {
[email protected]b6d81262011-01-13 17:36:09583 ui::VKEY_D, false, false, true, false,
[email protected]21abcc742009-10-23 02:52:06584 false, false, false, false, 2,
[email protected]853300a82010-07-27 21:17:57585 { "D 18 0 false false true false",
586 "D 68 0 false false true false" }
[email protected]21abcc742009-10-23 02:52:06587 };
588
[email protected]853300a82010-07-27 21:17:57589 static const KeyEventTestData kTestAccessDSuppress = {
[email protected]b6d81262011-01-13 17:36:09590 ui::VKEY_D, false, false, true, false,
[email protected]21abcc742009-10-23 02:52:06591 true, true, true, false, 4,
[email protected]853300a82010-07-27 21:17:57592 { "D 18 0 false false true false",
593 "D 68 0 false false true false",
594 "U 68 0 false false true false",
595 "U 18 0 false false true false" }
[email protected]21abcc742009-10-23 02:52:06596 };
597
[email protected]ed172d22012-05-10 08:17:13598#if !defined(USE_ASH)
[email protected]853300a82010-07-27 21:17:57599 static const KeyEventTestData kTestAccess1 = {
[email protected]b6d81262011-01-13 17:36:09600 ui::VKEY_1, false, false, true, false,
[email protected]21abcc742009-10-23 02:52:06601 false, false, false, false, 4,
[email protected]853300a82010-07-27 21:17:57602 { "D 18 0 false false true false",
603 "D 49 0 false false true false",
604 "U 49 0 false false true false",
605 "U 18 0 false false true false" }
[email protected]21abcc742009-10-23 02:52:06606 };
[email protected]853300a82010-07-27 21:17:57607#endif
[email protected]ed172d22012-05-10 08:17:13608#endif
[email protected]21abcc742009-10-23 02:52:06609
[email protected]95409e12010-08-17 20:07:11610 ASSERT_TRUE(test_server()->Start());
[email protected]21abcc742009-10-23 02:52:06611
[email protected]a6e602f2010-09-28 22:28:30612 ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
[email protected]95409e12010-08-17 20:07:11613 GURL url = test_server()->GetURL(kTestingPage);
[email protected]21abcc742009-10-23 02:52:06614 ui_test_utils::NavigateToURL(browser(), url);
615
[email protected]b8deecd2012-07-30 21:09:44616 content::RunAllPendingInMessageLoop();
[email protected]21abcc742009-10-23 02:52:06617 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
[email protected]f2159ba2012-04-17 19:13:21618 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]21abcc742009-10-23 02:52:06619
[email protected]ee496952013-01-10 23:17:33620 int tab_index = browser()->tab_strip_model()->active_index();
[email protected]21abcc742009-10-23 02:52:06621 // Make sure no element is focused.
622 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L""));
623 // Alt+A should focus the element with accesskey = "A".
[email protected]853300a82010-07-27 21:17:57624 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestAccessA));
[email protected]21abcc742009-10-23 02:52:06625 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L"A"));
626
627 // Blur the focused element.
628 EXPECT_NO_FATAL_FAILURE(SetFocusedElement(tab_index, L""));
629 // Make sure no element is focused.
630 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L""));
[email protected]853300a82010-07-27 21:17:57631
632#if !defined(OS_MACOSX)
[email protected]21abcc742009-10-23 02:52:06633 // Alt+D should move the focus to the location entry.
[email protected]853300a82010-07-27 21:17:57634 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestAccessD));
[email protected]095b55f62010-09-24 08:06:04635
636 // TODO(isherman): This is an experimental change to help diagnose
637 // http://crbug.com/55713
[email protected]b8deecd2012-07-30 21:09:44638 content::RunAllPendingInMessageLoop();
[email protected]0b8fa8b2011-12-07 00:54:52639 EXPECT_TRUE(IsViewFocused(VIEW_ID_OMNIBOX));
[email protected]21abcc742009-10-23 02:52:06640 // No element should be focused, as Alt+D was handled by the browser.
641 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L""));
642
643 // Move the focus back to the web page.
644 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
[email protected]f2159ba2012-04-17 19:13:21645 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]21abcc742009-10-23 02:52:06646
647 // Make sure no element is focused.
648 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L""));
[email protected]853300a82010-07-27 21:17:57649#endif
650
[email protected]21abcc742009-10-23 02:52:06651 // If the keydown event is suppressed, then Alt+D should be handled as an
652 // accesskey rather than an accelerator key. Activation of an accesskey is not
653 // a part of the default action of the key event, so it should not be
654 // suppressed at all.
[email protected]853300a82010-07-27 21:17:57655 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestAccessDSuppress));
[email protected]f2159ba2012-04-17 19:13:21656 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]21abcc742009-10-23 02:52:06657 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L"D"));
658
659 // Blur the focused element.
660 EXPECT_NO_FATAL_FAILURE(SetFocusedElement(tab_index, L""));
661 // Make sure no element is focused.
662 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L""));
[email protected]ed172d22012-05-10 08:17:13663#if !defined(USE_ASH)
664 // On Ash, alt-1..9 are assigned as window selection global accelerators, so
665 // they can not be used as accesskeys.
[email protected]853300a82010-07-27 21:17:57666 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestAccess1));
[email protected]753efc42010-03-09 19:52:16667#if defined(TOOLKIT_GTK)
668 // On GTK, alt-0..9 are assigned as tab selection accelerators, so they can
[email protected]21abcc742009-10-23 02:52:06669 // not be used as accesskeys.
670 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L""));
[email protected]853300a82010-07-27 21:17:57671#else
[email protected]21abcc742009-10-23 02:52:06672 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L"1"));
673#endif
[email protected]ed172d22012-05-10 08:17:13674#endif
[email protected]21abcc742009-10-23 02:52:06675}
676
[email protected]6db98962011-10-04 22:42:49677// Flaky, http://crbug.com/69475.
678#if defined(OS_LINUX)
[email protected]4d2451652012-02-14 23:54:26679#define MAYBE_ReservedAccelerators DISABLED_ReservedAccelerators
[email protected]6db98962011-10-04 22:42:49680#else
681#define MAYBE_ReservedAccelerators ReservedAccelerators
682#endif
683IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, MAYBE_ReservedAccelerators) {
[email protected]95409e12010-08-17 20:07:11684 ASSERT_TRUE(test_server()->Start());
[email protected]21abcc742009-10-23 02:52:06685
[email protected]a6e602f2010-09-28 22:28:30686 ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
[email protected]95409e12010-08-17 20:07:11687 GURL url = test_server()->GetURL(kTestingPage);
[email protected]21abcc742009-10-23 02:52:06688 ui_test_utils::NavigateToURL(browser(), url);
689
690 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
[email protected]f2159ba2012-04-17 19:13:21691 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]21abcc742009-10-23 02:52:06692
[email protected]ee496952013-01-10 23:17:33693 ASSERT_EQ(1, browser()->tab_strip_model()->count());
[email protected]0f72a2dc2010-12-06 19:40:23694
[email protected]e4292a232010-12-11 01:46:41695 static const KeyEventTestData kTestCtrlOrCmdT = {
[email protected]3ab6796d32010-12-21 23:56:07696#if defined(OS_MACOSX)
[email protected]b6d81262011-01-13 17:36:09697 ui::VKEY_T, false, false, false, true,
[email protected]853300a82010-07-27 21:17:57698 true, false, false, false, 1,
699 { "D 91 0 false false false true" }
[email protected]3ab6796d32010-12-21 23:56:07700#else
[email protected]b6d81262011-01-13 17:36:09701 ui::VKEY_T, true, false, false, false,
[email protected]3ab6796d32010-12-21 23:56:07702 true, false, false, false, 1,
703 { "D 17 0 true false false false" }
[email protected]e4292a232010-12-11 01:46:41704#endif
[email protected]853300a82010-07-27 21:17:57705 };
[email protected]867125a02009-12-10 06:01:48706
[email protected]a7fe9112012-07-20 02:34:45707 content::WindowedNotificationObserver wait_for_new_tab(
[email protected]884033e2012-04-16 19:38:42708 chrome::NOTIFICATION_TAB_PARENTED,
[email protected]ad50def52011-10-19 23:17:07709 content::NotificationService::AllSources());
[email protected]0f72a2dc2010-12-06 19:40:23710
[email protected]e4292a232010-12-11 01:46:41711 // Press Ctrl/Cmd+T, which will open a new tab. It cannot be suppressed.
712 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(0, kTestCtrlOrCmdT));
[email protected]ae673742011-08-24 19:48:37713 wait_for_new_tab.Wait();
[email protected]853300a82010-07-27 21:17:57714
715 int result_length;
716 ASSERT_NO_FATAL_FAILURE(GetResultLength(0, &result_length));
717 EXPECT_EQ(1, result_length);
718
[email protected]ee496952013-01-10 23:17:33719 EXPECT_EQ(2, browser()->tab_strip_model()->count());
720 ASSERT_EQ(1, browser()->tab_strip_model()->active_index());
[email protected]0f72a2dc2010-12-06 19:40:23721
[email protected]884033e2012-04-16 19:38:42722 // Because of issue <http://crbug.com/65375>, switching back to the first tab
[email protected]0f72a2dc2010-12-06 19:40:23723 // may cause the focus to be grabbed by omnibox. So instead, we load our
724 // testing page in the newly created tab and try Cmd-W here.
725 ui_test_utils::NavigateToURL(browser(), url);
726
727 // Make sure the focus is in the testing page.
728 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
[email protected]f2159ba2012-04-17 19:13:21729 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]0f72a2dc2010-12-06 19:40:23730
[email protected]853300a82010-07-27 21:17:57731 // Reserved accelerators can't be suppressed.
[email protected]0f72a2dc2010-12-06 19:40:23732 ASSERT_NO_FATAL_FAILURE(SuppressAllEvents(1, true));
733
[email protected]a7fe9112012-07-20 02:34:45734 content::WindowedNotificationObserver wait_for_tab_closed(
[email protected]884033e2012-04-16 19:38:42735 content::NOTIFICATION_WEB_CONTENTS_DESTROYED,
[email protected]ee496952013-01-10 23:17:33736 content::Source<content::WebContents>(
737 browser()->tab_strip_model()->GetWebContentsAt(1)));
[email protected]e4292a232010-12-11 01:46:41738
739 // Press Ctrl/Cmd+W, which will close the tab.
[email protected]3ab6796d32010-12-21 23:56:07740#if defined(OS_MACOSX)
[email protected]a6e602f2010-09-28 22:28:30741 ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
[email protected]b6d81262011-01-13 17:36:09742 browser(), ui::VKEY_W, false, false, false, true));
[email protected]3ab6796d32010-12-21 23:56:07743#else
744 ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
[email protected]b6d81262011-01-13 17:36:09745 browser(), ui::VKEY_W, true, false, false, false));
[email protected]e4292a232010-12-11 01:46:41746#endif
747
748 ASSERT_NO_FATAL_FAILURE(wait_for_tab_closed.Wait());
749
[email protected]ee496952013-01-10 23:17:33750 EXPECT_EQ(1, browser()->tab_strip_model()->count());
[email protected]21abcc742009-10-23 02:52:06751}
[email protected]853300a82010-07-27 21:17:57752
753#if defined(OS_MACOSX)
754IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, EditorKeyBindings) {
[email protected]984aecc2013-03-24 03:53:23755 // TODO(kbr): re-enable: http://crbug.com/222296
756 if (base::mac::IsOSMountainLionOrLater())
757 return;
758
[email protected]853300a82010-07-27 21:17:57759 static const KeyEventTestData kTestCtrlA = {
[email protected]b6d81262011-01-13 17:36:09760 ui::VKEY_A, true, false, false, false,
[email protected]853300a82010-07-27 21:17:57761 false, false, false, false, 4,
762 { "D 17 0 true false false false",
763 "D 65 0 true false false false",
764 "U 65 0 true false false false",
765 "U 17 0 true false false false" }
766 };
767
768 static const KeyEventTestData kTestCtrlF = {
[email protected]b6d81262011-01-13 17:36:09769 ui::VKEY_F, true, false, false, false,
[email protected]853300a82010-07-27 21:17:57770 false, false, false, false, 4,
771 { "D 17 0 true false false false",
772 "D 70 0 true false false false",
773 "U 70 0 true false false false",
774 "U 17 0 true false false false" }
775 };
776
777 static const KeyEventTestData kTestCtrlK = {
[email protected]b6d81262011-01-13 17:36:09778 ui::VKEY_K, true, false, false, false,
[email protected]853300a82010-07-27 21:17:57779 false, false, false, false, 4,
780 { "D 17 0 true false false false",
781 "D 75 0 true false false false",
782 "U 75 0 true false false false",
783 "U 17 0 true false false false" }
784 };
785
[email protected]95409e12010-08-17 20:07:11786 ASSERT_TRUE(test_server()->Start());
[email protected]853300a82010-07-27 21:17:57787
[email protected]a6e602f2010-09-28 22:28:30788 ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
[email protected]95409e12010-08-17 20:07:11789 GURL url = test_server()->GetURL(kTestingPage);
[email protected]853300a82010-07-27 21:17:57790 ui_test_utils::NavigateToURL(browser(), url);
791
792 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
[email protected]f2159ba2012-04-17 19:13:21793 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]853300a82010-07-27 21:17:57794
[email protected]ee496952013-01-10 23:17:33795 int tab_index = browser()->tab_strip_model()->active_index();
[email protected]853300a82010-07-27 21:17:57796 ASSERT_NO_FATAL_FAILURE(SetFocusedElement(tab_index, L"A"));
797 ASSERT_NO_FATAL_FAILURE(SetTextBoxValue(tab_index, L"A", L"Hello"));
798 // Move the caret to the beginning of the line.
799 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlA));
800 // Forward one character
801 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlF));
802 // Delete to the end of the line.
803 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlK));
804 EXPECT_NO_FATAL_FAILURE(CheckTextBoxValue(tab_index, L"A", L"H"));
805}
806#endif
807
[email protected]6f39373f2012-09-10 16:02:31808// See http://crbug.com/147579
[email protected]1e09ec82012-12-21 22:48:09809IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, DISABLED_PageUpDownKeys) {
[email protected]853300a82010-07-27 21:17:57810 static const KeyEventTestData kTestPageUp = {
[email protected]b6d81262011-01-13 17:36:09811 ui::VKEY_PRIOR, false, false, false, false,
[email protected]853300a82010-07-27 21:17:57812 false, false, false, false, 2,
813 { "D 33 0 false false false false",
814 "U 33 0 false false false false" }
815 };
816
817 static const KeyEventTestData kTestPageDown = {
[email protected]b6d81262011-01-13 17:36:09818 ui::VKEY_NEXT, false, false, false, false,
[email protected]853300a82010-07-27 21:17:57819 false, false, false, false, 2,
820 { "D 34 0 false false false false",
821 "U 34 0 false false false false" }
822 };
823
[email protected]95409e12010-08-17 20:07:11824 ASSERT_TRUE(test_server()->Start());
[email protected]853300a82010-07-27 21:17:57825
[email protected]a6e602f2010-09-28 22:28:30826 ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
[email protected]95409e12010-08-17 20:07:11827 GURL url = test_server()->GetURL(kTestingPage);
[email protected]853300a82010-07-27 21:17:57828 ui_test_utils::NavigateToURL(browser(), url);
829
830 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
[email protected]f2159ba2012-04-17 19:13:21831 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]853300a82010-07-27 21:17:57832
[email protected]ee496952013-01-10 23:17:33833 int tab_index = browser()->tab_strip_model()->active_index();
[email protected]853300a82010-07-27 21:17:57834 ASSERT_NO_FATAL_FAILURE(SetFocusedElement(tab_index, L"A"));
835 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestPageUp));
836 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestPageDown));
837 EXPECT_NO_FATAL_FAILURE(CheckTextBoxValue(tab_index, L"A", L""));
838}
[email protected]629e0342010-07-27 23:30:13839
[email protected]33b36dc2012-02-25 04:46:32840#if defined(OS_WIN)
841// AltKey is enabled only on Windows. See crbug.com/114537.
[email protected]ee19cb202010-08-04 19:48:19842IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, FocusMenuBarByAltKey) {
843 static const KeyEventTestData kTestAltKey = {
[email protected]b6d81262011-01-13 17:36:09844 ui::VKEY_MENU, false, false, false, false,
[email protected]ee19cb202010-08-04 19:48:19845 false, false, false, false, 2,
846 { "D 18 0 false false true false",
847 "U 18 0 false false true false" }
848 };
849
850 static const KeyEventTestData kTestAltKeySuppress = {
[email protected]b6d81262011-01-13 17:36:09851 ui::VKEY_MENU, false, false, false, false,
[email protected]ee19cb202010-08-04 19:48:19852 true, false, false, false, 2,
853 { "D 18 0 false false true false",
854 "U 18 0 false false true false" }
855 };
856
857 static const KeyEventTestData kTestCtrlAltKey = {
[email protected]b6d81262011-01-13 17:36:09858 ui::VKEY_MENU, true, false, false, false,
[email protected]ee19cb202010-08-04 19:48:19859 false, false, false, false, 4,
860 { "D 17 0 true false false false",
861 "D 18 0 true false true false",
862 "U 18 0 true false true false",
863 "U 17 0 true false false false" }
864 };
865
[email protected]95409e12010-08-17 20:07:11866 ASSERT_TRUE(test_server()->Start());
[email protected]ee19cb202010-08-04 19:48:19867
[email protected]a6e602f2010-09-28 22:28:30868 ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
[email protected]95409e12010-08-17 20:07:11869 GURL url = test_server()->GetURL(kTestingPage);
[email protected]ee19cb202010-08-04 19:48:19870 ui_test_utils::NavigateToURL(browser(), url);
871
872 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
[email protected]f2159ba2012-04-17 19:13:21873 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]ee19cb202010-08-04 19:48:19874
[email protected]ee496952013-01-10 23:17:33875 int tab_index = browser()->tab_strip_model()->active_index();
[email protected]ee19cb202010-08-04 19:48:19876 // Press and release Alt key to focus wrench menu button.
877 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestAltKey));
878 EXPECT_TRUE(IsViewFocused(VIEW_ID_APP_MENU));
879
880 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
[email protected]f2159ba2012-04-17 19:13:21881 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]ee19cb202010-08-04 19:48:19882
883 // Alt key can be suppressed.
884 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestAltKeySuppress));
[email protected]f2159ba2012-04-17 19:13:21885 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]ee19cb202010-08-04 19:48:19886
887 // Ctrl+Alt should have no effect.
888 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlAltKey));
[email protected]f2159ba2012-04-17 19:13:21889 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]ee19cb202010-08-04 19:48:19890}
891#endif
892
[email protected]629e0342010-07-27 23:30:13893} // namespace