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 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. 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. 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