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 #include "ash/keyboard_overlay/keyboard_overlay_view.h"
6
7 #include <algorithm>
8
9 #include "ash/accelerators/accelerator_table.h"
10 #include "ash/keyboard_overlay/keyboard_overlay_delegate.h"
11 #include "ash/shell.h"
12 #include "ash/shell_delegate.h"
13 #include "ash/test/ash_test_base.h"
14 #include "ui/web_dialogs/test/test_web_contents_handler.h"
15 #include "ui/web_dialogs/test/test_web_dialog_delegate.h"
16
17 namespace ash {
18
19 typedef test::AshTestBase KeyboardOverlayViewTest;
20
operator ==(const KeyboardOverlayView::KeyEventData & lhs,const KeyboardOverlayView::KeyEventData & rhs)21 bool operator==(const KeyboardOverlayView::KeyEventData& lhs,
22 const KeyboardOverlayView::KeyEventData& rhs) {
23 return (lhs.key_code == rhs.key_code) && (lhs.flags == rhs.flags);
24 }
25
26 // Verifies that the accelerators that open the keyboard overlay close it.
TEST_F(KeyboardOverlayViewTest,OpenAcceleratorsClose)27 TEST_F(KeyboardOverlayViewTest, OpenAcceleratorsClose) {
28 ui::test::TestWebDialogDelegate delegate(GURL("chrome://keyboardoverlay"));
29 KeyboardOverlayView view(
30 Shell::GetInstance()->delegate()->GetActiveBrowserContext(),
31 &delegate,
32 new ui::test::TestWebContentsHandler);
33 for (size_t i = 0; i < kAcceleratorDataLength; ++i) {
34 if (kAcceleratorData[i].action != SHOW_KEYBOARD_OVERLAY)
35 continue;
36 const AcceleratorData& open_key_data = kAcceleratorData[i];
37 ui::KeyEvent open_key(open_key_data.trigger_on_press ?
38 ui::ET_KEY_PRESSED : ui::ET_KEY_RELEASED,
39 open_key_data.keycode,
40 open_key_data.modifiers);
41 EXPECT_TRUE(view.IsCancelingKeyEvent(&open_key));
42 }
43 }
44
45 // Verifies that there are no redunduant keys in the canceling keys.
TEST_F(KeyboardOverlayViewTest,NoRedundantCancelingKeys)46 TEST_F(KeyboardOverlayViewTest, NoRedundantCancelingKeys) {
47 std::vector<KeyboardOverlayView::KeyEventData> open_keys;
48 for (size_t i = 0; i < kAcceleratorDataLength; ++i) {
49 if (kAcceleratorData[i].action != SHOW_KEYBOARD_OVERLAY)
50 continue;
51 // Escape is used just for canceling.
52 KeyboardOverlayView::KeyEventData open_key = {
53 kAcceleratorData[i].keycode,
54 kAcceleratorData[i].modifiers,
55 };
56 open_keys.push_back(open_key);
57 }
58
59 std::vector<KeyboardOverlayView::KeyEventData> canceling_keys;
60 KeyboardOverlayView::GetCancelingKeysForTesting(&canceling_keys);
61
62 // Escape is used just for canceling, so exclude it from the comparison with
63 // open keys.
64 KeyboardOverlayView::KeyEventData escape = { ui::VKEY_ESCAPE, ui::EF_NONE };
65 std::vector<KeyboardOverlayView::KeyEventData>::iterator escape_itr =
66 std::find(canceling_keys.begin(), canceling_keys.end(), escape);
67 canceling_keys.erase(escape_itr);
68
69 // Other canceling keys should be same as opening keys.
70 EXPECT_EQ(open_keys.size(), canceling_keys.size());
71 for (size_t i = 0; i < canceling_keys.size(); ++i) {
72 EXPECT_NE(std::find(open_keys.begin(), open_keys.end(), canceling_keys[i]),
73 open_keys.end());
74 }
75 }
76
77 } // namespace ash
78