blob: b89162d4f0cc7f528769256ce15bd07299f57af0 [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
avie4d7b6f2015-12-26 00:59:187#include <stddef.h>
8
[email protected]21abcc742009-10-23 02:52:069#include "base/logging.h"
avie4d7b6f2015-12-26 00:59:1810#include "base/macros.h"
[email protected]fa1e0e12013-07-18 00:10:1411#include "base/message_loop/message_loop.h"
[email protected]e7463412013-06-10 22:53:4612#include "base/strings/stringprintf.h"
[email protected]135cb802013-06-09 16:44:2013#include "base/strings/utf_string_conversions.h"
[email protected]21abcc742009-10-23 02:52:0614#include "base/values.h"
[email protected]fdf40f3e2013-07-11 23:55:4615#include "chrome/browser/chrome_notification_types.h"
[email protected]2ad4a902010-11-17 06:05:1316#include "chrome/browser/ui/browser.h"
[email protected]ee496952013-01-10 23:17:3317#include "chrome/browser/ui/tabs/tab_strip_model.h"
[email protected]21abcc742009-10-23 02:52:0618#include "chrome/common/chrome_paths.h"
[email protected]af44e7fb2011-07-29 18:32:3219#include "chrome/test/base/in_process_browser_test.h"
[email protected]ce7d0cbc2013-05-03 18:57:2220#include "chrome/test/base/interactive_test_utils.h"
[email protected]af44e7fb2011-07-29 18:32:3221#include "chrome/test/base/ui_test_utils.h"
[email protected]6c2381d2011-10-19 02:52:5322#include "content/public/browser/notification_registrar.h"
[email protected]ad50def52011-10-19 23:17:0723#include "content/public/browser/notification_service.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]7d478cb2012-07-24 17:19:4226#include "content/public/test/browser_test_utils.h"
[email protected]c1dffe82013-06-26 20:59:0527#include "net/test/embedded_test_server/embedded_test_server.h"
[email protected]7e9acd082013-09-17 23:31:1628#include "ui/events/keycodes/keyboard_codes.h"
[email protected]21abcc742009-10-23 02:52:0629
[email protected]984aecc2013-03-24 03:53:2330// TODO(kbr): remove: http://crbug.com/222296
31#if defined(OS_MACOSX)
32#import "base/mac/mac_util.h"
33#endif
34
[email protected]c5eed492012-01-04 17:07:5035using content::NavigationController;
36
[email protected]21abcc742009-10-23 02:52:0637namespace {
38
[email protected]c1dffe82013-06-26 20:59:0539const char kTestingPage[] = "/keyevents_test.html";
[email protected]06bc5d92013-01-02 22:44:1340const char kSuppressEventJS[] =
41 "window.domAutomationController.send(setDefaultAction('%ls', %ls));";
42const char kGetResultJS[] =
43 "window.domAutomationController.send(keyEventResult[%d]);";
44const char kGetResultLengthJS[] =
45 "window.domAutomationController.send(keyEventResult.length);";
46const char kGetFocusedElementJS[] =
47 "window.domAutomationController.send(focusedElement);";
48const char kSetFocusedElementJS[] =
49 "window.domAutomationController.send(setFocusedElement('%ls'));";
50const char kGetTextBoxValueJS[] =
51 "window.domAutomationController.send("
52 " document.getElementById('%ls').value);";
53const char kSetTextBoxValueJS[] =
54 "window.domAutomationController.send("
55 " document.getElementById('%ls').value = '%ls');";
56const char kStartTestJS[] =
57 "window.domAutomationController.send(startTest(%d));";
[email protected]21abcc742009-10-23 02:52:0658
59// Maximum lenght of the result array in KeyEventTestData structure.
60const size_t kMaxResultLength = 10;
61
62// A structure holding test data of a keyboard event.
63// Each keyboard event may generate multiple result strings representing
64// the result of keydown, keypress, keyup and textInput events.
65// For keydown, keypress and keyup events, the format of the result string is:
[email protected]853300a82010-07-27 21:17:5766// <type> <keyCode> <charCode> <ctrlKey> <shiftKey> <altKey> <commandKey>
[email protected]21abcc742009-10-23 02:52:0667// where <type> may be 'D' (keydown), 'P' (keypress) or 'U' (keyup).
[email protected]853300a82010-07-27 21:17:5768// <ctrlKey>, <shiftKey> <altKey> and <commandKey> are boolean value indicating
69// the state of corresponding modifier key.
[email protected]21abcc742009-10-23 02:52:0670// For textInput event, the format is: T <text>, where <text> is the text to be
71// input.
72// Please refer to chrome/test/data/keyevents_test.html for details.
73struct KeyEventTestData {
[email protected]b6d81262011-01-13 17:36:0974 ui::KeyboardCode key;
[email protected]21abcc742009-10-23 02:52:0675 bool ctrl;
76 bool shift;
77 bool alt;
[email protected]853300a82010-07-27 21:17:5778 bool command;
[email protected]21abcc742009-10-23 02:52:0679
80 bool suppress_keydown;
81 bool suppress_keypress;
82 bool suppress_keyup;
83 bool suppress_textinput;
84
85 int result_length;
86 const char* const result[kMaxResultLength];
87};
88
89const wchar_t* GetBoolString(bool value) {
90 return value ? L"true" : L"false";
91}
92
93// A class to help wait for the finish of a key event test.
[email protected]6c2381d2011-10-19 02:52:5394class TestFinishObserver : public content::NotificationObserver {
[email protected]21abcc742009-10-23 02:52:0695 public:
[email protected]cfa856d62014-02-22 07:58:4096 explicit TestFinishObserver(content::WebContents* web_contents)
[email protected]21abcc742009-10-23 02:52:0697 : finished_(false), waiting_(false) {
[email protected]cfa856d62014-02-22 07:58:4098 registrar_.Add(this,
99 content::NOTIFICATION_DOM_OPERATION_RESPONSE,
100 content::Source<content::WebContents>(web_contents));
[email protected]21abcc742009-10-23 02:52:06101 }
102
103 bool WaitForFinish() {
104 if (!finished_) {
105 waiting_ = true;
[email protected]729eb632012-07-26 04:45:26106 content::RunMessageLoop();
[email protected]21abcc742009-10-23 02:52:06107 waiting_ = false;
108 }
109 return finished_;
110 }
111
Daniel Chenga542fca2014-10-21 09:51:29112 void Observe(int type,
113 const content::NotificationSource& source,
114 const content::NotificationDetails& details) override {
[email protected]766a7082012-02-03 23:39:15115 DCHECK(type == content::NOTIFICATION_DOM_OPERATION_RESPONSE);
avi60bd4902015-09-23 20:39:24116 content::Details<std::string> dom_op_result(details);
[email protected]21abcc742009-10-23 02:52:06117 // We might receive responses for other script execution, but we only
118 // care about the test finished message.
avi60bd4902015-09-23 20:39:24119 if (*dom_op_result.ptr() == "\"FINISHED\"") {
[email protected]21abcc742009-10-23 02:52:06120 finished_ = true;
121 if (waiting_)
ki.stfuc4f8e242015-10-09 20:40:20122 base::MessageLoopForUI::current()->QuitWhenIdle();
[email protected]21abcc742009-10-23 02:52:06123 }
124 }
125
126 private:
127 bool finished_;
128 bool waiting_;
[email protected]6c2381d2011-10-19 02:52:53129 content::NotificationRegistrar registrar_;
[email protected]21abcc742009-10-23 02:52:06130
131 DISALLOW_COPY_AND_ASSIGN(TestFinishObserver);
132};
133
134class BrowserKeyEventsTest : public InProcessBrowserTest {
135 public:
[email protected]90ca44272012-07-18 18:15:48136 BrowserKeyEventsTest() {}
[email protected]21abcc742009-10-23 02:52:06137
[email protected]21abcc742009-10-23 02:52:06138 bool IsViewFocused(ViewID vid) {
139 return ui_test_utils::IsViewFocused(browser(), vid);
140 }
141
142 void ClickOnView(ViewID vid) {
143 ui_test_utils::ClickOnView(browser(), vid);
144 }
145
146 // Set the suppress flag of an event specified by |type|. If |suppress| is
147 // true then the web page will suppress all events with |type|. Following
148 // event types are supported: keydown, keypress, keyup and textInput.
149 void SuppressEventByType(int tab_index, const wchar_t* type, bool suppress) {
[email protected]ee496952013-01-10 23:17:33150 ASSERT_LT(tab_index, browser()->tab_strip_model()->count());
[email protected]21abcc742009-10-23 02:52:06151 bool actual;
[email protected]b6987e02013-01-04 18:30:43152 ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
[email protected]ee496952013-01-10 23:17:33153 browser()->tab_strip_model()->GetWebContentsAt(tab_index),
[email protected]1870d5cf2011-05-12 01:55:40154 base::StringPrintf(kSuppressEventJS, type, GetBoolString(!suppress)),
[email protected]21abcc742009-10-23 02:52:06155 &actual));
156 ASSERT_EQ(!suppress, actual);
157 }
158
159 void SuppressEvents(int tab_index, bool keydown, bool keypress,
160 bool keyup, bool textinput) {
161 ASSERT_NO_FATAL_FAILURE(
162 SuppressEventByType(tab_index, L"keydown", keydown));
163 ASSERT_NO_FATAL_FAILURE(
164 SuppressEventByType(tab_index, L"keypress", keypress));
165 ASSERT_NO_FATAL_FAILURE(
166 SuppressEventByType(tab_index, L"keyup", keyup));
167 ASSERT_NO_FATAL_FAILURE(
168 SuppressEventByType(tab_index, L"textInput", textinput));
169 }
170
171 void SuppressAllEvents(int tab_index, bool suppress) {
172 SuppressEvents(tab_index, suppress, suppress, suppress, suppress);
173 }
174
175 void GetResultLength(int tab_index, int* length) {
[email protected]ee496952013-01-10 23:17:33176 ASSERT_LT(tab_index, browser()->tab_strip_model()->count());
[email protected]b6987e02013-01-04 18:30:43177 ASSERT_TRUE(content::ExecuteScriptAndExtractInt(
[email protected]ee496952013-01-10 23:17:33178 browser()->tab_strip_model()->GetWebContentsAt(tab_index),
[email protected]06bc5d92013-01-02 22:44:13179 kGetResultLengthJS,
180 length));
[email protected]21abcc742009-10-23 02:52:06181 }
182
183 void CheckResult(int tab_index, int length, const char* const result[]) {
[email protected]ee496952013-01-10 23:17:33184 ASSERT_LT(tab_index, browser()->tab_strip_model()->count());
[email protected]21abcc742009-10-23 02:52:06185 int actual_length;
186 ASSERT_NO_FATAL_FAILURE(GetResultLength(tab_index, &actual_length));
187 ASSERT_GE(actual_length, length);
188 for (int i = 0; i < actual_length; ++i) {
189 std::string actual;
[email protected]b6987e02013-01-04 18:30:43190 ASSERT_TRUE(content::ExecuteScriptAndExtractString(
[email protected]ee496952013-01-10 23:17:33191 browser()->tab_strip_model()->GetWebContentsAt(tab_index),
[email protected]06bc5d92013-01-02 22:44:13192 base::StringPrintf(kGetResultJS, i),
193 &actual));
[email protected]21abcc742009-10-23 02:52:06194
195 // If more events were received than expected, then the additional events
196 // must be keyup events.
197 if (i < length)
198 ASSERT_STREQ(result[i], actual.c_str());
199 else
200 ASSERT_EQ('U', actual[0]);
201 }
202 }
203
204 void CheckFocusedElement(int tab_index, const wchar_t* focused) {
[email protected]ee496952013-01-10 23:17:33205 ASSERT_LT(tab_index, browser()->tab_strip_model()->count());
[email protected]21abcc742009-10-23 02:52:06206 std::string actual;
[email protected]b6987e02013-01-04 18:30:43207 ASSERT_TRUE(content::ExecuteScriptAndExtractString(
[email protected]ee496952013-01-10 23:17:33208 browser()->tab_strip_model()->GetWebContentsAt(tab_index),
[email protected]06bc5d92013-01-02 22:44:13209 kGetFocusedElementJS,
210 &actual));
[email protected]cc2a2a22013-12-24 23:12:15211 ASSERT_EQ(base::WideToUTF8(focused), actual);
[email protected]21abcc742009-10-23 02:52:06212 }
213
214 void SetFocusedElement(int tab_index, const wchar_t* focused) {
[email protected]ee496952013-01-10 23:17:33215 ASSERT_LT(tab_index, browser()->tab_strip_model()->count());
[email protected]21abcc742009-10-23 02:52:06216 bool actual;
[email protected]b6987e02013-01-04 18:30:43217 ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
[email protected]ee496952013-01-10 23:17:33218 browser()->tab_strip_model()->GetWebContentsAt(tab_index),
[email protected]1870d5cf2011-05-12 01:55:40219 base::StringPrintf(kSetFocusedElementJS, focused),
[email protected]21abcc742009-10-23 02:52:06220 &actual));
221 ASSERT_TRUE(actual);
222 }
223
224 void CheckTextBoxValue(int tab_index, const wchar_t* id,
225 const wchar_t* value) {
[email protected]ee496952013-01-10 23:17:33226 ASSERT_LT(tab_index, browser()->tab_strip_model()->count());
[email protected]21abcc742009-10-23 02:52:06227 std::string actual;
[email protected]b6987e02013-01-04 18:30:43228 ASSERT_TRUE(content::ExecuteScriptAndExtractString(
[email protected]ee496952013-01-10 23:17:33229 browser()->tab_strip_model()->GetWebContentsAt(tab_index),
[email protected]1870d5cf2011-05-12 01:55:40230 base::StringPrintf(kGetTextBoxValueJS, id),
[email protected]21abcc742009-10-23 02:52:06231 &actual));
[email protected]cc2a2a22013-12-24 23:12:15232 ASSERT_EQ(base::WideToUTF8(value), actual);
[email protected]21abcc742009-10-23 02:52:06233 }
234
[email protected]853300a82010-07-27 21:17:57235 void SetTextBoxValue(int tab_index, const wchar_t* id,
236 const wchar_t* value) {
[email protected]ee496952013-01-10 23:17:33237 ASSERT_LT(tab_index, browser()->tab_strip_model()->count());
[email protected]853300a82010-07-27 21:17:57238 std::string actual;
[email protected]b6987e02013-01-04 18:30:43239 ASSERT_TRUE(content::ExecuteScriptAndExtractString(
[email protected]ee496952013-01-10 23:17:33240 browser()->tab_strip_model()->GetWebContentsAt(tab_index),
[email protected]1870d5cf2011-05-12 01:55:40241 base::StringPrintf(kSetTextBoxValueJS, id, value),
[email protected]853300a82010-07-27 21:17:57242 &actual));
[email protected]cc2a2a22013-12-24 23:12:15243 ASSERT_EQ(base::WideToUTF8(value), actual);
[email protected]853300a82010-07-27 21:17:57244 }
245
246 void StartTest(int tab_index, int result_length) {
[email protected]ee496952013-01-10 23:17:33247 ASSERT_LT(tab_index, browser()->tab_strip_model()->count());
[email protected]21abcc742009-10-23 02:52:06248 bool actual;
[email protected]b6987e02013-01-04 18:30:43249 ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
[email protected]ee496952013-01-10 23:17:33250 browser()->tab_strip_model()->GetWebContentsAt(tab_index),
[email protected]06bc5d92013-01-02 22:44:13251 base::StringPrintf(kStartTestJS, result_length),
252 &actual));
[email protected]21abcc742009-10-23 02:52:06253 ASSERT_TRUE(actual);
254 }
255
256 void TestKeyEvent(int tab_index, const KeyEventTestData& test) {
[email protected]ee496952013-01-10 23:17:33257 ASSERT_LT(tab_index, browser()->tab_strip_model()->count());
258 ASSERT_EQ(tab_index, browser()->tab_strip_model()->active_index());
[email protected]21abcc742009-10-23 02:52:06259
260 // Inform our testing web page that we are about to start testing a key
261 // event.
[email protected]853300a82010-07-27 21:17:57262 ASSERT_NO_FATAL_FAILURE(StartTest(tab_index, test.result_length));
[email protected]21abcc742009-10-23 02:52:06263 ASSERT_NO_FATAL_FAILURE(SuppressEvents(
264 tab_index, test.suppress_keydown, test.suppress_keypress,
265 test.suppress_keyup, test.suppress_textinput));
266
267 // We need to create a finish observer before sending the key event,
268 // because the test finished message might be arrived before returning
[email protected]a6e602f2010-09-28 22:28:30269 // from the SendKeyPressSync() method.
[email protected]21abcc742009-10-23 02:52:06270 TestFinishObserver finish_observer(
[email protected]cfa856d62014-02-22 07:58:40271 browser()->tab_strip_model()->GetWebContentsAt(tab_index));
[email protected]21abcc742009-10-23 02:52:06272
[email protected]a6e602f2010-09-28 22:28:30273 ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
274 browser(), test.key, test.ctrl, test.shift, test.alt, test.command));
[email protected]21abcc742009-10-23 02:52:06275 ASSERT_TRUE(finish_observer.WaitForFinish());
276 ASSERT_NO_FATAL_FAILURE(CheckResult(
277 tab_index, test.result_length, test.result));
278 }
279
280 std::string GetTestDataDescription(const KeyEventTestData& data) {
[email protected]1870d5cf2011-05-12 01:55:40281 std::string desc = base::StringPrintf(
[email protected]853300a82010-07-27 21:17:57282 " VKEY:0x%02x, ctrl:%d, shift:%d, alt:%d, command:%d\n"
[email protected]21abcc742009-10-23 02:52:06283 " Suppress: keydown:%d, keypress:%d, keyup:%d, textInput:%d\n"
284 " Expected results(%d):\n",
[email protected]853300a82010-07-27 21:17:57285 data.key, data.ctrl, data.shift, data.alt, data.command,
[email protected]21abcc742009-10-23 02:52:06286 data.suppress_keydown, data.suppress_keypress, data.suppress_keyup,
287 data.suppress_textinput, data.result_length);
288 for (int i = 0; i < data.result_length; ++i) {
289 desc.append(" ");
290 desc.append(data.result[i]);
291 desc.append("\n");
292 }
293 return desc;
294 }
295};
296
[email protected]5f80e0792013-10-01 07:18:55297// Flaky: http://crbug.com/129235, http://crbug.com/81451.
298IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, DISABLED_NormalKeyEvents) {
[email protected]21abcc742009-10-23 02:52:06299 static const KeyEventTestData kTestNoInput[] = {
300 // a
[email protected]b6d81262011-01-13 17:36:09301 { ui::VKEY_A, false, false, false, false,
[email protected]21abcc742009-10-23 02:52:06302 false, false, false, false, 3,
[email protected]853300a82010-07-27 21:17:57303 { "D 65 0 false false false false",
304 "P 97 97 false false false false",
305 "U 65 0 false false false false" } },
[email protected]21abcc742009-10-23 02:52:06306 // shift-a
[email protected]b6d81262011-01-13 17:36:09307 { ui::VKEY_A, false, true, false, false,
[email protected]21abcc742009-10-23 02:52:06308 false, false, false, false, 5,
[email protected]853300a82010-07-27 21:17:57309 { "D 16 0 false true false false",
310 "D 65 0 false true false false",
311 "P 65 65 false true false false",
312 "U 65 0 false true false false",
313 "U 16 0 false true false false" } },
[email protected]21abcc742009-10-23 02:52:06314 // a, suppress keydown
[email protected]b6d81262011-01-13 17:36:09315 { ui::VKEY_A, false, false, false, false,
[email protected]21abcc742009-10-23 02:52:06316 true, false, false, false, 2,
[email protected]853300a82010-07-27 21:17:57317 { "D 65 0 false false false false",
318 "U 65 0 false false false false" } },
[email protected]21abcc742009-10-23 02:52:06319 };
320
321 static const KeyEventTestData kTestWithInput[] = {
322 // a
[email protected]b6d81262011-01-13 17:36:09323 { ui::VKEY_A, false, false, false, false,
[email protected]21abcc742009-10-23 02:52:06324 false, false, false, false, 4,
[email protected]853300a82010-07-27 21:17:57325 { "D 65 0 false false false false",
326 "P 97 97 false false false false",
[email protected]21abcc742009-10-23 02:52:06327 "T a",
[email protected]853300a82010-07-27 21:17:57328 "U 65 0 false false false false" } },
[email protected]21abcc742009-10-23 02:52:06329 // shift-a
[email protected]b6d81262011-01-13 17:36:09330 { ui::VKEY_A, false, true, false, false,
[email protected]21abcc742009-10-23 02:52:06331 false, false, false, false, 6,
[email protected]853300a82010-07-27 21:17:57332 { "D 16 0 false true false false",
333 "D 65 0 false true false false",
334 "P 65 65 false true false false",
[email protected]21abcc742009-10-23 02:52:06335 "T A",
[email protected]853300a82010-07-27 21:17:57336 "U 65 0 false true false false",
337 "U 16 0 false true false false" } },
[email protected]21abcc742009-10-23 02:52:06338 // a, suppress keydown
[email protected]b6d81262011-01-13 17:36:09339 { ui::VKEY_A, false, false, false, false,
[email protected]21abcc742009-10-23 02:52:06340 true, false, false, false, 2,
[email protected]853300a82010-07-27 21:17:57341 { "D 65 0 false false false false",
342 "U 65 0 false false false false" } },
[email protected]21abcc742009-10-23 02:52:06343 // a, suppress keypress
[email protected]b6d81262011-01-13 17:36:09344 { ui::VKEY_A, false, false, false, false,
[email protected]21abcc742009-10-23 02:52:06345 false, true, false, false, 3,
[email protected]853300a82010-07-27 21:17:57346 { "D 65 0 false false false false",
347 "P 97 97 false false false false",
348 "U 65 0 false false false false" } },
[email protected]21abcc742009-10-23 02:52:06349 // a, suppress textInput
[email protected]b6d81262011-01-13 17:36:09350 { ui::VKEY_A, false, false, false, false,
[email protected]21abcc742009-10-23 02:52:06351 false, false, false, true, 4,
[email protected]853300a82010-07-27 21:17:57352 { "D 65 0 false false false false",
353 "P 97 97 false false false false",
[email protected]21abcc742009-10-23 02:52:06354 "T a",
[email protected]853300a82010-07-27 21:17:57355 "U 65 0 false false false false" } },
[email protected]21abcc742009-10-23 02:52:06356 };
357
svaldeza01f7d92015-11-18 17:47:56358 ASSERT_TRUE(embedded_test_server()->Start());
[email protected]21abcc742009-10-23 02:52:06359
[email protected]a6e602f2010-09-28 22:28:30360 ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
[email protected]c1dffe82013-06-26 20:59:05361 GURL url = embedded_test_server()->GetURL(kTestingPage);
[email protected]21abcc742009-10-23 02:52:06362 ui_test_utils::NavigateToURL(browser(), url);
363
364 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
[email protected]f2159ba2012-04-17 19:13:21365 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]21abcc742009-10-23 02:52:06366
[email protected]ee496952013-01-10 23:17:33367 int tab_index = browser()->tab_strip_model()->active_index();
[email protected]21abcc742009-10-23 02:52:06368 for (size_t i = 0; i < arraysize(kTestNoInput); ++i) {
369 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestNoInput[i]))
370 << "kTestNoInput[" << i << "] failed:\n"
371 << GetTestDataDescription(kTestNoInput[i]);
372 }
373
[email protected]853300a82010-07-27 21:17:57374 // Input in normal text box.
[email protected]21abcc742009-10-23 02:52:06375 ASSERT_NO_FATAL_FAILURE(SetFocusedElement(tab_index, L"A"));
376 for (size_t i = 0; i < arraysize(kTestWithInput); ++i) {
377 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestWithInput[i]))
[email protected]853300a82010-07-27 21:17:57378 << "kTestWithInput[" << i << "] in text box failed:\n"
[email protected]21abcc742009-10-23 02:52:06379 << GetTestDataDescription(kTestWithInput[i]);
380 }
[email protected]21abcc742009-10-23 02:52:06381 EXPECT_NO_FATAL_FAILURE(CheckTextBoxValue(tab_index, L"A", L"aA"));
[email protected]853300a82010-07-27 21:17:57382
383 // Input in password box.
384 ASSERT_NO_FATAL_FAILURE(SetFocusedElement(tab_index, L"B"));
385 for (size_t i = 0; i < arraysize(kTestWithInput); ++i) {
386 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestWithInput[i]))
387 << "kTestWithInput[" << i << "] in password box failed:\n"
388 << GetTestDataDescription(kTestWithInput[i]);
389 }
390 EXPECT_NO_FATAL_FAILURE(CheckTextBoxValue(tab_index, L"B", L"aA"));
[email protected]21abcc742009-10-23 02:52:06391}
392
[email protected]853300a82010-07-27 21:17:57393#if defined(OS_WIN) || defined(OS_LINUX)
[email protected]bf43a382012-05-22 23:33:53394
[email protected]0c2c0d12014-02-04 17:24:43395#if defined(OS_LINUX) || defined(OS_WIN)
[email protected]e8248a22013-08-07 18:25:20396// Linux: http://crbug.com/129235
[email protected]0c2c0d12014-02-04 17:24:43397// Win: crbug.com/269564
[email protected]e00ccc92012-11-01 17:32:30398#define MAYBE_CtrlKeyEvents DISABLED_CtrlKeyEvents
[email protected]bf43a382012-05-22 23:33:53399#else
400#define MAYBE_CtrlKeyEvents CtrlKeyEvents
401#endif
402
403IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, MAYBE_CtrlKeyEvents) {
[email protected]21abcc742009-10-23 02:52:06404 static const KeyEventTestData kTestCtrlF = {
[email protected]b6d81262011-01-13 17:36:09405 ui::VKEY_F, true, false, false, false,
[email protected]21abcc742009-10-23 02:52:06406 false, false, false, false, 2,
[email protected]853300a82010-07-27 21:17:57407 { "D 17 0 true false false false",
408 "D 70 0 true false false false" }
[email protected]21abcc742009-10-23 02:52:06409 };
410
411 static const KeyEventTestData kTestCtrlFSuppressKeyDown = {
[email protected]b6d81262011-01-13 17:36:09412 ui::VKEY_F, true, false, false, false,
[email protected]21abcc742009-10-23 02:52:06413 true, false, false, false, 4,
[email protected]853300a82010-07-27 21:17:57414 { "D 17 0 true false false false",
415 "D 70 0 true false false false",
416 "U 70 0 true false false false",
417 "U 17 0 true false false false" }
[email protected]21abcc742009-10-23 02:52:06418 };
419
420 // Ctrl+Z doesn't bind to any accelerators, which then should generate a
421 // keypress event with charCode=26.
422 static const KeyEventTestData kTestCtrlZ = {
[email protected]b6d81262011-01-13 17:36:09423 ui::VKEY_Z, true, false, false, false,
[email protected]21abcc742009-10-23 02:52:06424 false, false, false, false, 5,
[email protected]853300a82010-07-27 21:17:57425 { "D 17 0 true false false false",
426 "D 90 0 true false false false",
427 "P 26 26 true false false false",
428 "U 90 0 true false false false",
429 "U 17 0 true false false false" }
[email protected]21abcc742009-10-23 02:52:06430 };
431
432 static const KeyEventTestData kTestCtrlZSuppressKeyDown = {
[email protected]b6d81262011-01-13 17:36:09433 ui::VKEY_Z, true, false, false, false,
[email protected]21abcc742009-10-23 02:52:06434 true, false, false, false, 4,
[email protected]853300a82010-07-27 21:17:57435 { "D 17 0 true false false false",
436 "D 90 0 true false false false",
437 "U 90 0 true false false false",
438 "U 17 0 true false false false" }
[email protected]21abcc742009-10-23 02:52:06439 };
440
441 // Ctrl+Enter shall generate a keypress event with charCode=10 (LF).
442 static const KeyEventTestData kTestCtrlEnter = {
[email protected]b6d81262011-01-13 17:36:09443 ui::VKEY_RETURN, true, false, false, false,
[email protected]21abcc742009-10-23 02:52:06444 false, false, false, false, 5,
[email protected]853300a82010-07-27 21:17:57445 { "D 17 0 true false false false",
446 "D 13 0 true false false false",
447 "P 10 10 true false false false",
448 "U 13 0 true false false false",
449 "U 17 0 true false false false" }
[email protected]21abcc742009-10-23 02:52:06450 };
451
svaldeza01f7d92015-11-18 17:47:56452 ASSERT_TRUE(embedded_test_server()->Start());
[email protected]21abcc742009-10-23 02:52:06453
[email protected]a6e602f2010-09-28 22:28:30454 ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
[email protected]c1dffe82013-06-26 20:59:05455 GURL url = embedded_test_server()->GetURL(kTestingPage);
[email protected]21abcc742009-10-23 02:52:06456 ui_test_utils::NavigateToURL(browser(), url);
457
458 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
[email protected]f2159ba2012-04-17 19:13:21459 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]21abcc742009-10-23 02:52:06460
[email protected]ee496952013-01-10 23:17:33461 int tab_index = browser()->tab_strip_model()->active_index();
[email protected]21abcc742009-10-23 02:52:06462 // Press Ctrl+F, which will make the Find box open and request focus.
463 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlF));
464 EXPECT_TRUE(IsViewFocused(VIEW_ID_FIND_IN_PAGE_TEXT_FIELD));
465
466 // Press Escape to close the Find box and move the focus back to the web page.
[email protected]a6e602f2010-09-28 22:28:30467 ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
[email protected]b6d81262011-01-13 17:36:09468 browser(), ui::VKEY_ESCAPE, false, false, false, false));
[email protected]f2159ba2012-04-17 19:13:21469 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]21abcc742009-10-23 02:52:06470
471 // Press Ctrl+F with keydown suppressed shall not open the find box.
472 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlFSuppressKeyDown));
[email protected]f2159ba2012-04-17 19:13:21473 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]21abcc742009-10-23 02:52:06474
475 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlZ));
476 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlZSuppressKeyDown));
477 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlEnter));
478}
[email protected]853300a82010-07-27 21:17:57479#elif defined(OS_MACOSX)
[email protected]cb931932011-05-03 19:57:33480// http://crbug.com/81451
[email protected]4d2451652012-02-14 23:54:26481IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, DISABLED_CommandKeyEvents) {
[email protected]853300a82010-07-27 21:17:57482 static const KeyEventTestData kTestCmdF = {
[email protected]b6d81262011-01-13 17:36:09483 ui::VKEY_F, false, false, false, true,
[email protected]853300a82010-07-27 21:17:57484 false, false, false, false, 2,
485 { "D 91 0 false false false true",
486 "D 70 0 false false false true" }
487 };
488
489 // On Mac we don't send key up events when command modifier is down.
490 static const KeyEventTestData kTestCmdFSuppressKeyDown = {
[email protected]b6d81262011-01-13 17:36:09491 ui::VKEY_F, false, false, false, true,
[email protected]853300a82010-07-27 21:17:57492 true, false, false, false, 3,
493 { "D 91 0 false false false true",
494 "D 70 0 false false false true",
495 "U 91 0 false false false true" }
496 };
497
svaldeza01f7d92015-11-18 17:47:56498 ASSERT_TRUE(embedded_test_server()->Start());
[email protected]853300a82010-07-27 21:17:57499
[email protected]a6e602f2010-09-28 22:28:30500 ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
[email protected]c1dffe82013-06-26 20:59:05501 GURL url = embedded_test_server()->GetURL(kTestingPage);
[email protected]853300a82010-07-27 21:17:57502 ui_test_utils::NavigateToURL(browser(), url);
503
504 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
[email protected]f2159ba2012-04-17 19:13:21505 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]853300a82010-07-27 21:17:57506
[email protected]ee496952013-01-10 23:17:33507 int tab_index = browser()->tab_strip_model()->active_index();
[email protected]853300a82010-07-27 21:17:57508 // Press Cmd+F, which will make the Find box open and request focus.
509 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCmdF));
510 EXPECT_TRUE(IsViewFocused(VIEW_ID_FIND_IN_PAGE_TEXT_FIELD));
511
512 // Press Escape to close the Find box and move the focus back to the web page.
[email protected]a6e602f2010-09-28 22:28:30513 ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
[email protected]b6d81262011-01-13 17:36:09514 browser(), ui::VKEY_ESCAPE, false, false, false, false));
[email protected]f2159ba2012-04-17 19:13:21515 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]853300a82010-07-27 21:17:57516
517 // Press Cmd+F with keydown suppressed shall not open the find box.
518 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCmdFSuppressKeyDown));
[email protected]f2159ba2012-04-17 19:13:21519 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]853300a82010-07-27 21:17:57520}
521#endif
[email protected]21abcc742009-10-23 02:52:06522
[email protected]7ec41882013-05-14 18:24:16523// Flaky: http://crbug.com/81451 , http://crbug.com/129235 ,
524// also fails on Windows.
525IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, DISABLED_AccessKeys) {
[email protected]853300a82010-07-27 21:17:57526#if defined(OS_MACOSX)
527 // On Mac, access keys use ctrl+alt modifiers.
528 static const KeyEventTestData kTestAccessA = {
[email protected]b6d81262011-01-13 17:36:09529 ui::VKEY_A, true, false, true, false,
[email protected]853300a82010-07-27 21:17:57530 false, false, false, false, 6,
531 { "D 17 0 true false false false",
532 "D 18 0 true false true false",
533 "D 65 0 true false true false",
534 "U 65 0 true false true false",
535 "U 18 0 true false true false",
536 "U 17 0 true false false false" }
[email protected]21abcc742009-10-23 02:52:06537 };
538
[email protected]853300a82010-07-27 21:17:57539 static const KeyEventTestData kTestAccessDSuppress = {
[email protected]b6d81262011-01-13 17:36:09540 ui::VKEY_D, true, false, true, false,
[email protected]853300a82010-07-27 21:17:57541 true, true, true, false, 6,
542 { "D 17 0 true false false false",
543 "D 18 0 true false true false",
544 "D 68 0 true false true false",
545 "U 68 0 true false true false",
546 "U 18 0 true false true false",
547 "U 17 0 true false false false" }
548 };
549
550 static const KeyEventTestData kTestAccess1 = {
[email protected]b6d81262011-01-13 17:36:09551 ui::VKEY_1, true, false, true, false,
[email protected]853300a82010-07-27 21:17:57552 false, false, false, false, 6,
553 { "D 17 0 true false false false",
554 "D 18 0 true false true false",
555 "D 49 0 true false true false",
556 "U 49 0 true false true false",
557 "U 18 0 true false true false",
558 "U 17 0 true false false false" }
559 };
560#else
561 static const KeyEventTestData kTestAccessA = {
[email protected]b6d81262011-01-13 17:36:09562 ui::VKEY_A, false, false, true, false,
[email protected]853300a82010-07-27 21:17:57563 false, false, false, false, 4,
564 { "D 18 0 false false true false",
565 "D 65 0 false false true false",
566 "U 65 0 false false true false",
567 "U 18 0 false false true false" }
568 };
569
570 static const KeyEventTestData kTestAccessD = {
[email protected]b6d81262011-01-13 17:36:09571 ui::VKEY_D, false, false, true, false,
[email protected]21abcc742009-10-23 02:52:06572 false, false, false, false, 2,
[email protected]853300a82010-07-27 21:17:57573 { "D 18 0 false false true false",
574 "D 68 0 false false true false" }
[email protected]21abcc742009-10-23 02:52:06575 };
576
[email protected]853300a82010-07-27 21:17:57577 static const KeyEventTestData kTestAccessDSuppress = {
[email protected]b6d81262011-01-13 17:36:09578 ui::VKEY_D, false, false, true, false,
[email protected]21abcc742009-10-23 02:52:06579 true, true, true, false, 4,
[email protected]853300a82010-07-27 21:17:57580 { "D 18 0 false false true false",
581 "D 68 0 false false true false",
582 "U 68 0 false false true false",
583 "U 18 0 false false true false" }
[email protected]21abcc742009-10-23 02:52:06584 };
585
[email protected]ed172d22012-05-10 08:17:13586#if !defined(USE_ASH)
[email protected]853300a82010-07-27 21:17:57587 static const KeyEventTestData kTestAccess1 = {
[email protected]b6d81262011-01-13 17:36:09588 ui::VKEY_1, false, false, true, false,
[email protected]21abcc742009-10-23 02:52:06589 false, false, false, false, 4,
[email protected]853300a82010-07-27 21:17:57590 { "D 18 0 false false true false",
591 "D 49 0 false false true false",
592 "U 49 0 false false true false",
593 "U 18 0 false false true false" }
[email protected]21abcc742009-10-23 02:52:06594 };
[email protected]853300a82010-07-27 21:17:57595#endif
[email protected]ed172d22012-05-10 08:17:13596#endif
[email protected]21abcc742009-10-23 02:52:06597
svaldeza01f7d92015-11-18 17:47:56598 ASSERT_TRUE(embedded_test_server()->Start());
[email protected]21abcc742009-10-23 02:52:06599
[email protected]a6e602f2010-09-28 22:28:30600 ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
[email protected]c1dffe82013-06-26 20:59:05601 GURL url = embedded_test_server()->GetURL(kTestingPage);
[email protected]21abcc742009-10-23 02:52:06602 ui_test_utils::NavigateToURL(browser(), url);
603
[email protected]b8deecd2012-07-30 21:09:44604 content::RunAllPendingInMessageLoop();
[email protected]21abcc742009-10-23 02:52:06605 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
[email protected]f2159ba2012-04-17 19:13:21606 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]21abcc742009-10-23 02:52:06607
[email protected]ee496952013-01-10 23:17:33608 int tab_index = browser()->tab_strip_model()->active_index();
[email protected]21abcc742009-10-23 02:52:06609 // Make sure no element is focused.
610 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L""));
611 // Alt+A should focus the element with accesskey = "A".
[email protected]853300a82010-07-27 21:17:57612 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestAccessA));
[email protected]21abcc742009-10-23 02:52:06613 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L"A"));
614
615 // Blur the focused element.
616 EXPECT_NO_FATAL_FAILURE(SetFocusedElement(tab_index, L""));
617 // Make sure no element is focused.
618 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L""));
[email protected]853300a82010-07-27 21:17:57619
620#if !defined(OS_MACOSX)
[email protected]21abcc742009-10-23 02:52:06621 // Alt+D should move the focus to the location entry.
[email protected]853300a82010-07-27 21:17:57622 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestAccessD));
[email protected]095b55f62010-09-24 08:06:04623
624 // TODO(isherman): This is an experimental change to help diagnose
625 // http://crbug.com/55713
[email protected]b8deecd2012-07-30 21:09:44626 content::RunAllPendingInMessageLoop();
[email protected]0b8fa8b2011-12-07 00:54:52627 EXPECT_TRUE(IsViewFocused(VIEW_ID_OMNIBOX));
[email protected]21abcc742009-10-23 02:52:06628 // No element should be focused, as Alt+D was handled by the browser.
629 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L""));
630
631 // Move the focus back to the web page.
632 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
[email protected]f2159ba2012-04-17 19:13:21633 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]21abcc742009-10-23 02:52:06634
635 // Make sure no element is focused.
636 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L""));
[email protected]853300a82010-07-27 21:17:57637#endif
638
[email protected]21abcc742009-10-23 02:52:06639 // If the keydown event is suppressed, then Alt+D should be handled as an
640 // accesskey rather than an accelerator key. Activation of an accesskey is not
641 // a part of the default action of the key event, so it should not be
642 // suppressed at all.
[email protected]853300a82010-07-27 21:17:57643 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestAccessDSuppress));
[email protected]f2159ba2012-04-17 19:13:21644 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]21abcc742009-10-23 02:52:06645 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L"D"));
646
647 // Blur the focused element.
648 EXPECT_NO_FATAL_FAILURE(SetFocusedElement(tab_index, L""));
649 // Make sure no element is focused.
650 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L""));
[email protected]ed172d22012-05-10 08:17:13651#if !defined(USE_ASH)
652 // On Ash, alt-1..9 are assigned as window selection global accelerators, so
653 // they can not be used as accesskeys.
[email protected]853300a82010-07-27 21:17:57654 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestAccess1));
[email protected]21abcc742009-10-23 02:52:06655 EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L"1"));
656#endif
657}
658
[email protected]6db98962011-10-04 22:42:49659// Flaky, http://crbug.com/69475.
[email protected]0c2c0d12014-02-04 17:24:43660#if defined(OS_LINUX) || defined(OS_WIN)
[email protected]4d2451652012-02-14 23:54:26661#define MAYBE_ReservedAccelerators DISABLED_ReservedAccelerators
[email protected]6db98962011-10-04 22:42:49662#else
663#define MAYBE_ReservedAccelerators ReservedAccelerators
664#endif
665IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, MAYBE_ReservedAccelerators) {
svaldeza01f7d92015-11-18 17:47:56666 ASSERT_TRUE(embedded_test_server()->Start());
[email protected]21abcc742009-10-23 02:52:06667
[email protected]a6e602f2010-09-28 22:28:30668 ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
[email protected]c1dffe82013-06-26 20:59:05669 GURL url = embedded_test_server()->GetURL(kTestingPage);
[email protected]21abcc742009-10-23 02:52:06670 ui_test_utils::NavigateToURL(browser(), url);
671
672 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
[email protected]f2159ba2012-04-17 19:13:21673 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]21abcc742009-10-23 02:52:06674
[email protected]ee496952013-01-10 23:17:33675 ASSERT_EQ(1, browser()->tab_strip_model()->count());
[email protected]0f72a2dc2010-12-06 19:40:23676
[email protected]e4292a232010-12-11 01:46:41677 static const KeyEventTestData kTestCtrlOrCmdT = {
[email protected]3ab6796d32010-12-21 23:56:07678#if defined(OS_MACOSX)
[email protected]b6d81262011-01-13 17:36:09679 ui::VKEY_T, false, false, false, true,
[email protected]853300a82010-07-27 21:17:57680 true, false, false, false, 1,
681 { "D 91 0 false false false true" }
[email protected]3ab6796d32010-12-21 23:56:07682#else
[email protected]b6d81262011-01-13 17:36:09683 ui::VKEY_T, true, false, false, false,
[email protected]3ab6796d32010-12-21 23:56:07684 true, false, false, false, 1,
685 { "D 17 0 true false false false" }
[email protected]e4292a232010-12-11 01:46:41686#endif
[email protected]853300a82010-07-27 21:17:57687 };
[email protected]867125a02009-12-10 06:01:48688
[email protected]a7fe9112012-07-20 02:34:45689 content::WindowedNotificationObserver wait_for_new_tab(
[email protected]884033e2012-04-16 19:38:42690 chrome::NOTIFICATION_TAB_PARENTED,
[email protected]ad50def52011-10-19 23:17:07691 content::NotificationService::AllSources());
[email protected]0f72a2dc2010-12-06 19:40:23692
[email protected]e4292a232010-12-11 01:46:41693 // Press Ctrl/Cmd+T, which will open a new tab. It cannot be suppressed.
694 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(0, kTestCtrlOrCmdT));
[email protected]ae673742011-08-24 19:48:37695 wait_for_new_tab.Wait();
[email protected]853300a82010-07-27 21:17:57696
697 int result_length;
698 ASSERT_NO_FATAL_FAILURE(GetResultLength(0, &result_length));
699 EXPECT_EQ(1, result_length);
700
[email protected]ee496952013-01-10 23:17:33701 EXPECT_EQ(2, browser()->tab_strip_model()->count());
702 ASSERT_EQ(1, browser()->tab_strip_model()->active_index());
[email protected]0f72a2dc2010-12-06 19:40:23703
[email protected]884033e2012-04-16 19:38:42704 // Because of issue <http://crbug.com/65375>, switching back to the first tab
[email protected]0f72a2dc2010-12-06 19:40:23705 // may cause the focus to be grabbed by omnibox. So instead, we load our
706 // testing page in the newly created tab and try Cmd-W here.
707 ui_test_utils::NavigateToURL(browser(), url);
708
709 // Make sure the focus is in the testing page.
710 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
[email protected]f2159ba2012-04-17 19:13:21711 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]0f72a2dc2010-12-06 19:40:23712
[email protected]853300a82010-07-27 21:17:57713 // Reserved accelerators can't be suppressed.
[email protected]0f72a2dc2010-12-06 19:40:23714 ASSERT_NO_FATAL_FAILURE(SuppressAllEvents(1, true));
715
[email protected]13c526cc2013-10-17 05:51:38716 content::WebContentsDestroyedWatcher destroyed_watcher(
717 browser()->tab_strip_model()->GetWebContentsAt(1));
[email protected]e4292a232010-12-11 01:46:41718
719 // Press Ctrl/Cmd+W, which will close the tab.
[email protected]3ab6796d32010-12-21 23:56:07720#if defined(OS_MACOSX)
[email protected]a6e602f2010-09-28 22:28:30721 ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
[email protected]b6d81262011-01-13 17:36:09722 browser(), ui::VKEY_W, false, false, false, true));
[email protected]3ab6796d32010-12-21 23:56:07723#else
724 ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
[email protected]b6d81262011-01-13 17:36:09725 browser(), ui::VKEY_W, true, false, false, false));
[email protected]e4292a232010-12-11 01:46:41726#endif
727
[email protected]13c526cc2013-10-17 05:51:38728 ASSERT_NO_FATAL_FAILURE(destroyed_watcher.Wait());
[email protected]e4292a232010-12-11 01:46:41729
[email protected]ee496952013-01-10 23:17:33730 EXPECT_EQ(1, browser()->tab_strip_model()->count());
[email protected]21abcc742009-10-23 02:52:06731}
[email protected]853300a82010-07-27 21:17:57732
733#if defined(OS_MACOSX)
734IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, EditorKeyBindings) {
[email protected]984aecc2013-03-24 03:53:23735 // TODO(kbr): re-enable: http://crbug.com/222296
thakis5991e162016-05-31 23:27:52736 return;
[email protected]984aecc2013-03-24 03:53:23737
[email protected]853300a82010-07-27 21:17:57738 static const KeyEventTestData kTestCtrlA = {
[email protected]b6d81262011-01-13 17:36:09739 ui::VKEY_A, true, false, false, false,
[email protected]853300a82010-07-27 21:17:57740 false, false, false, false, 4,
741 { "D 17 0 true false false false",
742 "D 65 0 true false false false",
743 "U 65 0 true false false false",
744 "U 17 0 true false false false" }
745 };
746
747 static const KeyEventTestData kTestCtrlF = {
[email protected]b6d81262011-01-13 17:36:09748 ui::VKEY_F, true, false, false, false,
[email protected]853300a82010-07-27 21:17:57749 false, false, false, false, 4,
750 { "D 17 0 true false false false",
751 "D 70 0 true false false false",
752 "U 70 0 true false false false",
753 "U 17 0 true false false false" }
754 };
755
756 static const KeyEventTestData kTestCtrlK = {
[email protected]b6d81262011-01-13 17:36:09757 ui::VKEY_K, true, false, false, false,
[email protected]853300a82010-07-27 21:17:57758 false, false, false, false, 4,
759 { "D 17 0 true false false false",
760 "D 75 0 true false false false",
761 "U 75 0 true false false false",
762 "U 17 0 true false false false" }
763 };
764
svaldeza01f7d92015-11-18 17:47:56765 ASSERT_TRUE(embedded_test_server()->Start());
[email protected]853300a82010-07-27 21:17:57766
[email protected]a6e602f2010-09-28 22:28:30767 ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
[email protected]c1dffe82013-06-26 20:59:05768 GURL url = embedded_test_server()->GetURL(kTestingPage);
[email protected]853300a82010-07-27 21:17:57769 ui_test_utils::NavigateToURL(browser(), url);
770
771 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
[email protected]f2159ba2012-04-17 19:13:21772 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]853300a82010-07-27 21:17:57773
[email protected]ee496952013-01-10 23:17:33774 int tab_index = browser()->tab_strip_model()->active_index();
[email protected]853300a82010-07-27 21:17:57775 ASSERT_NO_FATAL_FAILURE(SetFocusedElement(tab_index, L"A"));
776 ASSERT_NO_FATAL_FAILURE(SetTextBoxValue(tab_index, L"A", L"Hello"));
777 // Move the caret to the beginning of the line.
778 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlA));
779 // Forward one character
780 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlF));
781 // Delete to the end of the line.
782 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlK));
783 EXPECT_NO_FATAL_FAILURE(CheckTextBoxValue(tab_index, L"A", L"H"));
784}
785#endif
786
[email protected]6f39373f2012-09-10 16:02:31787// See http://crbug.com/147579
[email protected]1e09ec82012-12-21 22:48:09788IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, DISABLED_PageUpDownKeys) {
[email protected]853300a82010-07-27 21:17:57789 static const KeyEventTestData kTestPageUp = {
[email protected]b6d81262011-01-13 17:36:09790 ui::VKEY_PRIOR, false, false, false, false,
[email protected]853300a82010-07-27 21:17:57791 false, false, false, false, 2,
792 { "D 33 0 false false false false",
793 "U 33 0 false false false false" }
794 };
795
796 static const KeyEventTestData kTestPageDown = {
[email protected]b6d81262011-01-13 17:36:09797 ui::VKEY_NEXT, false, false, false, false,
[email protected]853300a82010-07-27 21:17:57798 false, false, false, false, 2,
799 { "D 34 0 false false false false",
800 "U 34 0 false false false false" }
801 };
802
svaldeza01f7d92015-11-18 17:47:56803 ASSERT_TRUE(embedded_test_server()->Start());
[email protected]853300a82010-07-27 21:17:57804
[email protected]a6e602f2010-09-28 22:28:30805 ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
[email protected]c1dffe82013-06-26 20:59:05806 GURL url = embedded_test_server()->GetURL(kTestingPage);
[email protected]853300a82010-07-27 21:17:57807 ui_test_utils::NavigateToURL(browser(), url);
808
809 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
[email protected]f2159ba2012-04-17 19:13:21810 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]853300a82010-07-27 21:17:57811
[email protected]ee496952013-01-10 23:17:33812 int tab_index = browser()->tab_strip_model()->active_index();
[email protected]853300a82010-07-27 21:17:57813 ASSERT_NO_FATAL_FAILURE(SetFocusedElement(tab_index, L"A"));
814 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestPageUp));
815 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestPageDown));
816 EXPECT_NO_FATAL_FAILURE(CheckTextBoxValue(tab_index, L"A", L""));
817}
[email protected]629e0342010-07-27 23:30:13818
[email protected]33b36dc2012-02-25 04:46:32819// AltKey is enabled only on Windows. See crbug.com/114537.
chrishtr4e7fe672015-09-09 19:02:20820#if defined(OS_WIN)
sky4df637772015-10-22 17:20:18821// If this flakes, disable and log details in http://crbug.com/523255.
822// TODO(sky): remove comment if proves stable and reenable other tests.
823IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, FocusMenuBarByAltKey) {
[email protected]ee19cb202010-08-04 19:48:19824 static const KeyEventTestData kTestAltKey = {
[email protected]b6d81262011-01-13 17:36:09825 ui::VKEY_MENU, false, false, false, false,
[email protected]ee19cb202010-08-04 19:48:19826 false, false, false, false, 2,
827 { "D 18 0 false false true false",
828 "U 18 0 false false true false" }
829 };
830
831 static const KeyEventTestData kTestAltKeySuppress = {
[email protected]b6d81262011-01-13 17:36:09832 ui::VKEY_MENU, false, false, false, false,
[email protected]ee19cb202010-08-04 19:48:19833 true, false, false, false, 2,
834 { "D 18 0 false false true false",
835 "U 18 0 false false true false" }
836 };
837
838 static const KeyEventTestData kTestCtrlAltKey = {
[email protected]b6d81262011-01-13 17:36:09839 ui::VKEY_MENU, true, false, false, false,
[email protected]ee19cb202010-08-04 19:48:19840 false, false, false, false, 4,
841 { "D 17 0 true false false false",
842 "D 18 0 true false true false",
843 "U 18 0 true false true false",
844 "U 17 0 true false false false" }
845 };
846
svaldeza01f7d92015-11-18 17:47:56847 ASSERT_TRUE(embedded_test_server()->Start());
[email protected]ee19cb202010-08-04 19:48:19848
[email protected]a6e602f2010-09-28 22:28:30849 ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
[email protected]c1dffe82013-06-26 20:59:05850 GURL url = embedded_test_server()->GetURL(kTestingPage);
[email protected]ee19cb202010-08-04 19:48:19851 ui_test_utils::NavigateToURL(browser(), url);
852
853 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
[email protected]f2159ba2012-04-17 19:13:21854 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]ee19cb202010-08-04 19:48:19855
[email protected]ee496952013-01-10 23:17:33856 int tab_index = browser()->tab_strip_model()->active_index();
[email protected]ee19cb202010-08-04 19:48:19857 // Press and release Alt key to focus wrench menu button.
858 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestAltKey));
859 EXPECT_TRUE(IsViewFocused(VIEW_ID_APP_MENU));
860
861 ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
[email protected]f2159ba2012-04-17 19:13:21862 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]ee19cb202010-08-04 19:48:19863
864 // Alt key can be suppressed.
865 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestAltKeySuppress));
[email protected]f2159ba2012-04-17 19:13:21866 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]ee19cb202010-08-04 19:48:19867
868 // Ctrl+Alt should have no effect.
869 EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlAltKey));
[email protected]f2159ba2012-04-17 19:13:21870 ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
[email protected]ee19cb202010-08-04 19:48:19871}
872#endif
873
[email protected]629e0342010-07-27 23:30:13874} // namespace