Avi Drissman | 3e1a26c | 2022-09-15 20:26:03 | [diff] [blame] | 1 | // Copyright 2016 The Chromium Authors |
sky | 138f54d | 2016-07-26 13:33:08 | [diff] [blame] | 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 "ui/base/accelerators/accelerator.h" |
| 6 | |
Jan Wilken Dörrie | ad587c3 | 2021-03-11 14:09:27 | [diff] [blame] | 7 | #include <string> |
| 8 | |
Elly Fong-Jones | f795ec6 | 2018-03-30 22:26:06 | [diff] [blame] | 9 | #include "base/strings/utf_string_conversions.h" |
| 10 | #include "build/build_config.h" |
sky | 138f54d | 2016-07-26 13:33:08 | [diff] [blame] | 11 | #include "testing/gtest/include/gtest/gtest.h" |
wutao | ea403cb7 | 2018-03-09 18:26:24 | [diff] [blame] | 12 | #include "ui/events/event.h" |
Danny Wang | 26d782c | 2023-07-25 19:01:18 | [diff] [blame] | 13 | #include "ui/events/types/event_type.h" |
sky | 138f54d | 2016-07-26 13:33:08 | [diff] [blame] | 14 | |
| 15 | namespace ui { |
| 16 | |
| 17 | TEST(AcceleratorTest, Repeat) { |
| 18 | const Accelerator accelerator_a(VKEY_A, EF_NONE); |
| 19 | EXPECT_FALSE(accelerator_a.IsRepeat()); |
| 20 | |
| 21 | const Accelerator accelerator_b(VKEY_B, EF_IS_REPEAT); |
| 22 | EXPECT_TRUE(accelerator_b.IsRepeat()); |
| 23 | |
| 24 | const Accelerator accelerator_b_copy(accelerator_b); |
| 25 | EXPECT_TRUE(accelerator_b_copy.IsRepeat()); |
| 26 | } |
| 27 | |
wutao | ea403cb7 | 2018-03-09 18:26:24 | [diff] [blame] | 28 | TEST(AcceleratorTest, TimeStamp) { |
| 29 | const Accelerator accelerator_a(VKEY_A, EF_NONE); |
| 30 | EXPECT_EQ(base::TimeTicks(), accelerator_a.time_stamp()); |
| 31 | |
Peter Kasting | e5a38ed | 2021-10-02 03:06:35 | [diff] [blame] | 32 | const base::TimeTicks event_time = base::TimeTicks() + base::Milliseconds(1); |
Avi Drissman | ae99ae28 | 2024-07-22 20:44:28 | [diff] [blame] | 33 | KeyEvent keyevent(EventType::kKeyPressed, VKEY_SPACE, EF_NONE, event_time); |
wutao | ea403cb7 | 2018-03-09 18:26:24 | [diff] [blame] | 34 | |
| 35 | const Accelerator accelerator_b(keyevent); |
| 36 | EXPECT_EQ(event_time, accelerator_b.time_stamp()); |
| 37 | } |
| 38 | |
Xing Liu | dc65d4e | 2019-07-01 18:27:10 | [diff] [blame] | 39 | // Crash on Android builders. https://crbug.com/980267 |
Xiaohan Wang | 8407409 | 2022-01-20 21:25:54 | [diff] [blame] | 40 | #if BUILDFLAG(IS_ANDROID) |
Xing Liu | dc65d4e | 2019-07-01 18:27:10 | [diff] [blame] | 41 | #define MAYBE_GetShortcutText DISABLED_GetShortcutText |
| 42 | #else |
| 43 | #define MAYBE_GetShortcutText GetShortcutText |
| 44 | #endif |
| 45 | TEST(AcceleratorTest, MAYBE_GetShortcutText) { |
Elly Fong-Jones | f795ec6 | 2018-03-30 22:26:06 | [diff] [blame] | 46 | struct { |
| 47 | KeyboardCode code; |
| 48 | int modifiers; |
Avi Drissman | 5acfd128 | 2021-04-01 01:56:15 | [diff] [blame] | 49 | const char16_t* expected_long; |
| 50 | const char16_t* expected_short; |
Elly Fong-Jones | f795ec6 | 2018-03-30 22:26:06 | [diff] [blame] | 51 | } keys[] = { |
deepak1556 | 80789bb | 2024-10-23 16:55:55 | [diff] [blame] | 52 | {VKEY_Q, EF_CONTROL_DOWN | EF_SHIFT_DOWN, u"Ctrl+Shift+Q", u"⌃⇧Q"}, |
| 53 | {VKEY_A, EF_ALT_DOWN | EF_SHIFT_DOWN, u"Alt+Shift+A", u"⌥⇧A"}, |
| 54 | // Regression test for https://crbug.com/867732: |
| 55 | {VKEY_OEM_COMMA, EF_CONTROL_DOWN, u"Ctrl+Comma", u"⌃,"}, |
Xiaohan Wang | 8407409 | 2022-01-20 21:25:54 | [diff] [blame] | 56 | #if BUILDFLAG(IS_MAC) |
deepak1556 | 80789bb | 2024-10-23 16:55:55 | [diff] [blame] | 57 | {VKEY_T, EF_COMMAND_DOWN | EF_CONTROL_DOWN, nullptr, u"⌃⌘T"}, |
| 58 | #endif |
| 59 | #if BUILDFLAG(IS_LINUX) |
| 60 | {VKEY_T, EF_COMMAND_DOWN | EF_CONTROL_DOWN, u"Super+Ctrl+T", nullptr}, |
Elly Fong-Jones | f795ec6 | 2018-03-30 22:26:06 | [diff] [blame] | 61 | #endif |
| 62 | }; |
| 63 | |
| 64 | for (const auto& key : keys) { |
Jan Wilken Dörrie | 5263957 | 2021-03-11 16:49:54 | [diff] [blame] | 65 | std::u16string text = |
Elly Fong-Jones | f795ec6 | 2018-03-30 22:26:06 | [diff] [blame] | 66 | Accelerator(key.code, key.modifiers).GetShortcutText(); |
Xiaohan Wang | 8407409 | 2022-01-20 21:25:54 | [diff] [blame] | 67 | #if BUILDFLAG(IS_MAC) |
Avi Drissman | 5acfd128 | 2021-04-01 01:56:15 | [diff] [blame] | 68 | EXPECT_EQ(text, key.expected_short); |
Elly Fong-Jones | f795ec6 | 2018-03-30 22:26:06 | [diff] [blame] | 69 | #else |
Avi Drissman | 5acfd128 | 2021-04-01 01:56:15 | [diff] [blame] | 70 | EXPECT_EQ(text, key.expected_long); |
Elly Fong-Jones | f795ec6 | 2018-03-30 22:26:06 | [diff] [blame] | 71 | #endif |
| 72 | } |
| 73 | } |
| 74 | |
Anton Permyakov | 1ae73af | 2019-03-07 10:05:43 | [diff] [blame] | 75 | TEST(AcceleratorTest, ShortcutTextForUnknownKey) { |
| 76 | const Accelerator accelerator(VKEY_UNKNOWN, EF_NONE); |
Jan Wilken Dörrie | 5263957 | 2021-03-11 16:49:54 | [diff] [blame] | 77 | EXPECT_EQ(std::u16string(), accelerator.GetShortcutText()); |
Anton Permyakov | 1ae73af | 2019-03-07 10:05:43 | [diff] [blame] | 78 | } |
| 79 | |
Danny Wang | 26d782c | 2023-07-25 19:01:18 | [diff] [blame] | 80 | TEST(AcceleratorTest, VerifyToKeyEventConstructor) { |
| 81 | const Accelerator accelerator(VKEY_Z, EF_COMMAND_DOWN, |
| 82 | Accelerator::KeyState::RELEASED, |
| 83 | base::TimeTicks()); |
| 84 | KeyEvent key_event = accelerator.ToKeyEvent(); |
| 85 | // Check key event fields to verift if the right constructor is called. |
| 86 | EXPECT_EQ(key_event.key_code(), VKEY_Z); |
Avi Drissman | ae99ae28 | 2024-07-22 20:44:28 | [diff] [blame] | 87 | EXPECT_EQ(key_event.Clone()->type(), ui::EventType::kKeyReleased); |
Danny Wang | 26d782c | 2023-07-25 19:01:18 | [diff] [blame] | 88 | EXPECT_FALSE(key_event.is_char()); |
| 89 | } |
| 90 | |
Zentaro Kavanagh | 29fd367f | 2021-05-07 23:38:09 | [diff] [blame] | 91 | TEST(AcceleratorTest, ConversionFromKeyEvent) { |
Jayson Adams | 7553327 | 2021-10-20 20:50:22 | [diff] [blame] | 92 | ui::KeyEvent key_event( |
Avi Drissman | ae99ae28 | 2024-07-22 20:44:28 | [diff] [blame] | 93 | ui::EventType::kKeyPressed, ui::VKEY_F, |
Jayson Adams | 7553327 | 2021-10-20 20:50:22 | [diff] [blame] | 94 | ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_FUNCTION_DOWN); |
Zentaro Kavanagh | 29fd367f | 2021-05-07 23:38:09 | [diff] [blame] | 95 | Accelerator accelerator(key_event); |
| 96 | |
| 97 | EXPECT_EQ(accelerator.key_code(), ui::VKEY_F); |
Jayson Adams | 7553327 | 2021-10-20 20:50:22 | [diff] [blame] | 98 | EXPECT_EQ(accelerator.modifiers(), |
| 99 | ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_FUNCTION_DOWN); |
Zentaro Kavanagh | 29fd367f | 2021-05-07 23:38:09 | [diff] [blame] | 100 | } |
| 101 | |
Xiaohan Wang | 8407409 | 2022-01-20 21:25:54 | [diff] [blame] | 102 | #if BUILDFLAG(IS_MAC) |
Jayson Adams | 7f27f55 | 2021-10-27 20:59:44 | [diff] [blame] | 103 | class AcceleratorTestMac : public testing::Test { |
| 104 | public: |
| 105 | AcceleratorTestMac() = default; |
| 106 | ~AcceleratorTestMac() override = default; |
| 107 | |
Anthony Cui | 9cc3dd9 | 2025-04-23 18:30:54 | [diff] [blame] | 108 | // Returns a "short" vector representation of the modifier flags in |
Jayson Adams | 7f27f55 | 2021-10-27 20:59:44 | [diff] [blame] | 109 | // |modifier_mask|. |
Anthony Cui | 9cc3dd9 | 2025-04-23 18:30:54 | [diff] [blame] | 110 | std::vector<std::u16string> ShortFormStringForModifiers(int modifier_flags) { |
Avi Drissman | ae99ae28 | 2024-07-22 20:44:28 | [diff] [blame] | 111 | ui::KeyEvent key_event(ui::EventType::kKeyPressed, ui::VKEY_F, |
| 112 | modifier_flags); |
Jayson Adams | 7f27f55 | 2021-10-27 20:59:44 | [diff] [blame] | 113 | Accelerator accelerator(key_event); |
|
|