| /* |
| * Copyright (C) 2010 Google Inc. All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions are |
| * met: |
| * |
| * * Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * * Redistributions in binary form must reproduce the above |
| * copyright notice, this list of conditions and the following disclaimer |
| * in the documentation and/or other materials provided with the |
| * distribution. |
| * * Neither the name of Google Inc. nor the names of its |
| * contributors may be used to endorse or promote products derived from |
| * this software without specific prior written permission. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
| * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| */ |
| |
| #include "config.h" |
| |
| #include <gtest/gtest.h> |
| |
| #include "EditorClientImpl.h" |
| #include "EventTarget.h" |
| #include "KeyboardCodes.h" |
| #include "KeyboardEvent.h" |
| #include "WebInputEvent.h" |
| #include "WebInputEventConversion.h" |
| |
| using namespace WebCore; |
| using namespace WebKit; |
| |
| namespace { |
| |
| class KeyboardTest : public testing::Test { |
| public: |
| |
| // 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& webKeyboardEvent, |
| PlatformKeyboardEvent::Type keyType) |
| { |
| EditorClientImpl editorImpl(0); |
| PlatformKeyboardEventBuilder evt(webKeyboardEvent); |
| evt.setKeyType(keyType); |
| RefPtr<KeyboardEvent> keyboardEvent = KeyboardEvent::create(evt, 0); |
| return editorImpl.interpretKeyEvent(keyboardEvent.get()); |
| } |
| |
| // Set up a WebKeyboardEvent KEY_DOWN event with key code and modifiers. |
| void setupKeyDownEvent(WebKeyboardEvent* keyboardEvent, |
| char keyCode, |
| int modifiers) |
| { |
| keyboardEvent->windowsKeyCode = keyCode; |
| keyboardEvent->modifiers = modifiers; |
| keyboardEvent->type = WebInputEvent::KeyDown; |
| keyboardEvent->text[0] = keyCode; |
| keyboardEvent->setKeyIdentifierFromWindowsKeyCode(); |
| } |
| |
| // Like interpretKeyEvent, but with pressing down OSModifier+|keyCode|. |
| // OSModifier is the platform's standard modifier key: control on most |
| // platforms, but meta (command) on Mac. |
| const char* interpretOSModifierKeyPress(char keyCode) |
| { |
| WebKeyboardEvent keyboardEvent; |
| #if OS(DARWIN) |
| WebInputEvent::Modifiers osModifier = WebInputEvent::MetaKey; |
| #else |
| WebInputEvent::Modifiers osModifier = WebInputEvent::ControlKey; |
| #endif |
| setupKeyDownEvent(&keyboardEvent, keyCode, osModifier); |
| return interpretKeyEvent(keyboardEvent, PlatformKeyboardEvent::RawKeyDown); |
| } |
| |
| // Like interpretKeyEvent, but with pressing down ctrl+|keyCode|. |
| const char* interpretCtrlKeyPress(char keyCode) |
| { |
| WebKeyboardEvent keyboardEvent; |
| setupKeyDownEvent(&keyboardEvent, keyCode, WebInputEvent::ControlKey); |
| return interpretKeyEvent(keyboardEvent, PlatformKeyboardEvent::RawKeyDown); |
| } |
| |
| // Like interpretKeyEvent, but with typing a tab. |
| const char* interpretTab(int modifiers) |
| { |
| WebKeyboardEvent keyboardEvent; |
| setupKeyDownEvent(&keyboardEvent, '\t', modifiers); |
| return interpretKeyEvent(keyboardEvent, PlatformKeyboardEvent::Char); |
| } |
| |
| // Like interpretKeyEvent, but with typing a newline. |
| const char* interpretNewLine(int modifiers) |
| { |
| WebKeyboardEvent keyboardEvent; |
| setupKeyDownEvent(&keyboardEvent, '\r', modifiers); |
| return interpretKeyEvent(keyboardEvent, PlatformKeyboardEvent::Char); |
| } |
| |
| // A name for "no modifiers set". |
| static const int noModifiers = 0; |
| }; |
| |
| TEST_F(KeyboardTest, TestCtrlReturn) |
| { |
| EXPECT_STREQ("InsertNewline", interpretCtrlKeyPress(0xD)); |
| } |
| |
| TEST_F(KeyboardTest, TestOSModifierZ) |
| { |
| #if !OS(DARWIN) |
| EXPECT_STREQ("Undo", interpretOSModifierKeyPress('Z')); |
| #endif |
| } |
| |
| TEST_F(KeyboardTest, TestOSModifierY) |
| { |
| #if !OS(DARWIN) |
| EXPECT_STREQ("Redo", interpretOSModifierKeyPress('Y')); |
| #endif |
| } |
| |
| TEST_F(KeyboardTest, TestOSModifierA) |
| { |
| #if !OS(DARWIN) |
| EXPECT_STREQ("SelectAll", interpretOSModifierKeyPress('A')); |
| #endif |
| } |
| |
| TEST_F(KeyboardTest, TestOSModifierX) |
| { |
| #if !OS(DARWIN) |
| EXPECT_STREQ("Cut", interpretOSModifierKeyPress('X')); |
| #endif |
| } |
| |
| TEST_F(KeyboardTest, TestOSModifierC) |
| { |
| #if !OS(DARWIN) |
| EXPECT_STREQ("Copy", interpretOSModifierKeyPress('C')); |
| #endif |
| } |
| |
| TEST_F(KeyboardTest, TestOSModifierV) |
| { |
| #if !OS(DARWIN) |
| EXPECT_STREQ("Paste", interpretOSModifierKeyPress('V')); |
| #endif |
| } |
| |
| TEST_F(KeyboardTest, TestEscape) |
| { |
| WebKeyboardEvent keyboardEvent; |
| setupKeyDownEvent(&keyboardEvent, WebCore::VKEY_ESCAPE, noModifiers); |
| |
| const char* result = interpretKeyEvent(keyboardEvent, |
| PlatformKeyboardEvent::RawKeyDown); |
| EXPECT_STREQ("Cancel", result); |
| } |
| |
| TEST_F(KeyboardTest, TestInsertTab) |
| { |
| EXPECT_STREQ("InsertTab", interpretTab(noModifiers)); |
| } |
| |
| TEST_F(KeyboardTest, TestInsertBackTab) |
| { |
| EXPECT_STREQ("InsertBacktab", interpretTab(WebInputEvent::ShiftKey)); |
| } |
| |
| TEST_F(KeyboardTest, TestInsertNewline) |
| { |
| EXPECT_STREQ("InsertNewline", interpretNewLine(noModifiers)); |
| } |
| |
| 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); |
| } |
| |
| } // empty namespace |