1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CONTENT_TEST_MOCK_KEYBOARD_H_
6#define CONTENT_TEST_MOCK_KEYBOARD_H_
7
8#include <string>
9
10#include "base/basictypes.h"
11
12#if defined(OS_WIN)
13#include "content/test/mock_keyboard_driver_win.h"
14#endif
15
16namespace content {
17
18// A mock keyboard interface.
19// This class defines a pseudo keyboard device, which implements mappings from
20// a tuple (layout, key code, modifiers) to Unicode characters so that
21// engineers can write RenderViewTest cases without taking care of such
22// mappings. (This mapping is not trivial when using non-US keyboards.)
23// A pseudo keyboard device consists of two parts: a platform-independent part
24// and a platform-dependent part. This class implements the platform-independent
25// part. The platform-dependet part is implemented in the MockKeyboardWin class.
26// This class is usually called from RenderViewTest::SendKeyEvent().
27class MockKeyboard {
28 public:
29  // Represents keyboard-layouts.
30  enum Layout {
31    LAYOUT_NULL,
32    LAYOUT_ARABIC,
33    LAYOUT_BULGARIAN,
34    LAYOUT_CHINESE_TRADITIONAL,
35    LAYOUT_CZECH,
36    LAYOUT_DANISH,
37    LAYOUT_GERMAN,
38    LAYOUT_GREEK,
39    LAYOUT_UNITED_STATES,
40    LAYOUT_SPANISH,
41    LAYOUT_FINNISH,
42    LAYOUT_FRENCH,
43    LAYOUT_HEBREW,
44    LAYOUT_HUNGARIAN,
45    LAYOUT_ICELANDIC,
46    LAYOUT_ITALIAN,
47    LAYOUT_JAPANESE,
48    LAYOUT_KOREAN,
49    LAYOUT_POLISH,
50    LAYOUT_PORTUGUESE_BRAZILIAN,
51    LAYOUT_ROMANIAN,
52    LAYOUT_RUSSIAN,
53    LAYOUT_CROATIAN,
54    LAYOUT_SLOVAK,
55    LAYOUT_THAI,
56    LAYOUT_SWEDISH,
57    LAYOUT_TURKISH_Q,
58    LAYOUT_VIETNAMESE,
59    LAYOUT_DEVANAGARI_INSCRIPT,
60    LAYOUT_PORTUGUESE,
61    LAYOUT_UNITED_STATES_DVORAK,
62    LAYOUT_CANADIAN_FRENCH,
63  };
64
65  // Enumerates keyboard modifiers.
66  // These modifiers explicitly distinguish left-keys and right-keys because we
67  // should emulate AltGr (right-alt) key, used by many European keyboards to
68  // input alternate graph characters.
69  enum Modifiers {
70    INVALID = -1,
71    NONE = 0,
72    LEFT_SHIFT = 1 << 0,
73    LEFT_CONTROL = 1 << 1,
74    LEFT_ALT = 1 << 2,
75    LEFT_META = 1 << 3,
76    RIGHT_SHIFT = 1 << 4,
77    RIGHT_CONTROL = 1 << 5,
78    RIGHT_ALT = 1 << 6,
79    RIGHT_META = 1 << 7,
80    KEYPAD = 1 << 8,
81    AUTOREPEAAT = 1 << 9,
82  };
83
84  MockKeyboard();
85  ~MockKeyboard();
86
87  // Retrieves Unicode characters composed from the the specified keyboard
88  // layout, key code, and modifiers, i.e. characters returned when we type
89  // specified keys on a specified layout.
90  // This function returns the length of Unicode characters filled in the
91  // |output| parameter.
92  int GetCharacters(Layout layout,
93                    int key_code,
94                    Modifiers modifiers,
95                    std::wstring* output);
96
97 private:
98  Layout keyboard_layout_;
99  Modifiers keyboard_modifiers_;
100
101#if defined(OS_WIN)
102  MockKeyboardDriverWin driver_;
103#endif
104
105  DISALLOW_COPY_AND_ASSIGN(MockKeyboard);
106};
107
108}  // namespace content
109
110#endif  // CONTENT_TEST_MOCK_KEYBOARD_H_
111