| // Copyright 2016 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include <stddef.h> |
| |
| #include <set> |
| |
| #include "base/stl_util.h" |
| #include "build/build_config.h" |
| #include "chrome/app/chrome_command_ids.h" |
| #import "chrome/browser/global_keyboard_shortcuts_mac.h" |
| #include "chrome/browser/ui/views/accelerator_table.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| #include "ui/events/event_constants.h" |
| #import "ui/events/keycodes/keyboard_code_conversion_mac.h" |
| |
| namespace { |
| |
| void VerifyTableDoesntHaveDuplicates( |
| const std::vector<KeyboardShortcutData>& table, |
| const std::string& table_name) { |
| const std::vector<AcceleratorMapping> accelerators(GetAcceleratorList()); |
| |
| for (const auto& e : table) { |
| int modifiers = 0; |
| if (e.command_key) |
| modifiers |= ui::EF_COMMAND_DOWN; |
| if (e.shift_key) |
| modifiers |= ui::EF_SHIFT_DOWN; |
| if (e.cntrl_key) |
| modifiers |= ui::EF_CONTROL_DOWN; |
| if (e.opt_key) |
| modifiers |= ui::EF_ALT_DOWN; |
| |
| for (const auto& accelerator_entry : accelerators) { |
| unichar character; |
| unichar shifted_character; |
| const int vkey_code = ui::MacKeyCodeForWindowsKeyCode( |
| accelerator_entry.keycode, accelerator_entry.modifiers, |
| &shifted_character, &character); |
| |
| EXPECT_FALSE(modifiers == accelerator_entry.modifiers && |
| e.chrome_command == accelerator_entry.command_id && |
| e.vkey_code == vkey_code) |
| << "Duplicate command: " << accelerator_entry.command_id |
| << " in table " << table_name; |
| } |
| } |
| } |
| |
| } // namespace |
| |
| // On macOS, accelerator handling is done by CommandDispatcher. The only |
| // accelerators allowed to appear in AcceleratorTable are those that don't |
| // have any modifiers, and thus cannot be interpreted as macOS |
| // keyEquivalents. |
| TEST(AcceleratorTableTest, CheckMacOSAccelerators) { |
| for (const auto& entry : GetAcceleratorList()) |
| EXPECT_EQ(0, entry.modifiers); |
| } |
| |
| // Verifies that we're not processing any duplicate accelerators in |
| // global_keyboard_shortcuts_mac.mm functions. Note that the bulk of |
| // accelerators are defined in MainMenu.xib. We do not check that there is no |
| // overlap with that. |
| TEST(AcceleratorTableTest, CheckNoDuplicatesGlobalKeyboardShortcutsMac) { |
| VerifyTableDoesntHaveDuplicates(GetShortcutsNotPresentInMainMenu(), |
| "ShortcutsNotPresentInMainMenu"); |
| } |