| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ui/base/accelerators/accelerator_manager.h" | 5 #include "ui/base/accelerators/accelerator_manager.h" |
| 6 | 6 |
| 7 #include <map> | 7 #include <map> |
| 8 | 8 |
| 9 #include "base/compiler_specific.h" | 9 #include "base/compiler_specific.h" |
| 10 #include "base/macros.h" | 10 #include "base/macros.h" |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 64 int result = 0; | 64 int result = 0; |
| 65 for (size_t i = 0; i < arraysize(kAcceleratorModifiers); ++i) { | 65 for (size_t i = 0; i < arraysize(kAcceleratorModifiers); ++i) { |
| 66 if (((1 << i) & id) != 0) | 66 if (((1 << i) & id) != 0) |
| 67 result |= kAcceleratorModifiers[i]; | 67 result |= kAcceleratorModifiers[i]; |
| 68 } | 68 } |
| 69 return result; | 69 return result; |
| 70 } | 70 } |
| 71 | 71 |
| 72 // AcceleratorManagerDelegate implementation that records calls to interface | 72 // AcceleratorManagerDelegate implementation that records calls to interface |
| 73 // using the following format. | 73 // using the following format. |
| 74 // . OnAcceleratorRegistered() -> 'Register ' + id | 74 // . OnAcceleratorsRegistered() -> A list of "'Register ' + <id>" separated by |
| 75 // . OnAcceleratorRegistered() -> 'Unregister' + id | 75 // whitespaces. |
| 76 // . OnAcceleratorUnregistered() -> 'Unregister' + id |
| 76 // where the id is specified using SetIdForAccelerator(). | 77 // where the id is specified using SetIdForAccelerator(). |
| 77 class TestAcceleratorManagerDelegate : public AcceleratorManagerDelegate { | 78 class TestAcceleratorManagerDelegate : public AcceleratorManagerDelegate { |
| 78 public: | 79 public: |
| 79 TestAcceleratorManagerDelegate() {} | 80 TestAcceleratorManagerDelegate() {} |
| 80 ~TestAcceleratorManagerDelegate() override {} | 81 ~TestAcceleratorManagerDelegate() override {} |
| 81 | 82 |
| 82 void SetIdForAccelerator(const Accelerator& accelerator, | 83 void SetIdForAccelerator(const Accelerator& accelerator, |
| 83 const std::string& id) { | 84 const std::string& id) { |
| 84 accelerator_to_id_[accelerator] = id; | 85 accelerator_to_id_[accelerator] = id; |
| 85 } | 86 } |
| 86 | 87 |
| 87 std::string GetAndClearCommands() { | 88 std::string GetAndClearCommands() { |
| 88 std::string commands; | 89 std::string commands; |
| 89 std::swap(commands, commands_); | 90 std::swap(commands, commands_); |
| 90 return commands; | 91 return commands; |
| 91 } | 92 } |
| 92 | 93 |
| 93 // AcceleratorManagerDelegate: | 94 // AcceleratorManagerDelegate: |
| 94 void OnAcceleratorRegistered(const Accelerator& accelerator) override { | 95 void OnAcceleratorsRegistered( |
| 95 if (!commands_.empty()) | 96 const std::vector<Accelerator>& accelerators) override { |
| 96 commands_ += " "; | 97 for (const Accelerator& accelerator : accelerators) { |
| 97 commands_ += "Register " + accelerator_to_id_[accelerator]; | 98 if (!commands_.empty()) |
| 99 commands_ += " "; |
| 100 commands_ += "Register " + accelerator_to_id_[accelerator]; |
| 101 } |
| 98 } | 102 } |
| 99 void OnAcceleratorUnregistered(const Accelerator& accelerator) override { | 103 void OnAcceleratorUnregistered(const Accelerator& accelerator) override { |
| 100 if (!commands_.empty()) | 104 if (!commands_.empty()) |
| 101 commands_ += " "; | 105 commands_ += " "; |
| 102 commands_ += "Unregister " + accelerator_to_id_[accelerator]; | 106 commands_ += "Unregister " + accelerator_to_id_[accelerator]; |
| 103 } | 107 } |
| 104 | 108 |
| 105 private: | 109 private: |
| 106 std::map<Accelerator, std::string> accelerator_to_id_; | 110 std::map<Accelerator, std::string> accelerator_to_id_; |
| 107 std::string commands_; | 111 std::string commands_; |
| 108 | 112 |
| 109 DISALLOW_COPY_AND_ASSIGN(TestAcceleratorManagerDelegate); | 113 DISALLOW_COPY_AND_ASSIGN(TestAcceleratorManagerDelegate); |
| 110 }; | 114 }; |
| 111 | 115 |
| 112 } // namespace | 116 } // namespace |
| 113 | 117 |
| 114 class AcceleratorManagerTest : public testing::Test { | 118 class AcceleratorManagerTest : public testing::Test { |
| 115 public: | 119 public: |
| 116 AcceleratorManagerTest() : manager_(&delegate_) {} | 120 AcceleratorManagerTest() : manager_(&delegate_) {} |
| 117 ~AcceleratorManagerTest() override {} | 121 ~AcceleratorManagerTest() override {} |
| 118 | 122 |
| 119 protected: | 123 protected: |
| 120 TestAcceleratorManagerDelegate delegate_; | 124 TestAcceleratorManagerDelegate delegate_; |
| 121 AcceleratorManager manager_; | 125 AcceleratorManager manager_; |
| 122 }; | 126 }; |
| 123 | 127 |
| 124 TEST_F(AcceleratorManagerTest, Register) { | 128 TEST_F(AcceleratorManagerTest, Register) { |
| 129 TestTarget target; |
| 125 const Accelerator accelerator_a(VKEY_A, EF_NONE); | 130 const Accelerator accelerator_a(VKEY_A, EF_NONE); |
| 126 TestTarget target; | |
| 127 delegate_.SetIdForAccelerator(accelerator_a, "a"); | 131 delegate_.SetIdForAccelerator(accelerator_a, "a"); |
| 128 manager_.Register(accelerator_a, AcceleratorManager::kNormalPriority, | |
| 129 &target); | |
| 130 EXPECT_EQ("Register a", delegate_.GetAndClearCommands()); | |
| 131 | 132 |
| 132 // The registered accelerator is processed. | 133 const Accelerator accelerator_b(VKEY_B, EF_NONE); |
| 134 delegate_.SetIdForAccelerator(accelerator_b, "b"); |
| 135 |
| 136 const Accelerator accelerator_c(VKEY_C, EF_NONE); |
| 137 delegate_.SetIdForAccelerator(accelerator_c, "c"); |
| 138 |
| 139 const Accelerator accelerator_d(VKEY_D, EF_NONE); |
| 140 delegate_.SetIdForAccelerator(accelerator_d, "d"); |
| 141 |
| 142 manager_.Register( |
| 143 {accelerator_a, accelerator_b, accelerator_c, accelerator_d}, |
| 144 AcceleratorManager::kNormalPriority, &target); |
| 145 EXPECT_EQ("Register a Register b Register c Register d", |
| 146 delegate_.GetAndClearCommands()); |
| 147 |
| 148 // The registered accelerators are processed. |
| 133 EXPECT_TRUE(manager_.Process(accelerator_a)); | 149 EXPECT_TRUE(manager_.Process(accelerator_a)); |
| 134 EXPECT_EQ(1, target.accelerator_pressed_count()); | 150 EXPECT_TRUE(manager_.Process(accelerator_b)); |
| 151 EXPECT_TRUE(manager_.Process(accelerator_c)); |
| 152 EXPECT_TRUE(manager_.Process(accelerator_d)); |
| 153 EXPECT_EQ(4, target.accelerator_pressed_count()); |
| 135 } | 154 } |
| 136 | 155 |
| 137 TEST_F(AcceleratorManagerTest, RegisterMultipleTarget) { | 156 TEST_F(AcceleratorManagerTest, RegisterMultipleTarget) { |
| 138 const Accelerator accelerator_a(VKEY_A, EF_NONE); | 157 const Accelerator accelerator_a(VKEY_A, EF_NONE); |
| 139 delegate_.SetIdForAccelerator(accelerator_a, "a"); | 158 delegate_.SetIdForAccelerator(accelerator_a, "a"); |
| 140 TestTarget target1; | 159 TestTarget target1; |
| 141 manager_.Register(accelerator_a, AcceleratorManager::kNormalPriority, | 160 manager_.Register({accelerator_a}, AcceleratorManager::kNormalPriority, |
| 142 &target1); | 161 &target1); |
| 143 EXPECT_EQ("Register a", delegate_.GetAndClearCommands()); | 162 EXPECT_EQ("Register a", delegate_.GetAndClearCommands()); |
| 144 TestTarget target2; | 163 TestTarget target2; |
| 145 manager_.Register(accelerator_a, AcceleratorManager::kNormalPriority, | 164 manager_.Register({accelerator_a}, AcceleratorManager::kNormalPriority, |
| 146 &target2); | 165 &target2); |
| 147 // Registering the same command shouldn't notify the delegate. | 166 // Registering the same command shouldn't notify the delegate. |
| 148 EXPECT_TRUE(delegate_.GetAndClearCommands().empty()); | 167 EXPECT_TRUE(delegate_.GetAndClearCommands().empty()); |
| 149 | 168 |
| 150 // If multiple targets are registered with the same accelerator, the target | 169 // If multiple targets are registered with the same accelerator, the target |
| 151 // registered later processes the accelerator. | 170 // registered later processes the accelerator. |
| 152 EXPECT_TRUE(manager_.Process(accelerator_a)); | 171 EXPECT_TRUE(manager_.Process(accelerator_a)); |
| 153 EXPECT_EQ(0, target1.accelerator_pressed_count()); | 172 EXPECT_EQ(0, target1.accelerator_pressed_count()); |
| 154 EXPECT_EQ(1, target2.accelerator_pressed_count()); | 173 EXPECT_EQ(1, target2.accelerator_pressed_count()); |
| 155 } | 174 } |
| 156 | 175 |
| 157 TEST_F(AcceleratorManagerTest, Unregister) { | 176 TEST_F(AcceleratorManagerTest, Unregister) { |
| 158 const Accelerator accelerator_a(VKEY_A, EF_NONE); | 177 const Accelerator accelerator_a(VKEY_A, EF_NONE); |
| 159 delegate_.SetIdForAccelerator(accelerator_a, "a"); | 178 delegate_.SetIdForAccelerator(accelerator_a, "a"); |
| 160 TestTarget target; | 179 TestTarget target; |
| 161 manager_.Register(accelerator_a, AcceleratorManager::kNormalPriority, | |
| 162 &target); | |
| 163 EXPECT_EQ("Register a", delegate_.GetAndClearCommands()); | |
| 164 const Accelerator accelerator_b(VKEY_B, EF_NONE); | 180 const Accelerator accelerator_b(VKEY_B, EF_NONE); |
| 165 delegate_.SetIdForAccelerator(accelerator_b, "b"); | 181 delegate_.SetIdForAccelerator(accelerator_b, "b"); |
| 166 manager_.Register(accelerator_b, AcceleratorManager::kNormalPriority, | 182 manager_.Register({accelerator_a, accelerator_b}, |
| 167 &target); | 183 AcceleratorManager::kNormalPriority, &target); |
| 168 EXPECT_EQ("Register b", delegate_.GetAndClearCommands()); | 184 EXPECT_EQ("Register a Register b", delegate_.GetAndClearCommands()); |
| 169 | 185 |
| 170 // Unregistering a different accelerator does not affect the other | 186 // Unregistering a different accelerator does not affect the other |
| 171 // accelerator. | 187 // accelerator. |
| 172 manager_.Unregister(accelerator_b, &target); | 188 manager_.Unregister(accelerator_b, &target); |
| 173 EXPECT_EQ("Unregister b", delegate_.GetAndClearCommands()); | 189 EXPECT_EQ("Unregister b", delegate_.GetAndClearCommands()); |
| 174 EXPECT_TRUE(manager_.Process(accelerator_a)); | 190 EXPECT_TRUE(manager_.Process(accelerator_a)); |
| 175 EXPECT_EQ(1, target.accelerator_pressed_count()); | 191 EXPECT_EQ(1, target.accelerator_pressed_count()); |
| 176 | 192 |
| 177 // The unregistered accelerator is no longer processed. | 193 // The unregistered accelerator is no longer processed. |
| 178 target.set_accelerator_pressed_count(0); | 194 target.set_accelerator_pressed_count(0); |
| 179 manager_.Unregister(accelerator_a, &target); | 195 manager_.Unregister(accelerator_a, &target); |
| 180 EXPECT_EQ("Unregister a", delegate_.GetAndClearCommands()); | 196 EXPECT_EQ("Unregister a", delegate_.GetAndClearCommands()); |
| 181 EXPECT_FALSE(manager_.Process(accelerator_a)); | 197 EXPECT_FALSE(manager_.Process(accelerator_a)); |
| 182 EXPECT_EQ(0, target.accelerator_pressed_count()); | 198 EXPECT_EQ(0, target.accelerator_pressed_count()); |
| 183 } | 199 } |
| 184 | 200 |
| 185 TEST_F(AcceleratorManagerTest, UnregisterAll) { | 201 TEST_F(AcceleratorManagerTest, UnregisterAll) { |
| 186 const Accelerator accelerator_a(VKEY_A, EF_NONE); | 202 const Accelerator accelerator_a(VKEY_A, EF_NONE); |
| 187 delegate_.SetIdForAccelerator(accelerator_a, "a"); | 203 delegate_.SetIdForAccelerator(accelerator_a, "a"); |
| 188 TestTarget target1; | 204 TestTarget target1; |
| 189 manager_.Register(accelerator_a, AcceleratorManager::kNormalPriority, | |
| 190 &target1); | |
| 191 const Accelerator accelerator_b(VKEY_B, EF_NONE); | 205 const Accelerator accelerator_b(VKEY_B, EF_NONE); |
| 192 delegate_.SetIdForAccelerator(accelerator_b, "b"); | 206 delegate_.SetIdForAccelerator(accelerator_b, "b"); |
| 193 manager_.Register(accelerator_b, AcceleratorManager::kNormalPriority, | 207 manager_.Register({accelerator_a, accelerator_b}, |
| 194 &target1); | 208 AcceleratorManager::kNormalPriority, &target1); |
| 195 const Accelerator accelerator_c(VKEY_C, EF_NONE); | 209 const Accelerator accelerator_c(VKEY_C, EF_NONE); |
| 196 delegate_.SetIdForAccelerator(accelerator_c, "c"); | 210 delegate_.SetIdForAccelerator(accelerator_c, "c"); |
| 197 TestTarget target2; | 211 TestTarget target2; |
| 198 manager_.Register(accelerator_c, AcceleratorManager::kNormalPriority, | 212 manager_.Register({accelerator_c}, AcceleratorManager::kNormalPriority, |
| 199 &target2); | 213 &target2); |
| 200 EXPECT_EQ("Register a Register b Register c", | 214 EXPECT_EQ("Register a Register b Register c", |
| 201 delegate_.GetAndClearCommands()); | 215 delegate_.GetAndClearCommands()); |
| 202 manager_.UnregisterAll(&target1); | 216 manager_.UnregisterAll(&target1); |
| 203 { | 217 { |
| 204 const std::string commands = delegate_.GetAndClearCommands(); | 218 const std::string commands = delegate_.GetAndClearCommands(); |
| 205 // Ordering is not guaranteed. | 219 // Ordering is not guaranteed. |
| 206 EXPECT_TRUE(commands == "Unregister a Unregister b" || | 220 EXPECT_TRUE(commands == "Unregister a Unregister b" || |
| 207 commands == "Unregister b Unregister a"); | 221 commands == "Unregister b Unregister a"); |
| 208 } | 222 } |
| 209 | 223 |
| 210 // All the accelerators registered for |target1| are no longer processed. | 224 // All the accelerators registered for |target1| are no longer processed. |
| 211 EXPECT_FALSE(manager_.Process(accelerator_a)); | 225 EXPECT_FALSE(manager_.Process(accelerator_a)); |
| 212 EXPECT_FALSE(manager_.Process(accelerator_b)); | 226 EXPECT_FALSE(manager_.Process(accelerator_b)); |
| 213 EXPECT_EQ(0, target1.accelerator_pressed_count()); | 227 EXPECT_EQ(0, target1.accelerator_pressed_count()); |
| 214 | 228 |
| 215 // UnregisterAll with a different target does not affect the other target. | 229 // UnregisterAll with a different target does not affect the other target. |
| 216 EXPECT_TRUE(manager_.Process(accelerator_c)); | 230 EXPECT_TRUE(manager_.Process(accelerator_c)); |
| 217 EXPECT_EQ(1, target2.accelerator_pressed_count()); | 231 EXPECT_EQ(1, target2.accelerator_pressed_count()); |
| 218 } | 232 } |
| 219 | 233 |
| 220 TEST_F(AcceleratorManagerTest, Process) { | 234 TEST_F(AcceleratorManagerTest, Process) { |
| 221 TestTarget target; | 235 TestTarget target; |
| 222 | 236 |
| 223 // Test all cases of possible modifiers. | 237 // Test all cases of possible modifiers. |
| 224 for (size_t i = 0; i < (1 << arraysize(kAcceleratorModifiers)); ++i) { | 238 for (size_t i = 0; i < (1 << arraysize(kAcceleratorModifiers)); ++i) { |
| 225 const int modifiers = BuildAcceleratorModifier(i); | 239 const int modifiers = BuildAcceleratorModifier(i); |
| 226 Accelerator accelerator(GetAccelerator(VKEY_A, modifiers)); | 240 Accelerator accelerator(GetAccelerator(VKEY_A, modifiers)); |
| 227 manager_.Register(accelerator, AcceleratorManager::kNormalPriority, | 241 manager_.Register({accelerator}, AcceleratorManager::kNormalPriority, |
| 228 &target); | 242 &target); |
| 229 | 243 |
| 230 // The registered accelerator is processed. | 244 // The registered accelerator is processed. |
| 231 const int last_count = target.accelerator_pressed_count(); | 245 const int last_count = target.accelerator_pressed_count(); |
| 232 EXPECT_TRUE(manager_.Process(accelerator)) << i; | 246 EXPECT_TRUE(manager_.Process(accelerator)) << i; |
| 233 EXPECT_EQ(last_count + 1, target.accelerator_pressed_count()) << i; | 247 EXPECT_EQ(last_count + 1, target.accelerator_pressed_count()) << i; |
| 234 | 248 |
| 235 // The non-registered accelerators are not processed. | 249 // The non-registered accelerators are not processed. |
| 236 accelerator.set_type(ET_UNKNOWN); | 250 accelerator.set_type(ET_UNKNOWN); |
| 237 EXPECT_FALSE(manager_.Process(accelerator)) << i; // different type | 251 EXPECT_FALSE(manager_.Process(accelerator)) << i; // different type |
| (...skipping 22 matching lines...) Expand all Loading... |
| 260 manager_.UnregisterAll(&target); | 274 manager_.UnregisterAll(&target); |
| 261 } | 275 } |
| 262 } | 276 } |
| 263 | 277 |
| 264 // Verifies delegate is notifed correctly when unregistering and registering | 278 // Verifies delegate is notifed correctly when unregistering and registering |
| 265 // with the same accelerator. | 279 // with the same accelerator. |
| 266 TEST_F(AcceleratorManagerTest, Reregister) { | 280 TEST_F(AcceleratorManagerTest, Reregister) { |
| 267 const Accelerator accelerator_a(VKEY_A, EF_NONE); | 281 const Accelerator accelerator_a(VKEY_A, EF_NONE); |
| 268 TestTarget target; | 282 TestTarget target; |
| 269 delegate_.SetIdForAccelerator(accelerator_a, "a"); | 283 delegate_.SetIdForAccelerator(accelerator_a, "a"); |
| 270 manager_.Register(accelerator_a, AcceleratorManager::kNormalPriority, | 284 manager_.Register({accelerator_a}, AcceleratorManager::kNormalPriority, |
| 271 &target); | 285 &target); |
| 272 EXPECT_EQ("Register a", delegate_.GetAndClearCommands()); | 286 EXPECT_EQ("Register a", delegate_.GetAndClearCommands()); |
| 273 manager_.UnregisterAll(&target); | 287 manager_.UnregisterAll(&target); |
| 274 EXPECT_EQ("Unregister a", delegate_.GetAndClearCommands()); | 288 EXPECT_EQ("Unregister a", delegate_.GetAndClearCommands()); |
| 275 manager_.Register(accelerator_a, AcceleratorManager::kNormalPriority, | 289 manager_.Register({accelerator_a}, AcceleratorManager::kNormalPriority, |
| 276 &target); | 290 &target); |
| 277 EXPECT_EQ("Register a", delegate_.GetAndClearCommands()); | 291 EXPECT_EQ("Register a", delegate_.GetAndClearCommands()); |
| 278 } | 292 } |
| 279 | 293 |
| 280 } // namespace test | 294 } // namespace test |
| 281 } // namespace ui | 295 } // namespace ui |
| OLD | NEW |