| Index: chrome/browser/browser_keyevents_browsertest.cc
|
| ===================================================================
|
| --- chrome/browser/browser_keyevents_browsertest.cc (revision 0)
|
| +++ chrome/browser/browser_keyevents_browsertest.cc (revision 0)
|
| @@ -0,0 +1,570 @@
|
| +// Copyright (c) 2009 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "build/build_config.h"
|
| +
|
| +#include "base/basictypes.h"
|
| +#include "base/keyboard_codes.h"
|
| +#include "base/logging.h"
|
| +#include "base/message_loop.h"
|
| +#include "base/string_util.h"
|
| +#include "base/utf_string_conversions.h"
|
| +#include "base/values.h"
|
| +#include "chrome/browser/automation/ui_controls.h"
|
| +#include "chrome/browser/browser.h"
|
| +#include "chrome/browser/browser_window.h"
|
| +#include "chrome/browser/dom_operation_notification_details.h"
|
| +#include "chrome/browser/renderer_host/render_view_host.h"
|
| +#include "chrome/browser/renderer_host/render_widget_host_view.h"
|
| +#include "chrome/browser/tab_contents/tab_contents.h"
|
| +#include "chrome/browser/tab_contents/tab_contents_view.h"
|
| +#include "chrome/common/chrome_paths.h"
|
| +#include "chrome/common/notification_registrar.h"
|
| +#include "chrome/common/notification_service.h"
|
| +#include "chrome/test/in_process_browser_test.h"
|
| +#include "chrome/test/ui_test_utils.h"
|
| +
|
| +namespace {
|
| +
|
| +const wchar_t kTestingPage[] = L"files/keyevents_test.html";
|
| +const wchar_t kSuppressEventJS[] =
|
| + L"window.domAutomationController.send(setDefaultAction('%ls', %ls));";
|
| +const wchar_t kGetResultJS[] =
|
| + L"window.domAutomationController.send(keyEventResult[%d]);";
|
| +const wchar_t kGetResultLengthJS[] =
|
| + L"window.domAutomationController.send(keyEventResult.length);";
|
| +const wchar_t kGetFocusedElementJS[] =
|
| + L"window.domAutomationController.send(focusedElement);";
|
| +const wchar_t kSetFocusedElementJS[] =
|
| + L"window.domAutomationController.send(setFocusedElement('%ls'));";
|
| +const wchar_t kGetTextBoxValueJS[] =
|
| + L"window.domAutomationController.send("
|
| + L"document.getElementById('%ls').value);";
|
| +const wchar_t kStartTestJS[] =
|
| + L"window.domAutomationController.send(startTest());";
|
| +
|
| +// Maximum lenght of the result array in KeyEventTestData structure.
|
| +const size_t kMaxResultLength = 10;
|
| +
|
| +// A structure holding test data of a keyboard event.
|
| +// Each keyboard event may generate multiple result strings representing
|
| +// the result of keydown, keypress, keyup and textInput events.
|
| +// For keydown, keypress and keyup events, the format of the result string is:
|
| +// <type> <keyCode> <charCode> <ctrlKey> <shiftKey> <altKey>
|
| +// where <type> may be 'D' (keydown), 'P' (keypress) or 'U' (keyup).
|
| +// <ctrlKey>, <shiftKey> and <altKey> are boolean value indicating the state of
|
| +// corresponding modifier key.
|
| +// For textInput event, the format is: T <text>, where <text> is the text to be
|
| +// input.
|
| +// Please refer to chrome/test/data/keyevents_test.html for details.
|
| +struct KeyEventTestData {
|
| + base::KeyboardCode key;
|
| + bool ctrl;
|
| + bool shift;
|
| + bool alt;
|
| +
|
| + bool suppress_keydown;
|
| + bool suppress_keypress;
|
| + bool suppress_keyup;
|
| + bool suppress_textinput;
|
| +
|
| + int result_length;
|
| + const char* const result[kMaxResultLength];
|
| +};
|
| +
|
| +const wchar_t* GetBoolString(bool value) {
|
| + return value ? L"true" : L"false";
|
| +}
|
| +
|
| +// A class to help wait for the finish of a key event test.
|
| +class TestFinishObserver : public NotificationObserver {
|
| + public:
|
| + explicit TestFinishObserver(RenderViewHost* render_view_host)
|
| + : finished_(false), waiting_(false) {
|
| + registrar_.Add(this, NotificationType::DOM_OPERATION_RESPONSE,
|
| + Source<RenderViewHost>(render_view_host));
|
| + }
|
| +
|
| + bool WaitForFinish() {
|
| + if (!finished_) {
|
| + waiting_ = true;
|
| + ui_test_utils::RunMessageLoop();
|
| + waiting_ = false;
|
| + }
|
| + return finished_;
|
| + }
|
| +
|
| + virtual void Observe(NotificationType type,
|
| + const NotificationSource& source,
|
| + const NotificationDetails& details) {
|
| + DCHECK(type == NotificationType::DOM_OPERATION_RESPONSE);
|
| + Details<DomOperationNotificationDetails> dom_op_details(details);
|
| + // We might receive responses for other script execution, but we only
|
| + // care about the test finished message.
|
| + if (dom_op_details->json() == "\"FINISHED\"") {
|
| + finished_ = true;
|
| + if (waiting_)
|
| + MessageLoopForUI::current()->Quit();
|
| + }
|
| + }
|
| +
|
| + private:
|
| + bool finished_;
|
| + bool waiting_;
|
| + NotificationRegistrar registrar_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(TestFinishObserver);
|
| +};
|
| +
|
| +class BrowserKeyEventsTest : public InProcessBrowserTest {
|
| + public:
|
| + BrowserKeyEventsTest() {
|
| + set_show_window(true);
|
| + EnableDOMAutomation();
|
| + }
|
| +
|
| + void GetNativeWindow(gfx::NativeWindow* native_window) {
|
| + BrowserWindow* window = browser()->window();
|
| + ASSERT_TRUE(window);
|
| + *native_window = window->GetNativeHandle();
|
| + ASSERT_TRUE(*native_window);
|
| + }
|
| +
|
| + void SendKey(base::KeyboardCode key, bool control, bool shift, bool alt) {
|
| + gfx::NativeWindow window = NULL;
|
| + ASSERT_NO_FATAL_FAILURE(GetNativeWindow(&window));
|
| + ui_controls::SendKeyPressNotifyWhenDone(window, key, control, shift, alt,
|
| + new MessageLoop::QuitTask());
|
| + ui_test_utils::RunMessageLoop();
|
| + }
|
| +
|
| + bool IsViewFocused(ViewID vid) {
|
| + return ui_test_utils::IsViewFocused(browser(), vid);
|
| + }
|
| +
|
| + void ClickOnView(ViewID vid) {
|
| + ui_test_utils::ClickOnView(browser(), vid);
|
| + }
|
| +
|
| + // Set the suppress flag of an event specified by |type|. If |suppress| is
|
| + // true then the web page will suppress all events with |type|. Following
|
| + // event types are supported: keydown, keypress, keyup and textInput.
|
| + void SuppressEventByType(int tab_index, const wchar_t* type, bool suppress) {
|
| + ASSERT_LT(tab_index, browser()->tab_count());
|
| + bool actual;
|
| + ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool(
|
| + browser()->GetTabContentsAt(tab_index)->render_view_host(),
|
| + L"",
|
| + StringPrintf(kSuppressEventJS, type, GetBoolString(!suppress)),
|
| + &actual));
|
| + ASSERT_EQ(!suppress, actual);
|
| + }
|
| +
|
| + void SuppressEvents(int tab_index, bool keydown, bool keypress,
|
| + bool keyup, bool textinput) {
|
| + ASSERT_NO_FATAL_FAILURE(
|
| + SuppressEventByType(tab_index, L"keydown", keydown));
|
| + ASSERT_NO_FATAL_FAILURE(
|
| + SuppressEventByType(tab_index, L"keypress", keypress));
|
| + ASSERT_NO_FATAL_FAILURE(
|
| + SuppressEventByType(tab_index, L"keyup", keyup));
|
| + ASSERT_NO_FATAL_FAILURE(
|
| + SuppressEventByType(tab_index, L"textInput", textinput));
|
| + }
|
| +
|
| + void SuppressAllEvents(int tab_index, bool suppress) {
|
| + SuppressEvents(tab_index, suppress, suppress, suppress, suppress);
|
| + }
|
| +
|
| + void GetResultLength(int tab_index, int* length) {
|
| + ASSERT_LT(tab_index, browser()->tab_count());
|
| + ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractInt(
|
| + browser()->GetTabContentsAt(tab_index)->render_view_host(),
|
| + L"", kGetResultLengthJS, length));
|
| + }
|
| +
|
| + void CheckResult(int tab_index, int length, const char* const result[]) {
|
| + ASSERT_LT(tab_index, browser()->tab_count());
|
| + int actual_length;
|
| + ASSERT_NO_FATAL_FAILURE(GetResultLength(tab_index, &actual_length));
|
| + ASSERT_GE(actual_length, length);
|
| + for (int i = 0; i < actual_length; ++i) {
|
| + std::string actual;
|
| + ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractString(
|
| + browser()->GetTabContentsAt(tab_index)->render_view_host(),
|
| + L"", StringPrintf(kGetResultJS, i), &actual));
|
| +
|
| + // If more events were received than expected, then the additional events
|
| + // must be keyup events.
|
| + if (i < length)
|
| + ASSERT_STREQ(result[i], actual.c_str());
|
| + else
|
| + ASSERT_EQ('U', actual[0]);
|
| + }
|
| + }
|
| +
|
| + void CheckFocusedElement(int tab_index, const wchar_t* focused) {
|
| + ASSERT_LT(tab_index, browser()->tab_count());
|
| + std::string actual;
|
| + ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractString(
|
| + browser()->GetTabContentsAt(tab_index)->render_view_host(),
|
| + L"", kGetFocusedElementJS, &actual));
|
| + ASSERT_EQ(WideToUTF8(focused), actual);
|
| + }
|
| +
|
| + void SetFocusedElement(int tab_index, const wchar_t* focused) {
|
| + ASSERT_LT(tab_index, browser()->tab_count());
|
| + bool actual;
|
| + ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool(
|
| + browser()->GetTabContentsAt(tab_index)->render_view_host(),
|
| + L"",
|
| + StringPrintf(kSetFocusedElementJS, focused),
|
| + &actual));
|
| + ASSERT_TRUE(actual);
|
| + }
|
| +
|
| + void CheckTextBoxValue(int tab_index, const wchar_t* id,
|
| + const wchar_t* value) {
|
| + ASSERT_LT(tab_index, browser()->tab_count());
|
| + std::string actual;
|
| + ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractString(
|
| + browser()->GetTabContentsAt(tab_index)->render_view_host(),
|
| + L"",
|
| + StringPrintf(kGetTextBoxValueJS, id),
|
| + &actual));
|
| + ASSERT_EQ(WideToUTF8(value), actual);
|
| + }
|
| +
|
| + void StartTest(int tab_index) {
|
| + ASSERT_LT(tab_index, browser()->tab_count());
|
| + bool actual;
|
| + ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool(
|
| + browser()->GetTabContentsAt(tab_index)->render_view_host(),
|
| + L"", kStartTestJS, &actual));
|
| + ASSERT_TRUE(actual);
|
| + }
|
| +
|
| + void TestKeyEvent(int tab_index, const KeyEventTestData& test) {
|
| + ASSERT_LT(tab_index, browser()->tab_count());
|
| + ASSERT_EQ(tab_index, browser()->selected_index());
|
| +
|
| + // Inform our testing web page that we are about to start testing a key
|
| + // event.
|
| + ASSERT_NO_FATAL_FAILURE(StartTest(tab_index));
|
| + ASSERT_NO_FATAL_FAILURE(SuppressEvents(
|
| + tab_index, test.suppress_keydown, test.suppress_keypress,
|
| + test.suppress_keyup, test.suppress_textinput));
|
| +
|
| + // We need to create a finish observer before sending the key event,
|
| + // because the test finished message might be arrived before returning
|
| + // from the SendKey() method.
|
| + TestFinishObserver finish_observer(
|
| + browser()->GetTabContentsAt(tab_index)->render_view_host());
|
| +
|
| + ASSERT_NO_FATAL_FAILURE(SendKey(test.key, test.ctrl, test.shift, test.alt));
|
| + ASSERT_TRUE(finish_observer.WaitForFinish());
|
| + ASSERT_NO_FATAL_FAILURE(CheckResult(
|
| + tab_index, test.result_length, test.result));
|
| + }
|
| +
|
| + std::string GetTestDataDescription(const KeyEventTestData& data) {
|
| + std::string desc = StringPrintf(
|
| + " VKEY:0x%02x, ctrl:%d, shift:%d, alt:%d\n"
|
| + " Suppress: keydown:%d, keypress:%d, keyup:%d, textInput:%d\n"
|
| + " Expected results(%d):\n",
|
| + data.key, data.ctrl, data.shift, data.alt,
|
| + data.suppress_keydown, data.suppress_keypress, data.suppress_keyup,
|
| + data.suppress_textinput, data.result_length);
|
| + for (int i = 0; i < data.result_length; ++i) {
|
| + desc.append(" ");
|
| + desc.append(data.result[i]);
|
| + desc.append("\n");
|
| + }
|
| + return desc;
|
| + }
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| +IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, NormalKeyEvents) {
|
| + static const KeyEventTestData kTestNoInput[] = {
|
| + // a
|
| + { base::VKEY_A, false, false, false,
|
| + false, false, false, false, 3,
|
| + { "D 65 0 false false false",
|
| + "P 97 97 false false false",
|
| + "U 65 0 false false false" } },
|
| + // shift-a
|
| + { base::VKEY_A, false, true, false,
|
| + false, false, false, false, 5,
|
| + { "D 16 0 false true false",
|
| + "D 65 0 false true false",
|
| + "P 65 65 false true false",
|
| + "U 65 0 false true false",
|
| + "U 16 0 false true false" } },
|
| + // a, suppress keydown
|
| + { base::VKEY_A, false, false, false,
|
| + true, false, false, false, 2,
|
| + { "D 65 0 false false false",
|
| + "U 65 0 false false false" } },
|
| + };
|
| +
|
| + static const KeyEventTestData kTestWithInput[] = {
|
| + // a
|
| + { base::VKEY_A, false, false, false,
|
| + false, false, false, false, 4,
|
| + { "D 65 0 false false false",
|
| + "P 97 97 false false false",
|
| + "T a",
|
| + "U 65 0 false false false" } },
|
| + // shift-a
|
| + { base::VKEY_A, false, true, false,
|
| + false, false, false, false, 6,
|
| + { "D 16 0 false true false",
|
| + "D 65 0 false true false",
|
| + "P 65 65 false true false",
|
| + "T A",
|
| + "U 65 0 false true false",
|
| + "U 16 0 false true false" } },
|
| + // a, suppress keydown
|
| + { base::VKEY_A, false, false, false,
|
| + true, false, false, false, 2,
|
| + { "D 65 0 false false false",
|
| + "U 65 0 false false false" } },
|
| + // a, suppress keypress
|
| + { base::VKEY_A, false, false, false,
|
| + false, true, false, false, 3,
|
| + { "D 65 0 false false false",
|
| + "P 97 97 false false false",
|
| + "U 65 0 false false false" } },
|
| + // a, suppress textInput
|
| + { base::VKEY_A, false, false, false,
|
| + false, false, false, true, 4,
|
| + { "D 65 0 false false false",
|
| + "P 97 97 false false false",
|
| + "T a",
|
| + "U 65 0 false false false" } },
|
| + };
|
| +
|
| + HTTPTestServer* server = StartHTTPServer();
|
| +
|
| + GURL url = server->TestServerPageW(kTestingPage);
|
| + ui_test_utils::NavigateToURL(browser(), url);
|
| +
|
| + ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
|
| + ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
|
| +
|
| + int tab_index = browser()->selected_index();
|
| + for (size_t i = 0; i < arraysize(kTestNoInput); ++i) {
|
| + EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestNoInput[i]))
|
| + << "kTestNoInput[" << i << "] failed:\n"
|
| + << GetTestDataDescription(kTestNoInput[i]);
|
| + }
|
| +
|
| + ASSERT_NO_FATAL_FAILURE(SetFocusedElement(tab_index, L"A"));
|
| + for (size_t i = 0; i < arraysize(kTestWithInput); ++i) {
|
| + EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestWithInput[i]))
|
| + << "kTestWithInput[" << i << "] failed:\n"
|
| + << GetTestDataDescription(kTestWithInput[i]);
|
| + }
|
| +
|
| + EXPECT_NO_FATAL_FAILURE(CheckTextBoxValue(tab_index, L"A", L"aA"));
|
| +}
|
| +
|
| +IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, CtrlKeyEvents) {
|
| + static const KeyEventTestData kTestCtrlF = {
|
| + base::VKEY_F, true, false, false,
|
| + false, false, false, false, 2,
|
| + { "D 17 0 true false false",
|
| + "D 70 0 true false false" }
|
| + };
|
| +
|
| + static const KeyEventTestData kTestCtrlFSuppressKeyDown = {
|
| + base::VKEY_F, true, false, false,
|
| + true, false, false, false, 4,
|
| + { "D 17 0 true false false",
|
| + "D 70 0 true false false",
|
| + "U 70 0 true false false",
|
| + "U 17 0 true false false" }
|
| + };
|
| +
|
| + // Ctrl+Z doesn't bind to any accelerators, which then should generate a
|
| + // keypress event with charCode=26.
|
| + static const KeyEventTestData kTestCtrlZ = {
|
| + base::VKEY_Z, true, false, false,
|
| + false, false, false, false, 5,
|
| + { "D 17 0 true false false",
|
| + "D 90 0 true false false",
|
| + "P 26 26 true false false",
|
| + "U 90 0 true false false",
|
| + "U 17 0 true false false" }
|
| + };
|
| +
|
| + static const KeyEventTestData kTestCtrlZSuppressKeyDown = {
|
| + base::VKEY_Z, true, false, false,
|
| + true, false, false, false, 4,
|
| + { "D 17 0 true false false",
|
| + "D 90 0 true false false",
|
| + "U 90 0 true false false",
|
| + "U 17 0 true false false" }
|
| + };
|
| +
|
| + // Ctrl+Enter shall generate a keypress event with charCode=10 (LF).
|
| + static const KeyEventTestData kTestCtrlEnter = {
|
| + base::VKEY_RETURN, true, false, false,
|
| + false, false, false, false, 5,
|
| + { "D 17 0 true false false",
|
| + "D 13 0 true false false",
|
| + "P 10 10 true false false",
|
| + "U 13 0 true false false",
|
| + "U 17 0 true false false" }
|
| + };
|
| +
|
| + HTTPTestServer* server = StartHTTPServer();
|
| +
|
| + GURL url = server->TestServerPageW(kTestingPage);
|
| + ui_test_utils::NavigateToURL(browser(), url);
|
| +
|
| + ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
|
| + ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
|
| +
|
| + int tab_index = browser()->selected_index();
|
| + // Press Ctrl+F, which will make the Find box open and request focus.
|
| + EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlF));
|
| + EXPECT_TRUE(IsViewFocused(VIEW_ID_FIND_IN_PAGE_TEXT_FIELD));
|
| +
|
| + // Press Escape to close the Find box and move the focus back to the web page.
|
| + ASSERT_NO_FATAL_FAILURE(SendKey(base::VKEY_ESCAPE, false, false, false));
|
| + ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
|
| +
|
| + // Press Ctrl+F with keydown suppressed shall not open the find box.
|
| + EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlFSuppressKeyDown));
|
| + ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
|
| +
|
| + EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlZ));
|
| + EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlZSuppressKeyDown));
|
| + EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlEnter));
|
| +}
|
| +
|
| +IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, AccessKeys) {
|
| + static const KeyEventTestData kTestAltA = {
|
| + base::VKEY_A, false, false, true,
|
| + false, false, false, false, 4,
|
| + { "D 18 0 false false true",
|
| + "D 65 0 false false true",
|
| + "U 65 0 false false true",
|
| + "U 18 0 false false true" }
|
| + };
|
| +
|
| + static const KeyEventTestData kTestAltD = {
|
| + base::VKEY_D, false, false, true,
|
| + false, false, false, false, 2,
|
| + { "D 18 0 false false true",
|
| + "D 68 0 false false true" }
|
| + };
|
| +
|
| + static const KeyEventTestData kTestAltDSuppress = {
|
| + base::VKEY_D, false, false, true,
|
| + true, true, true, false, 4,
|
| + { "D 18 0 false false true",
|
| + "D 68 0 false false true",
|
| + "U 68 0 false false true",
|
| + "U 18 0 false false true" }
|
| + };
|
| +
|
| + static const KeyEventTestData kTestAlt1 = {
|
| + base::VKEY_1, false, false, true,
|
| + false, false, false, false, 4,
|
| + { "D 18 0 false false true",
|
| + "D 49 0 false false true",
|
| + "U 49 0 false false true",
|
| + "U 18 0 false false true" }
|
| + };
|
| +
|
| + HTTPTestServer* server = StartHTTPServer();
|
| +
|
| + GURL url = server->TestServerPageW(kTestingPage);
|
| + ui_test_utils::NavigateToURL(browser(), url);
|
| +
|
| + ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
|
| + ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
|
| +
|
| + int tab_index = browser()->selected_index();
|
| + // Make sure no element is focused.
|
| + EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L""));
|
| + // Alt+A should focus the element with accesskey = "A".
|
| + EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestAltA));
|
| + EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L"A"));
|
| +
|
| + // Blur the focused element.
|
| + EXPECT_NO_FATAL_FAILURE(SetFocusedElement(tab_index, L""));
|
| + // Make sure no element is focused.
|
| + EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L""));
|
| + // Alt+D should move the focus to the location entry.
|
| + EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestAltD));
|
| + EXPECT_TRUE(IsViewFocused(VIEW_ID_LOCATION_BAR));
|
| + // No element should be focused, as Alt+D was handled by the browser.
|
| + EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L""));
|
| +
|
| + // Move the focus back to the web page.
|
| + ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
|
| + ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
|
| +
|
| + // Make sure no element is focused.
|
| + EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L""));
|
| + // If the keydown event is suppressed, then Alt+D should be handled as an
|
| + // accesskey rather than an accelerator key. Activation of an accesskey is not
|
| + // a part of the default action of the key event, so it should not be
|
| + // suppressed at all.
|
| + EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestAltDSuppress));
|
| + ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
|
| + EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L"D"));
|
| +
|
| + // Blur the focused element.
|
| + EXPECT_NO_FATAL_FAILURE(SetFocusedElement(tab_index, L""));
|
| + // Make sure no element is focused.
|
| + EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L""));
|
| + EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestAlt1));
|
| +#if defined(OS_LINUX)
|
| + // On Linux, alt-0..9 are assigned as tab selection accelerators, so they can
|
| + // not be used as accesskeys.
|
| + EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L""));
|
| +#elif defined(OS_WIN)
|
| + EXPECT_NO_FATAL_FAILURE(CheckFocusedElement(tab_index, L"1"));
|
| +#endif
|
| +}
|
| +
|
| +IN_PROC_BROWSER_TEST_F(BrowserKeyEventsTest, ReservedAccelerators) {
|
| + static const KeyEventTestData kTestCtrlT = {
|
| + base::VKEY_T, true, false, false,
|
| + false, false, false, false, 1,
|
| + { "D 17 0 true false false" }
|
| + };
|
| +
|
| + HTTPTestServer* server = StartHTTPServer();
|
| +
|
| + GURL url = server->TestServerPageW(kTestingPage);
|
| + ui_test_utils::NavigateToURL(browser(), url);
|
| +
|
| + ASSERT_NO_FATAL_FAILURE(ClickOnView(VIEW_ID_TAB_CONTAINER));
|
| + ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW));
|
| +
|
| + int tab_index = browser()->selected_index();
|
| + ASSERT_EQ(1, browser()->tab_count());
|
| + // Press Ctrl+T, which will open a new tab.
|
| + EXPECT_NO_FATAL_FAILURE(TestKeyEvent(tab_index, kTestCtrlT));
|
| + EXPECT_EQ(2, browser()->tab_count());
|
| + browser()->SelectNumberedTab(tab_index);
|
| + ASSERT_EQ(tab_index, browser()->selected_index());
|
| +
|
| + int result_length;
|
| + ASSERT_NO_FATAL_FAILURE(GetResultLength(tab_index, &result_length));
|
| + EXPECT_EQ(1, result_length);
|
| +
|
| + // Reserved accelerators can't be suppressed.
|
| + ASSERT_NO_FATAL_FAILURE(SuppressAllEvents(tab_index, true));
|
| + // Press Ctrl+W, which will close the tab.
|
| + ASSERT_NO_FATAL_FAILURE(SendKey(base::VKEY_W, true, false, false));
|
| + EXPECT_EQ(1, browser()->tab_count());
|
| +}
|
|
|
| Property changes on: chrome/browser/browser_keyevents_browsertest.cc
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|