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