1d0825bca7fe65beaee391d30da42e937db621564Steve Block/* 2d0825bca7fe65beaee391d30da42e937db621564Steve Block * Copyright (C) 2010 Google Inc. All rights reserved. 3d0825bca7fe65beaee391d30da42e937db621564Steve Block * 4d0825bca7fe65beaee391d30da42e937db621564Steve Block * Redistribution and use in source and binary forms, with or without 5d0825bca7fe65beaee391d30da42e937db621564Steve Block * modification, are permitted provided that the following conditions are 6d0825bca7fe65beaee391d30da42e937db621564Steve Block * met: 7d0825bca7fe65beaee391d30da42e937db621564Steve Block * 8d0825bca7fe65beaee391d30da42e937db621564Steve Block * * Redistributions of source code must retain the above copyright 9d0825bca7fe65beaee391d30da42e937db621564Steve Block * notice, this list of conditions and the following disclaimer. 10d0825bca7fe65beaee391d30da42e937db621564Steve Block * * Redistributions in binary form must reproduce the above 11d0825bca7fe65beaee391d30da42e937db621564Steve Block * copyright notice, this list of conditions and the following disclaimer 12d0825bca7fe65beaee391d30da42e937db621564Steve Block * in the documentation and/or other materials provided with the 13d0825bca7fe65beaee391d30da42e937db621564Steve Block * distribution. 14d0825bca7fe65beaee391d30da42e937db621564Steve Block * * Neither the name of Google Inc. nor the names of its 15d0825bca7fe65beaee391d30da42e937db621564Steve Block * contributors may be used to endorse or promote products derived from 16d0825bca7fe65beaee391d30da42e937db621564Steve Block * this software without specific prior written permission. 17d0825bca7fe65beaee391d30da42e937db621564Steve Block * 18d0825bca7fe65beaee391d30da42e937db621564Steve Block * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19d0825bca7fe65beaee391d30da42e937db621564Steve Block * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20d0825bca7fe65beaee391d30da42e937db621564Steve Block * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21d0825bca7fe65beaee391d30da42e937db621564Steve Block * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22d0825bca7fe65beaee391d30da42e937db621564Steve Block * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23d0825bca7fe65beaee391d30da42e937db621564Steve Block * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24d0825bca7fe65beaee391d30da42e937db621564Steve Block * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25d0825bca7fe65beaee391d30da42e937db621564Steve Block * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26d0825bca7fe65beaee391d30da42e937db621564Steve Block * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27d0825bca7fe65beaee391d30da42e937db621564Steve Block * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28d0825bca7fe65beaee391d30da42e937db621564Steve Block * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29d0825bca7fe65beaee391d30da42e937db621564Steve Block */ 30d0825bca7fe65beaee391d30da42e937db621564Steve Block 31d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "config.h" 32d0825bca7fe65beaee391d30da42e937db621564Steve Block 33d0825bca7fe65beaee391d30da42e937db621564Steve Block#include <gtest/gtest.h> 34d0825bca7fe65beaee391d30da42e937db621564Steve Block 35d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "EditorClientImpl.h" 36d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "EventTarget.h" 37d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "KeyboardCodes.h" 38d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "KeyboardEvent.h" 39d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "WebInputEvent.h" 40d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "WebInputEventConversion.h" 41d0825bca7fe65beaee391d30da42e937db621564Steve Block 42d0825bca7fe65beaee391d30da42e937db621564Steve Blockusing namespace WebCore; 43d0825bca7fe65beaee391d30da42e937db621564Steve Blockusing namespace WebKit; 44d0825bca7fe65beaee391d30da42e937db621564Steve Block 45d0825bca7fe65beaee391d30da42e937db621564Steve Blocknamespace { 46d0825bca7fe65beaee391d30da42e937db621564Steve Block 47d0825bca7fe65beaee391d30da42e937db621564Steve Blockclass KeyboardTest : public testing::Test { 48d0825bca7fe65beaee391d30da42e937db621564Steve Blockpublic: 49d0825bca7fe65beaee391d30da42e937db621564Steve Block 50d0825bca7fe65beaee391d30da42e937db621564Steve Block // Pass a WebKeyboardEvent into the EditorClient and get back the string 51d0825bca7fe65beaee391d30da42e937db621564Steve Block // name of which editing event that key causes. 52d0825bca7fe65beaee391d30da42e937db621564Steve Block // E.g., sending in the enter key gives back "InsertNewline". 53d0825bca7fe65beaee391d30da42e937db621564Steve Block const char* interpretKeyEvent( 54d0825bca7fe65beaee391d30da42e937db621564Steve Block const WebKeyboardEvent& webKeyboardEvent, 55d0825bca7fe65beaee391d30da42e937db621564Steve Block PlatformKeyboardEvent::Type keyType) 56d0825bca7fe65beaee391d30da42e937db621564Steve Block { 57d0825bca7fe65beaee391d30da42e937db621564Steve Block EditorClientImpl editorImpl(0); 58d0825bca7fe65beaee391d30da42e937db621564Steve Block PlatformKeyboardEventBuilder evt(webKeyboardEvent); 59d0825bca7fe65beaee391d30da42e937db621564Steve Block evt.setKeyType(keyType); 60d0825bca7fe65beaee391d30da42e937db621564Steve Block RefPtr<KeyboardEvent> keyboardEvent = KeyboardEvent::create(evt, 0); 61d0825bca7fe65beaee391d30da42e937db621564Steve Block return editorImpl.interpretKeyEvent(keyboardEvent.get()); 62d0825bca7fe65beaee391d30da42e937db621564Steve Block } 63d0825bca7fe65beaee391d30da42e937db621564Steve Block 64d0825bca7fe65beaee391d30da42e937db621564Steve Block // Set up a WebKeyboardEvent KEY_DOWN event with key code and modifiers. 65d0825bca7fe65beaee391d30da42e937db621564Steve Block void setupKeyDownEvent(WebKeyboardEvent* keyboardEvent, 66d0825bca7fe65beaee391d30da42e937db621564Steve Block char keyCode, 67d0825bca7fe65beaee391d30da42e937db621564Steve Block int modifiers) 68d0825bca7fe65beaee391d30da42e937db621564Steve Block { 69d0825bca7fe65beaee391d30da42e937db621564Steve Block keyboardEvent->windowsKeyCode = keyCode; 70d0825bca7fe65beaee391d30da42e937db621564Steve Block keyboardEvent->modifiers = modifiers; 71d0825bca7fe65beaee391d30da42e937db621564Steve Block keyboardEvent->type = WebInputEvent::KeyDown; 72d0825bca7fe65beaee391d30da42e937db621564Steve Block keyboardEvent->text[0] = keyCode; 73d0825bca7fe65beaee391d30da42e937db621564Steve Block keyboardEvent->setKeyIdentifierFromWindowsKeyCode(); 74d0825bca7fe65beaee391d30da42e937db621564Steve Block } 75d0825bca7fe65beaee391d30da42e937db621564Steve Block 76d0825bca7fe65beaee391d30da42e937db621564Steve Block // Like interpretKeyEvent, but with pressing down OSModifier+|keyCode|. 77d0825bca7fe65beaee391d30da42e937db621564Steve Block // OSModifier is the platform's standard modifier key: control on most 78d0825bca7fe65beaee391d30da42e937db621564Steve Block // platforms, but meta (command) on Mac. 79d0825bca7fe65beaee391d30da42e937db621564Steve Block const char* interpretOSModifierKeyPress(char keyCode) 80d0825bca7fe65beaee391d30da42e937db621564Steve Block { 81d0825bca7fe65beaee391d30da42e937db621564Steve Block WebKeyboardEvent keyboardEvent; 82d0825bca7fe65beaee391d30da42e937db621564Steve Block#if OS(DARWIN) 83d0825bca7fe65beaee391d30da42e937db621564Steve Block WebInputEvent::Modifiers osModifier = WebInputEvent::MetaKey; 84d0825bca7fe65beaee391d30da42e937db621564Steve Block#else 85d0825bca7fe65beaee391d30da42e937db621564Steve Block WebInputEvent::Modifiers osModifier = WebInputEvent::ControlKey; 86d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif 87d0825bca7fe65beaee391d30da42e937db621564Steve Block setupKeyDownEvent(&keyboardEvent, keyCode, osModifier); 88d0825bca7fe65beaee391d30da42e937db621564Steve Block return interpretKeyEvent(keyboardEvent, PlatformKeyboardEvent::RawKeyDown); 89d0825bca7fe65beaee391d30da42e937db621564Steve Block } 90d0825bca7fe65beaee391d30da42e937db621564Steve Block 91d0825bca7fe65beaee391d30da42e937db621564Steve Block // Like interpretKeyEvent, but with pressing down ctrl+|keyCode|. 92d0825bca7fe65beaee391d30da42e937db621564Steve Block const char* interpretCtrlKeyPress(char keyCode) 93d0825bca7fe65beaee391d30da42e937db621564Steve Block { 94d0825bca7fe65beaee391d30da42e937db621564Steve Block WebKeyboardEvent keyboardEvent; 95d0825bca7fe65beaee391d30da42e937db621564Steve Block setupKeyDownEvent(&keyboardEvent, keyCode, WebInputEvent::ControlKey); 96d0825bca7fe65beaee391d30da42e937db621564Steve Block return interpretKeyEvent(keyboardEvent, PlatformKeyboardEvent::RawKeyDown); 97d0825bca7fe65beaee391d30da42e937db621564Steve Block } 98d0825bca7fe65beaee391d30da42e937db621564Steve Block 99d0825bca7fe65beaee391d30da42e937db621564Steve Block // Like interpretKeyEvent, but with typing a tab. 100d0825bca7fe65beaee391d30da42e937db621564Steve Block const char* interpretTab(int modifiers) 101d0825bca7fe65beaee391d30da42e937db621564Steve Block { 102d0825bca7fe65beaee391d30da42e937db621564Steve Block WebKeyboardEvent keyboardEvent; 103d0825bca7fe65beaee391d30da42e937db621564Steve Block setupKeyDownEvent(&keyboardEvent, '\t', modifiers); 104d0825bca7fe65beaee391d30da42e937db621564Steve Block return interpretKeyEvent(keyboardEvent, PlatformKeyboardEvent::Char); 105d0825bca7fe65beaee391d30da42e937db621564Steve Block } 106d0825bca7fe65beaee391d30da42e937db621564Steve Block 107d0825bca7fe65beaee391d30da42e937db621564Steve Block // Like interpretKeyEvent, but with typing a newline. 108d0825bca7fe65beaee391d30da42e937db621564Steve Block const char* interpretNewLine(int modifiers) 109d0825bca7fe65beaee391d30da42e937db621564Steve Block { 110d0825bca7fe65beaee391d30da42e937db621564Steve Block WebKeyboardEvent keyboardEvent; 111d0825bca7fe65beaee391d30da42e937db621564Steve Block setupKeyDownEvent(&keyboardEvent, '\r', modifiers); 112d0825bca7fe65beaee391d30da42e937db621564Steve Block return interpretKeyEvent(keyboardEvent, PlatformKeyboardEvent::Char); 113d0825bca7fe65beaee391d30da42e937db621564Steve Block } 114d0825bca7fe65beaee391d30da42e937db621564Steve Block 115d0825bca7fe65beaee391d30da42e937db621564Steve Block // A name for "no modifiers set". 116d0825bca7fe65beaee391d30da42e937db621564Steve Block static const int noModifiers = 0; 117d0825bca7fe65beaee391d30da42e937db621564Steve Block}; 118d0825bca7fe65beaee391d30da42e937db621564Steve Block 119d0825bca7fe65beaee391d30da42e937db621564Steve BlockTEST_F(KeyboardTest, TestCtrlReturn) 120d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 121d0825bca7fe65beaee391d30da42e937db621564Steve Block EXPECT_STREQ("InsertNewline", interpretCtrlKeyPress(0xD)); 122d0825bca7fe65beaee391d30da42e937db621564Steve Block} 123d0825bca7fe65beaee391d30da42e937db621564Steve Block 124d0825bca7fe65beaee391d30da42e937db621564Steve BlockTEST_F(KeyboardTest, TestOSModifierZ) 125d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 126d0825bca7fe65beaee391d30da42e937db621564Steve Block#if !OS(DARWIN) 127d0825bca7fe65beaee391d30da42e937db621564Steve Block EXPECT_STREQ("Undo", interpretOSModifierKeyPress('Z')); 128d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif 129d0825bca7fe65beaee391d30da42e937db621564Steve Block} 130d0825bca7fe65beaee391d30da42e937db621564Steve Block 131d0825bca7fe65beaee391d30da42e937db621564Steve BlockTEST_F(KeyboardTest, TestOSModifierY) 132d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 133d0825bca7fe65beaee391d30da42e937db621564Steve Block#if !OS(DARWIN) 134d0825bca7fe65beaee391d30da42e937db621564Steve Block EXPECT_STREQ("Redo", interpretOSModifierKeyPress('Y')); 135d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif 136d0825bca7fe65beaee391d30da42e937db621564Steve Block} 137d0825bca7fe65beaee391d30da42e937db621564Steve Block 138d0825bca7fe65beaee391d30da42e937db621564Steve BlockTEST_F(KeyboardTest, TestOSModifierA) 139d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 140d0825bca7fe65beaee391d30da42e937db621564Steve Block#if !OS(DARWIN) 141d0825bca7fe65beaee391d30da42e937db621564Steve Block EXPECT_STREQ("SelectAll", interpretOSModifierKeyPress('A')); 142d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif 143d0825bca7fe65beaee391d30da42e937db621564Steve Block} 144d0825bca7fe65beaee391d30da42e937db621564Steve Block 145d0825bca7fe65beaee391d30da42e937db621564Steve BlockTEST_F(KeyboardTest, TestOSModifierX) 146d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 147d0825bca7fe65beaee391d30da42e937db621564Steve Block#if !OS(DARWIN) 148d0825bca7fe65beaee391d30da42e937db621564Steve Block EXPECT_STREQ("Cut", interpretOSModifierKeyPress('X')); 149d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif 150d0825bca7fe65beaee391d30da42e937db621564Steve Block} 151d0825bca7fe65beaee391d30da42e937db621564Steve Block 152d0825bca7fe65beaee391d30da42e937db621564Steve BlockTEST_F(KeyboardTest, TestOSModifierC) 153d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 154d0825bca7fe65beaee391d30da42e937db621564Steve Block#if !OS(DARWIN) 155d0825bca7fe65beaee391d30da42e937db621564Steve Block EXPECT_STREQ("Copy", interpretOSModifierKeyPress('C')); 156d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif 157d0825bca7fe65beaee391d30da42e937db621564Steve Block} 158d0825bca7fe65beaee391d30da42e937db621564Steve Block 159d0825bca7fe65beaee391d30da42e937db621564Steve BlockTEST_F(KeyboardTest, TestOSModifierV) 160d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 161d0825bca7fe65beaee391d30da42e937db621564Steve Block#if !OS(DARWIN) 162d0825bca7fe65beaee391d30da42e937db621564Steve Block EXPECT_STREQ("Paste", interpretOSModifierKeyPress('V')); 163d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif 164d0825bca7fe65beaee391d30da42e937db621564Steve Block} 165d0825bca7fe65beaee391d30da42e937db621564Steve Block 166d0825bca7fe65beaee391d30da42e937db621564Steve BlockTEST_F(KeyboardTest, TestEscape) 167d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 168d0825bca7fe65beaee391d30da42e937db621564Steve Block WebKeyboardEvent keyboardEvent; 169d0825bca7fe65beaee391d30da42e937db621564Steve Block setupKeyDownEvent(&keyboardEvent, WebCore::VKEY_ESCAPE, noModifiers); 170d0825bca7fe65beaee391d30da42e937db621564Steve Block 171d0825bca7fe65beaee391d30da42e937db621564Steve Block const char* result = interpretKeyEvent(keyboardEvent, 172d0825bca7fe65beaee391d30da42e937db621564Steve Block PlatformKeyboardEvent::RawKeyDown); 173d0825bca7fe65beaee391d30da42e937db621564Steve Block EXPECT_STREQ("Cancel", result); 174d0825bca7fe65beaee391d30da42e937db621564Steve Block} 175d0825bca7fe65beaee391d30da42e937db621564Steve Block 176d0825bca7fe65beaee391d30da42e937db621564Steve BlockTEST_F(KeyboardTest, TestInsertTab) 177d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 178d0825bca7fe65beaee391d30da42e937db621564Steve Block EXPECT_STREQ("InsertTab", interpretTab(noModifiers)); 179d0825bca7fe65beaee391d30da42e937db621564Steve Block} 180d0825bca7fe65beaee391d30da42e937db621564Steve Block 181d0825bca7fe65beaee391d30da42e937db621564Steve BlockTEST_F(KeyboardTest, TestInsertBackTab) 182d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 183d0825bca7fe65beaee391d30da42e937db621564Steve Block EXPECT_STREQ("InsertBacktab", interpretTab(WebInputEvent::ShiftKey)); 184d0825bca7fe65beaee391d30da42e937db621564Steve Block} 185d0825bca7fe65beaee391d30da42e937db621564Steve Block 186d0825bca7fe65beaee391d30da42e937db621564Steve BlockTEST_F(KeyboardTest, TestInsertNewline) 187d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 188d0825bca7fe65beaee391d30da42e937db621564Steve Block EXPECT_STREQ("InsertNewline", interpretNewLine(noModifiers)); 189d0825bca7fe65beaee391d30da42e937db621564Steve Block} 190d0825bca7fe65beaee391d30da42e937db621564Steve Block 191d0825bca7fe65beaee391d30da42e937db621564Steve BlockTEST_F(KeyboardTest, TestInsertNewline2) 192d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 193d0825bca7fe65beaee391d30da42e937db621564Steve Block EXPECT_STREQ("InsertNewline", interpretNewLine(WebInputEvent::ControlKey)); 194d0825bca7fe65beaee391d30da42e937db621564Steve Block} 195d0825bca7fe65beaee391d30da42e937db621564Steve Block 196d0825bca7fe65beaee391d30da42e937db621564Steve BlockTEST_F(KeyboardTest, TestInsertLineBreak) 197d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 198d0825bca7fe65beaee391d30da42e937db621564Steve Block EXPECT_STREQ("InsertLineBreak", interpretNewLine(WebInputEvent::ShiftKey)); 199d0825bca7fe65beaee391d30da42e937db621564Steve Block} 200d0825bca7fe65beaee391d30da42e937db621564Steve Block 201d0825bca7fe65beaee391d30da42e937db621564Steve BlockTEST_F(KeyboardTest, TestInsertNewline3) 202d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 203d0825bca7fe65beaee391d30da42e937db621564Steve Block EXPECT_STREQ("InsertNewline", interpretNewLine(WebInputEvent::AltKey)); 204d0825bca7fe65beaee391d30da42e937db621564Steve Block} 205d0825bca7fe65beaee391d30da42e937db621564Steve Block 206d0825bca7fe65beaee391d30da42e937db621564Steve BlockTEST_F(KeyboardTest, TestInsertNewline4) 207d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 208d0825bca7fe65beaee391d30da42e937db621564Steve Block int modifiers = WebInputEvent::AltKey | WebInputEvent::ShiftKey; 209d0825bca7fe65beaee391d30da42e937db621564Steve Block const char* result = interpretNewLine(modifiers); 210d0825bca7fe65beaee391d30da42e937db621564Steve Block EXPECT_STREQ("InsertNewline", result); 211d0825bca7fe65beaee391d30da42e937db621564Steve Block} 212d0825bca7fe65beaee391d30da42e937db621564Steve Block 213d0825bca7fe65beaee391d30da42e937db621564Steve Block} // empty namespace 214