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