1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "build/build_config.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/basictypes.h"
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/logging.h"
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/message_loop.h"
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string_util.h"
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/utf_string_conversions.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/values.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/dom_operation_notification_details.h"
144a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/ui/browser.h"
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/chrome_paths.h"
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/in_process_browser_test.h"
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/ui_test_utils.h"
18dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/render_view_host.h"
19dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/render_widget_host_view.h"
20dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents.h"
21dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents_view.h"
22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_registrar.h"
23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_service.h"
243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "net/test/test_server.h"
2572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/keycodes/keyboard_codes.h"
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace {
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char kTestingPage[] = "files/keyevents_test.html";
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst wchar_t kSuppressEventJS[] =
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    L"window.domAutomationController.send(setDefaultAction('%ls', %ls));";
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst wchar_t kGetResultJS[] =
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    L"window.domAutomationController.send(keyEventResult[%d]);";
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst wchar_t kGetResultLengthJS[] =
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    L"window.domAutomationController.send(keyEventResult.length);";
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst wchar_t kGetFocusedElementJS[] =
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    L"window.domAutomationController.send(focusedElement);";
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst wchar_t kSetFocusedElementJS[] =
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    L"window.domAutomationController.send(setFocusedElement('%ls'));";
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst wchar_t kGetTextBoxValueJS[] =
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    L"window.domAutomationController.send("
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    L"document.getElementById('%ls').value);";
433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst wchar_t kSetTextBoxValueJS[] =
443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    L"window.domAutomationController.send("
453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    L"document.getElementById('%ls').value = '%ls');";
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst wchar_t kStartTestJS[] =
473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    L"window.domAutomationController.send(startTest(%d));";
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Maximum lenght of the result array in KeyEventTestData structure.
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst size_t kMaxResultLength = 10;
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// A structure holding test data of a keyboard event.
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Each keyboard event may generate multiple result strings representing
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// the result of keydown, keypress, keyup and textInput events.
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// For keydown, keypress and keyup events, the format of the result string is:
563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// <type> <keyCode> <charCode> <ctrlKey> <shiftKey> <altKey> <commandKey>
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// where <type> may be 'D' (keydown), 'P' (keypress) or 'U' (keyup).
583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// <ctrlKey>, <shiftKey> <altKey> and <commandKey> are boolean value indicating
593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// the state of corresponding modifier key.
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// For textInput event, the format is: T <text>, where <text> is the text to be
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// input.
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Please refer to chrome/test/data/keyevents_test.html for details.
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct KeyEventTestData {
6472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ui::KeyboardCode key;
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool ctrl;
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool shift;
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool alt;
683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bool command;
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool suppress_keydown;
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool suppress_keypress;
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool suppress_keyup;
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool suppress_textinput;
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int result_length;
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const char* const result[kMaxResultLength];
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst wchar_t* GetBoolString(bool value) {
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return value ? L"true" : L"false";
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// A class to help wait for the finish of a key event test.
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass TestFinishObserver : public NotificationObserver {
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  explicit TestFinishObserver(RenderViewHost* render_view_host)
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      : finished_(false), waiting_(false) {
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    registrar_.Add(this, NotificationType::DOM_OPERATION_RESPONSE,
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   Source<RenderViewHost>(render_view_host));
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool WaitForFinish() {
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (!finished_) {
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      waiting_ = true;
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ui_test_utils::RunMessageLoop();
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      waiting_ = false;
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return finished_;
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Observe(NotificationType type,
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationSource& source,
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationDetails& details) {
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    DCHECK(type == NotificationType::DOM_OPERATION_RESPONSE);
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    Details<DomOperationNotificationDetails> dom_op_details(details);
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // We might receive responses for other script execution, but we only
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // care about the test finished message.
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (dom_op_details->json() == "\"FINISHED\"") {
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      finished_ = true;
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      if (waiting_)
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        MessageLoopForUI::current()->Quit();
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool finished_;
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool waiting_;
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NotificationRegistrar registrar_;
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(TestFinishObserver);
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass BrowserKeyEventsTest : public InProcessBrowserTest {
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BrowserKeyEventsTest() {
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    set_show_window(true);
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EnableDOMAutomation();
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool IsViewFocused(ViewID vid) {
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return ui_test_utils::IsViewFocused(browser(), vid);
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void ClickOnView(ViewID vid) {
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ui_test_utils::ClickOnView(browser(), vid);
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Set the suppress flag of an event specified by |type|. If |suppress| is
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // true then the web page will suppress all events with |type|. Following
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // event types are supported: keydown, keypress, keyup and textInput.
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SuppressEventByType(int tab_index, const wchar_t* type, bool suppress) {
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_LT(tab_index, browser()->tab_count());
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    bool actual;
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool(
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        browser()->GetTabContentsAt(tab_index)->render_view_host(),
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        L"",
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        StringPrintf(kSuppressEventJS, type, GetBoolString(!suppress)),
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        &actual));
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_EQ(!suppress, actual);
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SuppressEvents(int tab_index, bool keydown, bool keypress,
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                      bool keyup, bool textinput) {
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_NO_FATAL_FAILURE(
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        SuppressEventByType(tab_index, L"keydown", keydown));
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_NO_FATAL_FAILURE(
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        SuppressEventByType(tab_index, L"keypress", keypress));
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_NO_FATAL_FAILURE(
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        SuppressEventByType(tab_index, L"keyup", keyup));
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_NO_FATAL_FAILURE(
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        SuppressEventByType(tab_index, L"textInput", textinput));
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SuppressAllEvents(int tab_index, bool suppress) {
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    SuppressEvents(tab_index, suppress, suppress, suppress, suppress);
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void GetResultLength(int tab_index, int* length) {
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_LT(tab_index, browser()->tab_count());
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractInt(
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        browser()->GetTabContentsAt(tab_index)->render_view_host(),
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        L"", kGetResultLengthJS, length));
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void CheckResult(int tab_index, int length, const char* const result[]) {
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_LT(tab_index, browser()->tab_count());
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int actual_length;
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_NO_FATAL_FAILURE(GetResultLength(tab_index, &actual_length));
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_GE(actual_length, length);
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    for (int i = 0; i < actual_length; ++i) {
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      std::string actual;
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractString(
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          browser()->GetTabContentsAt(tab_index)->render_view_host(),
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          L"", StringPrintf(kGetResultJS, i), &actual));
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      // If more events were received than expected, then the additional events
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      // must be keyup events.
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      if (i < length)
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        ASSERT_STREQ(result[i], actual.c_str());
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      else
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        ASSERT_EQ('U', actual[0]);
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void CheckFocusedElement(int tab_index, const wchar_t* focused) {
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_LT(tab_index, browser()->tab_count());
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    std::string actual;
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractString(
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        browser()->GetTabContentsAt(tab_index)->render_view_host(),
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        L"", kGetFocusedElementJS, &actual));
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_EQ(WideToUTF8(focused), actual);
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetFocusedElement(int tab_index, const wchar_t* focused) {
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_LT(tab_index, browser()->tab_count());
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    bool actual;
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool(
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        browser()->GetTabContentsAt(tab_index)->render_view_host(),
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        L"",
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        StringPrintf(kSetFocusedElementJS, focused),
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        &actual));
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_TRUE(actual);
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void CheckTextBoxValue(int tab_index, const wchar_t* id,
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         const wchar_t* value) {
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_LT(tab_index, browser()->tab_count());
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    std::string actual;
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractString(
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        browser()->GetTabContentsAt(tab_index)->render_view_host(),
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        L"",
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        StringPrintf(kGetTextBoxValueJS, id),
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        &actual));
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_EQ(WideToUTF8(value), actual);
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void SetTextBoxValue(int tab_index, const wchar_t* id,
2283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                       const wchar_t* value) {
2293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    ASSERT_LT(tab_index, browser()->tab_count());
2303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    std::string actual;
2313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractString(
2323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        browser()->GetTabContentsAt(tab_index)->render_view_host(),
2333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        L"",
2343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        StringPrintf(kSetTextBoxValueJS, id, value),
2353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        &actual));
2363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    ASSERT_EQ(WideToUTF8(value), actual);
2373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
2383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void StartTest(int tab_index, int result_length) {
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_LT(tab_index, browser()->tab_count());
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    bool actual;
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool(
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        browser()->GetTabContentsAt(tab_index)->render_view_host(),
2443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        L"", StringPrintf(kStartTestJS, result_length), &actual));
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_TRUE(actual);
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void TestKeyEvent(int tab_index, const KeyEventTestData& test) {
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_LT(tab_index, browser()->tab_count());
250ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ASSERT_EQ(tab_index, browser()->active_index());
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Inform our testing web page that we are about to start testing a key
253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // event.
2543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    ASSERT_NO_FATAL_FAILURE(StartTest(tab_index, test.result_length));
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_NO_FATAL_FAILURE(SuppressEvents(
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        tab_index, test.suppress_keydown, test.suppress_keypress,
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        test.suppress_keyup, test.suppress_textinput));
258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // We need to create a finish observer before sending the key event,
260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // because the test finished message might be arrived before returning
2613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // from the SendKeyPressSync() method.
262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    TestFinishObserver finish_observer(
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        browser()->GetTabContentsAt(tab_index)->render_view_host());
264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
2663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        browser(), test.key, test.ctrl, test.shift, test.alt, test.command));
267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_TRUE(finish_observer.WaitForFinish());
268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_NO_FATAL_FAILURE(CheckResult(
269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        tab_index, test.result_length, test.result));
270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string GetTestDataDescription(const KeyEventTestData& data) {
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    std::string desc = StringPrintf(
2743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        " VKEY:0x%02x, ctrl:%d, shift:%d, alt:%d, command:%d\n"
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        " Suppress: keydown:%d, keypress:%d, keyup:%d, textInput:%d\n"
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        " Expected results(%d):\n",
2773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        data.key, data.ctrl, data.shift, data.alt, data.command,
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        data.suppress_keydown, data.suppress_keypress, data.suppress_keyup,
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        data.suppress_textinput, data.result_length);
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    for (int i = 0; i < data.result_length; ++i) {
281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      desc.append("  ");
282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      desc.append(data.result[i]);
283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      desc.append("\n");
284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return desc;
286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2893345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickIN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, NormalKeyEvents) {
290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static const KeyEventTestData kTestNoInput[] = {
291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // a
29272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ui::VKEY_A, false, false, false, false,
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      false, false, false, false, 3,
2943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      { "D 65 0 false false false false",
2953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        "P 97 97 false false false false",
2963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        "U 65 0 false false false false" } },
297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // shift-a
29872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ui::VKEY_A, false, true, false, false,
299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      false, false, false, false, 5,
3003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      { "D 16 0 false true false false",
3013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        "D 65 0 false true false false",
3023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        "P 65 65 false true false false",
3033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        "U 65 0 false true false false",
3043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        "U 16 0 false true false false" } },
305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // a, suppress keydown
30672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ui::VKEY_A, false, false, false, false,
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      true, false, false, false, 2,
3083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      { "D 65 0 false false false false",
3093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        "U 65 0 false false false false" } },
310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static const KeyEventTestData kTestWithInput[] = {
313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // a
31472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ui::VKEY_A, false, false, false, false,
315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      false, false, false, false, 4,
3163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      { "D 65 0 false false false false",
3173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        "P 97 97 false false false false",
318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        "T a",
3193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        "U 65 0 false false false false" } },
320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // shift-a
32172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ui::VKEY_A, false, true, false, false,
322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      false, false, false, false, 6,
3233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      { "D 16 0 false true false false",
3243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        "D 65 0 false true false false",
3253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        "P 65 65 false true false false",
326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        "T A",
3273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        "U 65 0 false true false false",
3283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        "U 16 0 false true false false" } },
329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // a, suppress keydown
33072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ui::VKEY_A, false, false, false, false,
331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      true, false, false, false, 2,
3323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      { "D 65 0 false false false false",
3333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        "U 65 0 false false false false" } },
334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // a, suppress keypress
33572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ui::VKEY_A, false, false, false, false,
336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      false, true, false, false, 3,
3373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      { "D 65 0 false false false false",
3383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        "P 97 97 false false false false",
3393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        "U 65 0 false false false false" } },
340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // a, suppress textInput
34172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { ui::VKEY_A, false, false, false, false,
342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      false, false, false, true, 4,
3433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      { "D 65 0 false false false false",
3443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        "P 97 97 false false false false",
345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        "T a",
3463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        "U 65 0 false false false false" } },
347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server()->Start());
350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
3523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL url = test_server()->GetURL(kTestingPage);
353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), url);
354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
358ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  int tab_index = browser()->active_index();
359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (size_t i = 0; i < arraysize(kTestNoInput); ++i) {
360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestNoInput[i]))
361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        << "kTestNoInput[" << i << "] failed:\n"
362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        << GetTestDataDescription(kTestNoInput[i]);
363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
364c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Input in normal text box.
366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_NO_FATAL_FAILURE(SetFocusedElement(tab_index, L"A"));
367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (size_t i = 0; i < arraysize(kTestWithInput); ++i) {
368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestWithInput[i]))
3693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        << "kTestWithInput[" << i << "] in text box failed:\n"
370c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        << GetTestDataDescription(kTestWithInput[i]);
371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_NO_FATAL_FAILURE(CheckTextBoxValue(tab_index, L"A", L"aA"));
3733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Input in password box.
3753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_NO_FATAL_FAILURE(SetFocusedElement(tab_index, L"B"));
3763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  for (size_t i = 0; i < arraysize(kTestWithInput); ++i) {
3773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestWithInput[i]))
3783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        << "kTestWithInput[" << i << "] in password box failed:\n"
3793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        << GetTestDataDescription(kTestWithInput[i]);
3803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
3813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_NO_FATAL_FAILURE(CheckTextBoxValue(tab_index, L"B", L"aA"));
382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(OS_WIN) || defined(OS_LINUX)
385c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, CtrlKeyEvents) {
386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static const KeyEventTestData kTestCtrlF = {
38772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    ui::VKEY_F, true, false, false, false,
388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    false, false, false, false, 2,
3893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    { "D 17 0 true false false false",
3903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "D 70 0 true false false false" }
391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
392c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
393c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static const KeyEventTestData kTestCtrlFSuppressKeyDown = {
39472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    ui::VKEY_F, true, false, false, false,
395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    true, false, false, false, 4,
3963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    { "D 17 0 true false false false",
3973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "D 70 0 true false false false",
3983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "U 70 0 true false false false",
3993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "U 17 0 true false false false" }
400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Ctrl+Z doesn't bind to any accelerators, which then should generate a
403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // keypress event with charCode=26.
404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static const KeyEventTestData kTestCtrlZ = {
40572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    ui::VKEY_Z, true, false, false, false,
406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    false, false, false, false, 5,
4073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    { "D 17 0 true false false false",
4083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "D 90 0 true false false false",
4093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "P 26 26 true false false false",
4103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "U 90 0 true false false false",
4113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "U 17 0 true false false false" }
412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static const KeyEventTestData kTestCtrlZSuppressKeyDown = {
41572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    ui::VKEY_Z, true, false, false, false,
416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    true, false, false, false, 4,
4173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    { "D 17 0 true false false false",
4183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "D 90 0 true false false false",
4193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "U 90 0 true false false false",
4203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "U 17 0 true false false false" }
421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
422c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Ctrl+Enter shall generate a keypress event with charCode=10 (LF).
424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static const KeyEventTestData kTestCtrlEnter = {
42572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    ui::VKEY_RETURN, true, false, false, false,
426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    false, false, false, false, 5,
4273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    { "D 17 0 true false false false",
4283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "D 13 0 true false false false",
4293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "P 10 10 true false false false",
4303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "U 13 0 true false false false",
4313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "U 17 0 true false false false" }
432c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
433c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
4343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server()->Start());
435c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
4363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
4373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL url = test_server()->GetURL(kTestingPage);
438c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), url);
439c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
440c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
441c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
442c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
443ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  int tab_index = browser()->active_index();
444c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Press Ctrl+F, which will make the Find box open and request focus.
445c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlF));
446c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(IsViewFocused(VIEW_ID_FIND_IN_PAGE_TEXT_FIELD));
447c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
448c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Press Escape to close the Find box and move the focus back to the web page.
4493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
45072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      browser(), ui::VKEY_ESCAPE, false, false, false, false));
451c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
452c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
453c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Press Ctrl+F with keydown suppressed shall not open the find box.
454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlFSuppressKeyDown));
455c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
456c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
457c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlZ));
458c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlZSuppressKeyDown));
459c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlEnter));
460c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
4613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#elif defined(OS_MACOSX)
4623345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickIN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, CommandKeyEvents) {
4633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  static const KeyEventTestData kTestCmdF = {
46472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    ui::VKEY_F, false, false, false, true,
4653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    false, false, false, false, 2,
4663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    { "D 91 0 false false false true",
4673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "D 70 0 false false false true" }
4683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  };
4693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
4703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // On Mac we don't send key up events when command modifier is down.
4713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  static const KeyEventTestData kTestCmdFSuppressKeyDown = {
47272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    ui::VKEY_F, false, false, false, true,
4733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    true, false, false, false, 3,
4743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    { "D 91 0 false false false true",
4753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "D 70 0 false false false true",
4763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "U 91 0 false false false true" }
4773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  };
4783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
4793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server()->Start());
4803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
4813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
4823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL url = test_server()->GetURL(kTestingPage);
4833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ui_test_utils::NavigateToURL(browser(), url);
4843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
4853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
4863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
4873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
488ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  int tab_index = browser()->active_index();
4893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Press Cmd+F, which will make the Find box open and request focus.
4903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCmdF));
4913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_TRUE(IsViewFocused(VIEW_ID_FIND_IN_PAGE_TEXT_FIELD));
4923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
4933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Press Escape to close the Find box and move the focus back to the web page.
4943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
49572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      browser(), ui::VKEY_ESCAPE, false, false, false, false));
4963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
4973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
4983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Press Cmd+F with keydown suppressed shall not open the find box.
4993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCmdFSuppressKeyDown));
5003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
5013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
5023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif
503c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
504513209b27ff55e2841eac0e4120199c23acce758Ben MurdochIN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, AccessKeys) {
5053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(OS_MACOSX)
5063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // On Mac, access keys use ctrl+alt modifiers.
5073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  static const KeyEventTestData kTestAccessA = {
50872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    ui::VKEY_A, true, false, true, false,
5093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    false, false, false, false, 6,
5103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    { "D 17 0 true false false false",
5113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "D 18 0 true false true false",
5123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "D 65 0 true false true false",
5133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "U 65 0 true false true false",
5143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "U 18 0 true false true false",
5153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "U 17 0 true false false false" }
5163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  };
5173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
5183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  static const KeyEventTestData kTestAccessDSuppress = {
51972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    ui::VKEY_D, true, false, true, false,
5203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    true, true, true, false, 6,
5213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    { "D 17 0 true false false false",
5223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "D 18 0 true false true false",
5233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "D 68 0 true false true false",
5243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "U 68 0 true false true false",
5253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "U 18 0 true false true false",
5263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "U 17 0 true false false false" }
5273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  };
5283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
5293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  static const KeyEventTestData kTestAccess1 = {
53072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    ui::VKEY_1, true, false, true, false,
5313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    false, false, false, false, 6,
5323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    { "D 17 0 true false false false",
5333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "D 18 0 true false true false",
5343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "D 49 0 true false true false",
5353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "U 49 0 true false true false",
5363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "U 18 0 true false true false",
5373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "U 17 0 true false false false" }
5383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  };
5393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#else
5403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  static const KeyEventTestData kTestAccessA = {
54172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    ui::VKEY_A, false, false, true, false,
542c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    false, false, false, false, 4,
5433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    { "D 18 0 false false true false",
5443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "D 65 0 false false true false",
5453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "U 65 0 false false true false",
5463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "U 18 0 false false true false" }
547c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
548c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  static const KeyEventTestData kTestAccessD = {
55072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    ui::VKEY_D, false, false, true, false,
551c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    false, false, false, false, 2,
5523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    { "D 18 0 false false true false",
5533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "D 68 0 false false true false" }
554c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
555c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  static const KeyEventTestData kTestAccessDSuppress = {
55772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    ui::VKEY_D, false, false, true, false,
558c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    true, true, true, false, 4,
5593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    { "D 18 0 false false true false",
5603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "D 68 0 false false true false",
5613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "U 68 0 false false true false",
5623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "U 18 0 false false true false" }
563c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
564c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  static const KeyEventTestData kTestAccess1 = {
56672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    ui::VKEY_1, false, false, true, false,
567c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    false, false, false, false, 4,
5683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    { "D 18 0 false false true false",
5693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "D 49 0 false false true false",
5703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "U 49 0 false false true false",
5713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "U 18 0 false false true false" }
572c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
5733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif
574c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server()->Start());
576c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
5783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL url = test_server()->GetURL(kTestingPage);
579c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), url);
580c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
581c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::RunAllPendingInMessageLoop();
582c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
583c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
584c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
585ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  int tab_index = browser()->active_index();
586c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Make sure no element is focused.
587c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L""));
588c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Alt+A should focus the element with accesskey = "A".
5893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestAccessA));
590c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L"A"));
591c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
592c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Blur the focused element.
593c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_NO_FATAL_FAILURE(SetFocusedElement(tab_index, L""));
594c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Make sure no element is focused.
595c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L""));
5963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
5973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if !defined(OS_MACOSX)
598c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Alt+D should move the focus to the location entry.
5993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestAccessD));
6003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
6013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // TODO(isherman): This is an experimental change to help diagnose
6023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // http://crbug.com/55713
6033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ui_test_utils::RunAllPendingInMessageLoop();
6043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
605c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(IsViewFocused(VIEW_ID_LOCATION_BAR));
606c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // No element should be focused, as Alt+D was handled by the browser.
607c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L""));
608c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
609c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Move the focus back to the web page.
610c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
611c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
612c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
613c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Make sure no element is focused.
614c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L""));
6153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif
6163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
617c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // If the keydown event is suppressed, then Alt+D should be handled as an
618c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // accesskey rather than an accelerator key. Activation of an accesskey is not
619c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // a part of the default action of the key event, so it should not be
620c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // suppressed at all.
6213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestAccessDSuppress));
622c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
623c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L"D"));
624c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
625c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Blur the focused element.
626c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_NO_FATAL_FAILURE(SetFocusedElement(tab_index, L""));
627c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Make sure no element is focused.
628c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L""));
6293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestAccess1));
630c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(TOOLKIT_GTK)
631c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // On GTK, alt-0..9 are assigned as tab selection accelerators, so they can
632c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // not be used as accesskeys.
633c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L""));
6343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#else
635c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L"1"));
636c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
637c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
638c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
63972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Disabled, http://crbug.com/69475.
64072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenIN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, DISABLED_ReservedAccelerators) {
6413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server()->Start());
642c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
6433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
6443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL url = test_server()->GetURL(kTestingPage);
645c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), url);
646c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
647c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
648c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
649c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
650c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(1, browser()->tab_count());
651c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
65221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  static const KeyEventTestData kTestCtrlOrCmdT = {
65321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#if defined(OS_MACOSX)
65472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    ui::VKEY_T, false, false, false, true,
6553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    true, false, false, false, 1,
6563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    { "D 91 0 false false false true" }
65721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#else
65872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    ui::VKEY_T, true, false, false, false,
659c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    true, false, false, false, 1,
6603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    { "D 17 0 true false false false" }
66121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#endif
662c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
663c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
66421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ui_test_utils::WindowedNotificationObserver wait_for_new_tab(
66521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      NotificationType::TAB_PARENTED,
66621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      NotificationService::AllSources());
667c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
66821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Press Ctrl/Cmd+T, which will open a new tab. It cannot be suppressed.
66921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  EXPECT_NO_FATAL_FAILURE(TestKeyEvent(0, kTestCtrlOrCmdT));
670c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
67121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ASSERT_NO_FATAL_FAILURE(
67221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      wait_for_new_tab.WaitFor(Source<NavigationController>(
67321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      &browser()->GetTabContentsAt(1)->controller())));
674c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
67521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  int result_length;
67621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ASSERT_NO_FATAL_FAILURE(GetResultLength(0, &result_length));
67721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  EXPECT_EQ(1, result_length);
678c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
67921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  EXPECT_EQ(2, browser()->tab_count());
680ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ASSERT_EQ(1, browser()->active_index());
681c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
68221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Because of issue http://crbug.com/65375, switching back to the first tab
68321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // may cause the focus to be grabbed by omnibox. So instead, we load our
68421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // testing page in the newly created tab and try Cmd-W here.
68521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ui_test_utils::NavigateToURL(browser(), url);
686c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
68721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Make sure the focus is in the testing page.
68821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
68921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
69021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
69121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Reserved accelerators can't be suppressed.
69221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ASSERT_NO_FATAL_FAILURE(SuppressAllEvents(1, true));
693c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
69421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ui_test_utils::WindowedNotificationObserver wait_for_tab_closed(
69521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      NotificationType::TAB_CLOSED, Source<NavigationController>(
69621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen          &browser()->GetTabContentsAt(1)->controller()));
697c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
69821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Press Ctrl/Cmd+W, which will close the tab.
69921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#if defined(OS_MACOSX)
7003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
70172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      browser(), ui::VKEY_W, false, false, false, true));
70221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#else
70321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
70472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      browser(), ui::VKEY_W, true, false, false, false));
705c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
70621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
70721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ASSERT_NO_FATAL_FAILURE(wait_for_tab_closed.Wait());
70821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
70921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  EXPECT_EQ(1, browser()->tab_count());
710c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
7113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(OS_MACOSX)
7133345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickIN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, EditorKeyBindings) {
7143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  static const KeyEventTestData kTestCtrlA = {
71572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    ui::VKEY_A, true, false, false, false,
7163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    false, false, false, false, 4,
7173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    { "D 17 0 true false false false",
7183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "D 65 0 true false false false",
7193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "U 65 0 true false false false",
7203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "U 17 0 true false false false" }
7213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  };
7223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  static const KeyEventTestData kTestCtrlF = {
72472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    ui::VKEY_F, true, false, false, false,
7253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    false, false, false, false, 4,
7263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    { "D 17 0 true false false false",
7273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "D 70 0 true false false false",
7283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "U 70 0 true false false false",
7293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "U 17 0 true false false false" }
7303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  };
7313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  static const KeyEventTestData kTestCtrlK = {
73372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    ui::VKEY_K, true, false, false, false,
7343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    false, false, false, false, 4,
7353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    { "D 17 0 true false false false",
7363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "D 75 0 true false false false",
7373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "U 75 0 true false false false",
7383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "U 17 0 true false false false" }
7393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  };
7403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server()->Start());
7423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
7443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL url = test_server()->GetURL(kTestingPage);
7453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ui_test_utils::NavigateToURL(browser(), url);
7463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
7483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
7493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
750ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  int tab_index = browser()->active_index();
7513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_NO_FATAL_FAILURE(SetFocusedElement(tab_index, L"A"));
7523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_NO_FATAL_FAILURE(SetTextBoxValue(tab_index, L"A", L"Hello"));
7533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Move the caret to the beginning of the line.
7543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlA));
7553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Forward one character
7563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlF));
7573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Delete to the end of the line.
7583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlK));
7593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_NO_FATAL_FAILURE(CheckTextBoxValue(tab_index, L"A", L"H"));
7603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
7613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif
7623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7633345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickIN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, PageUpDownKeys) {
7643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  static const KeyEventTestData kTestPageUp = {
76572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    ui::VKEY_PRIOR, false, false, false, false,
7663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    false, false, false, false, 2,
7673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    { "D 33 0 false false false false",
7683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "U 33 0 false false false false" }
7693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  };
7703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  static const KeyEventTestData kTestPageDown = {
77272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    ui::VKEY_NEXT, false, false, false, false,
7733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    false, false, false, false, 2,
7743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    { "D 34 0 false false false false",
7753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "U 34 0 false false false false" }
7763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  };
7773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server()->Start());
7793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
7813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL url = test_server()->GetURL(kTestingPage);
7823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ui_test_utils::NavigateToURL(browser(), url);
7833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
7853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
7863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
787ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  int tab_index = browser()->active_index();
7883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_NO_FATAL_FAILURE(SetFocusedElement(tab_index, L"A"));
7893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestPageUp));
7903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestPageDown));
7913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_NO_FATAL_FAILURE(CheckTextBoxValue(tab_index, L"A", L""));
7923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
7933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(OS_WIN) || defined(TOOLKIT_VIEWS)
7953345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickIN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, FocusMenuBarByAltKey) {
7963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  static const KeyEventTestData kTestAltKey = {
79772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    ui::VKEY_MENU, false, false, false, false,
7983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    false, false, false, false, 2,
7993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    { "D 18 0 false false true false",
8003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "U 18 0 false false true false" }
8013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  };
8023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
8033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  static const KeyEventTestData kTestAltKeySuppress = {
80472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    ui::VKEY_MENU, false, false, false, false,
8053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    true, false, false, false, 2,
8063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    { "D 18 0 false false true false",
8073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "U 18 0 false false true false" }
8083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  };
8093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
8103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  static const KeyEventTestData kTestCtrlAltKey = {
81172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    ui::VKEY_MENU, true, false, false, false,
8123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    false, false, false, false, 4,
8133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    { "D 17 0 true false false false",
8143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "D 18 0 true false true false",
8153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "U 18 0 true false true false",
8163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      "U 17 0 true false false false" }
8173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  };
8183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
8193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server()->Start());
8203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
8213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
8223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL url = test_server()->GetURL(kTestingPage);
8233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ui_test_utils::NavigateToURL(browser(), url);
8243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
8253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
8263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
8273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
828ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  int tab_index = browser()->active_index();
8293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Press and release Alt key to focus wrench menu button.
8303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestAltKey));
8313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_TRUE(IsViewFocused(VIEW_ID_APP_MENU));
8323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
8333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
8343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
8353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
8363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Alt key can be suppressed.
8373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestAltKeySuppress));
8383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
8393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
8403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Ctrl+Alt should have no effect.
8413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlAltKey));
8423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
8433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
8443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif
8453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
8463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}  // namespace
847