blob: 10f9e741a29440a7297ee8393f55ccf61e9103c6 [file] [log] [blame]
// Copyright (c) 2006-2008 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 "config.h"
#include "base/compiler_specific.h"
MSVC_PUSH_WARNING_LEVEL(0);
#include "EventTarget.h"
#include "KeyboardCodes.h"
#include "KeyboardEvent.h"
MSVC_POP_WARNING();
#undef LOG
#include "base/string_util.h"
#include "webkit/glue/editor_client_impl.h"
#include "webkit/glue/event_conversion.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "webkit/api/public/WebInputEvent.h"
using WebCore::PlatformKeyboardEvent;
using WebCore::KeyboardEvent;
using WebKit::WebInputEvent;
using WebKit::WebKeyboardEvent;
class KeyboardTest : public testing::Test {
public:
void SetUp() {
WTF::initializeThreading();
}
// Pass a WebKeyboardEvent into the EditorClient and get back the string
// name of which editing event that key causes.
// E.g., sending in the enter key gives back "InsertNewline".
const char* InterpretKeyEvent(
const WebKeyboardEvent& keyboard_event,
PlatformKeyboardEvent::Type key_type) {
EditorClientImpl editor_impl(NULL);
MakePlatformKeyboardEvent evt(keyboard_event);
evt.SetKeyType(key_type);
RefPtr<KeyboardEvent> keyboardEvent = KeyboardEvent::create(evt, NULL);
return editor_impl.interpretKeyEvent(keyboardEvent.get());
}
// Set up a WebKeyboardEvent KEY_DOWN event with key code and modifiers.
void SetupKeyDownEvent(WebKeyboardEvent* keyboard_event,
char key_code,
int modifiers) {
keyboard_event->windowsKeyCode = key_code;
keyboard_event->modifiers = modifiers;
keyboard_event->type = WebInputEvent::KeyDown;
keyboard_event->text[0] = key_code;
keyboard_event->setKeyIdentifierFromWindowsKeyCode();
}
// Like InterpretKeyEvent, but with pressing down OSModifier+|key_code|.
// OSModifier is the platform's standard modifier key: control on most
// platforms, but meta (command) on Mac.
const char* InterpretOSModifierKeyPress(char key_code) {
WebKeyboardEvent keyboard_event;
#if defined(OS_WIN) || defined(OS_LINUX)
WebInputEvent::Modifiers os_modifier = WebInputEvent::ControlKey;
#elif defined(OS_MACOSX)
WebInputEvent::Modifiers os_modifier = WebInputEvent::MetaKey;
#endif
SetupKeyDownEvent(&keyboard_event, key_code, os_modifier);
return InterpretKeyEvent(keyboard_event, PlatformKeyboardEvent::RawKeyDown);
}
// Like InterpretKeyEvent, but with pressing down ctrl+|key_code|.
const char* InterpretCtrlKeyPress(char key_code) {
WebKeyboardEvent keyboard_event;
SetupKeyDownEvent(&keyboard_event, key_code, WebInputEvent::ControlKey);
return InterpretKeyEvent(keyboard_event, PlatformKeyboardEvent::RawKeyDown);
}
// Like InterpretKeyEvent, but with typing a tab.
const char* InterpretTab(int modifiers) {
WebKeyboardEvent keyboard_event;
SetupKeyDownEvent(&keyboard_event, '\t', modifiers);
return InterpretKeyEvent(keyboard_event, PlatformKeyboardEvent::Char);
}
// Like InterpretKeyEvent, but with typing a newline.
const char* InterpretNewLine(int modifiers) {
WebKeyboardEvent keyboard_event;
SetupKeyDownEvent(&keyboard_event, '\r', modifiers);
return InterpretKeyEvent(keyboard_event, PlatformKeyboardEvent::Char);
}
// A name for "no modifiers set".
static const int kNoModifiers = 0;
};
TEST_F(KeyboardTest, TestCtrlReturn) {
EXPECT_STREQ("InsertNewline", InterpretCtrlKeyPress(0xD));
}
TEST_F(KeyboardTest, TestOSModifierZ) {
EXPECT_STREQ("Undo", InterpretOSModifierKeyPress('Z'));
}
TEST_F(KeyboardTest, TestOSModifierY) {
EXPECT_STREQ("Redo", InterpretOSModifierKeyPress('Y'));
}
TEST_F(KeyboardTest, TestOSModifierA) {
EXPECT_STREQ("SelectAll", InterpretOSModifierKeyPress('A'));
}
TEST_F(KeyboardTest, TestOSModifierX) {
EXPECT_STREQ("Cut", InterpretOSModifierKeyPress('X'));
}
TEST_F(KeyboardTest, TestOSModifierC) {
EXPECT_STREQ("Copy", InterpretOSModifierKeyPress('C'));
}
TEST_F(KeyboardTest, TestOSModifierV) {
EXPECT_STREQ("Paste", InterpretOSModifierKeyPress('V'));
}
TEST_F(KeyboardTest, TestEscape) {
WebKeyboardEvent keyboard_event;
SetupKeyDownEvent(&keyboard_event, WebCore::VKEY_ESCAPE, kNoModifiers);
const char* result = InterpretKeyEvent(keyboard_event,
PlatformKeyboardEvent::RawKeyDown);
EXPECT_STREQ("Cancel", result);
}
TEST_F(KeyboardTest, TestInsertTab) {
EXPECT_STREQ("InsertTab", InterpretTab(kNoModifiers));
}
TEST_F(KeyboardTest, TestInsertBackTab) {
EXPECT_STREQ("InsertBacktab", InterpretTab(WebInputEvent::ShiftKey));
}
TEST_F(KeyboardTest, TestInsertNewline) {
EXPECT_STREQ("InsertNewline", InterpretNewLine(kNoModifiers));
}
TEST_F(KeyboardTest, TestInsertNewline2) {
EXPECT_STREQ("InsertNewline", InterpretNewLine(WebInputEvent::ControlKey));
}
TEST_F(KeyboardTest, TestInsertLineBreak) {
EXPECT_STREQ("InsertLineBreak", InterpretNewLine(WebInputEvent::ShiftKey));
}
TEST_F(KeyboardTest, TestInsertNewline3) {
EXPECT_STREQ("InsertNewline", InterpretNewLine(WebInputEvent::AltKey));
}
TEST_F(KeyboardTest, TestInsertNewline4) {
int modifiers = WebInputEvent::AltKey | WebInputEvent::ShiftKey;
const char* result = InterpretNewLine(modifiers);
EXPECT_STREQ("InsertNewline", result);
}