Chromium Code Reviews| 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 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 83 const std::string& id) { | 83 const std::string& id) { |
| 84 accelerator_to_id_[accelerator] = id; | 84 accelerator_to_id_[accelerator] = id; |
| 85 } | 85 } |
| 86 | 86 |
| 87 std::string GetAndClearCommands() { | 87 std::string GetAndClearCommands() { |
| 88 std::string commands; | 88 std::string commands; |
| 89 std::swap(commands, commands_); | 89 std::swap(commands, commands_); |
| 90 return commands; | 90 return commands; |
| 91 } | 91 } |
| 92 | 92 |
| 93 void OnAcceleratorsRegistered( | |
| 94 const std::vector<ui::Accelerator>& accelerators) override { | |
| 95 for (auto iter = accelerators.begin(); iter != accelerators.end(); ++iter) | |
| 96 OnAcceleratorRegistered(*iter); | |
| 97 } | |
| 98 | |
| 99 void OnAcceleratorsUnregistered( | |
| 100 std::vector<ui::Accelerator>& accelerators) override { | |
| 101 for (auto iter = accelerators.begin(); iter != accelerators.end(); ++iter) | |
| 102 OnAcceleratorUnregistered(*iter); | |
| 103 } | |
| 93 // AcceleratorManagerDelegate: | 104 // AcceleratorManagerDelegate: |
|
mfomitchev
2016/12/22 21:18:55
The comment should be preceeding the first method
thanhph
2016/12/24 18:52:16
Done, cool!
| |
| 94 void OnAcceleratorRegistered(const Accelerator& accelerator) override { | 105 void OnAcceleratorRegistered(const Accelerator& accelerator) override { |
| 95 if (!commands_.empty()) | 106 if (!commands_.empty()) |
| 96 commands_ += " "; | 107 commands_ += " "; |
| 97 commands_ += "Register " + accelerator_to_id_[accelerator]; | 108 commands_ += "Register " + accelerator_to_id_[accelerator]; |
| 98 } | 109 } |
| 99 void OnAcceleratorUnregistered(const Accelerator& accelerator) override { | 110 void OnAcceleratorUnregistered(const Accelerator& accelerator) override { |
| 100 if (!commands_.empty()) | 111 if (!commands_.empty()) |
| 101 commands_ += " "; | 112 commands_ += " "; |
| 102 commands_ += "Unregister " + accelerator_to_id_[accelerator]; | 113 commands_ += "Unregister " + accelerator_to_id_[accelerator]; |
| 103 } | 114 } |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 118 | 129 |
| 119 protected: | 130 protected: |
| 120 TestAcceleratorManagerDelegate delegate_; | 131 TestAcceleratorManagerDelegate delegate_; |
| 121 AcceleratorManager manager_; | 132 AcceleratorManager manager_; |
| 122 }; | 133 }; |
| 123 | 134 |
| 124 TEST_F(AcceleratorManagerTest, Register) { | 135 TEST_F(AcceleratorManagerTest, Register) { |
| 125 const Accelerator accelerator_a(VKEY_A, EF_NONE); | 136 const Accelerator accelerator_a(VKEY_A, EF_NONE); |
| 126 TestTarget target; | 137 TestTarget target; |
| 127 delegate_.SetIdForAccelerator(accelerator_a, "a"); | 138 delegate_.SetIdForAccelerator(accelerator_a, "a"); |
| 128 manager_.Register(accelerator_a, AcceleratorManager::kNormalPriority, | 139 const std::vector<ui::Accelerator>& accelerators = {accelerator_a}; |
| 129 &target); | 140 manager_.Register(accelerators, AcceleratorManager::kNormalPriority, &target); |
| 130 EXPECT_EQ("Register a", delegate_.GetAndClearCommands()); | 141 EXPECT_EQ("Register a", delegate_.GetAndClearCommands()); |
| 131 | 142 |
| 132 // The registered accelerator is processed. | 143 // The registered accelerator is processed. |
| 133 EXPECT_TRUE(manager_.Process(accelerator_a)); | 144 EXPECT_TRUE(manager_.Process(accelerator_a)); |
| 134 EXPECT_EQ(1, target.accelerator_pressed_count()); | 145 EXPECT_EQ(1, target.accelerator_pressed_count()); |
| 135 } | 146 } |
| 136 | 147 |
| 137 TEST_F(AcceleratorManagerTest, RegisterMultipleTarget) { | 148 TEST_F(AcceleratorManagerTest, RegisterMultipleTarget) { |
| 138 const Accelerator accelerator_a(VKEY_A, EF_NONE); | 149 const Accelerator accelerator_a(VKEY_A, EF_NONE); |
| 139 delegate_.SetIdForAccelerator(accelerator_a, "a"); | 150 delegate_.SetIdForAccelerator(accelerator_a, "a"); |
| 140 TestTarget target1; | 151 TestTarget target1; |
| 141 manager_.Register(accelerator_a, AcceleratorManager::kNormalPriority, | 152 const std::vector<ui::Accelerator>& accelerators = {accelerator_a}; |
| 153 manager_.Register(accelerators, AcceleratorManager::kNormalPriority, | |
| 142 &target1); | 154 &target1); |
| 143 EXPECT_EQ("Register a", delegate_.GetAndClearCommands()); | 155 EXPECT_EQ("Register a", delegate_.GetAndClearCommands()); |
| 144 TestTarget target2; | 156 TestTarget target2; |
| 145 manager_.Register(accelerator_a, AcceleratorManager::kNormalPriority, | 157 manager_.Register(accelerators, AcceleratorManager::kNormalPriority, |
| 146 &target2); | 158 &target2); |
| 147 // Registering the same command shouldn't notify the delegate. | 159 // Registering the same command shouldn't notify the delegate. |
| 148 EXPECT_TRUE(delegate_.GetAndClearCommands().empty()); | 160 EXPECT_TRUE(delegate_.GetAndClearCommands().empty()); |
| 149 | 161 |
| 150 // If multiple targets are registered with the same accelerator, the target | 162 // If multiple targets are registered with the same accelerator, the target |
| 151 // registered later processes the accelerator. | 163 // registered later processes the accelerator. |
| 152 EXPECT_TRUE(manager_.Process(accelerator_a)); | 164 EXPECT_TRUE(manager_.Process(accelerator_a)); |
| 153 EXPECT_EQ(0, target1.accelerator_pressed_count()); | 165 EXPECT_EQ(0, target1.accelerator_pressed_count()); |
| 154 EXPECT_EQ(1, target2.accelerator_pressed_count()); | 166 EXPECT_EQ(1, target2.accelerator_pressed_count()); |
| 155 } | 167 } |
| 156 | 168 |
| 157 TEST_F(AcceleratorManagerTest, Unregister) { | 169 TEST_F(AcceleratorManagerTest, Unregister) { |
| 158 const Accelerator accelerator_a(VKEY_A, EF_NONE); | 170 const Accelerator accelerator_a(VKEY_A, EF_NONE); |
| 159 delegate_.SetIdForAccelerator(accelerator_a, "a"); | 171 delegate_.SetIdForAccelerator(accelerator_a, "a"); |
| 160 TestTarget target; | 172 TestTarget target; |
| 161 manager_.Register(accelerator_a, AcceleratorManager::kNormalPriority, | 173 |
| 162 &target); | |
| 163 EXPECT_EQ("Register a", delegate_.GetAndClearCommands()); | |
| 164 const Accelerator accelerator_b(VKEY_B, EF_NONE); | 174 const Accelerator accelerator_b(VKEY_B, EF_NONE); |
| 165 delegate_.SetIdForAccelerator(accelerator_b, "b"); | 175 delegate_.SetIdForAccelerator(accelerator_b, "b"); |
| 166 manager_.Register(accelerator_b, AcceleratorManager::kNormalPriority, | 176 |
| 167 &target); | 177 const std::vector<ui::Accelerator>& accelerators = {accelerator_a, |
| 168 EXPECT_EQ("Register b", delegate_.GetAndClearCommands()); | 178 accelerator_b}; |
| 179 | |
| 180 manager_.Register(accelerators, AcceleratorManager::kNormalPriority, &target); | |
| 181 | |
| 182 EXPECT_EQ("Register a Register b", delegate_.GetAndClearCommands()); | |
| 169 | 183 |
| 170 // Unregistering a different accelerator does not affect the other | 184 // Unregistering a different accelerator does not affect the other |
| 171 // accelerator. | 185 // accelerator. |
| 172 manager_.Unregister(accelerator_b, &target); | 186 manager_.Unregister(accelerator_b, &target); |
| 173 EXPECT_EQ("Unregister b", delegate_.GetAndClearCommands()); | 187 EXPECT_EQ("Unregister b", delegate_.GetAndClearCommands()); |
| 174 EXPECT_TRUE(manager_.Process(accelerator_a)); | 188 EXPECT_TRUE(manager_.Process(accelerator_a)); |
| 175 EXPECT_EQ(1, target.accelerator_pressed_count()); | 189 EXPECT_EQ(1, target.accelerator_pressed_count()); |
| 176 | 190 |
| 177 // The unregistered accelerator is no longer processed. | 191 // The unregistered accelerator is no longer processed. |
| 178 target.set_accelerator_pressed_count(0); | 192 target.set_accelerator_pressed_count(0); |
| 179 manager_.Unregister(accelerator_a, &target); | 193 manager_.Unregister(accelerator_a, &target); |
| 180 EXPECT_EQ("Unregister a", delegate_.GetAndClearCommands()); | 194 EXPECT_EQ("Unregister a", delegate_.GetAndClearCommands()); |
| 181 EXPECT_FALSE(manager_.Process(accelerator_a)); | 195 EXPECT_FALSE(manager_.Process(accelerator_a)); |
| 182 EXPECT_EQ(0, target.accelerator_pressed_count()); | 196 EXPECT_EQ(0, target.accelerator_pressed_count()); |
| 183 } | 197 } |
| 184 | 198 |
| 185 TEST_F(AcceleratorManagerTest, UnregisterAll) { | 199 TEST_F(AcceleratorManagerTest, UnregisterAll) { |
| 186 const Accelerator accelerator_a(VKEY_A, EF_NONE); | 200 const Accelerator accelerator_a(VKEY_A, EF_NONE); |
| 187 delegate_.SetIdForAccelerator(accelerator_a, "a"); | 201 delegate_.SetIdForAccelerator(accelerator_a, "a"); |
| 188 TestTarget target1; | 202 TestTarget target1; |
| 189 manager_.Register(accelerator_a, AcceleratorManager::kNormalPriority, | 203 |
| 190 &target1); | |
| 191 const Accelerator accelerator_b(VKEY_B, EF_NONE); | 204 const Accelerator accelerator_b(VKEY_B, EF_NONE); |
| 192 delegate_.SetIdForAccelerator(accelerator_b, "b"); | 205 delegate_.SetIdForAccelerator(accelerator_b, "b"); |
| 193 manager_.Register(accelerator_b, AcceleratorManager::kNormalPriority, | 206 |
| 207 const std::vector<ui::Accelerator>& accelerators = {accelerator_a, | |
| 208 accelerator_b}; | |
| 209 | |
| 210 manager_.Register(accelerators, AcceleratorManager::kNormalPriority, | |
| 194 &target1); | 211 &target1); |
| 212 | |
| 195 const Accelerator accelerator_c(VKEY_C, EF_NONE); | 213 const Accelerator accelerator_c(VKEY_C, EF_NONE); |
| 196 delegate_.SetIdForAccelerator(accelerator_c, "c"); | 214 delegate_.SetIdForAccelerator(accelerator_c, "c"); |
| 215 | |
| 216 const std::vector<ui::Accelerator>& accelerators_2 = {accelerator_c}; | |
| 217 | |
| 197 TestTarget target2; | 218 TestTarget target2; |
| 198 manager_.Register(accelerator_c, AcceleratorManager::kNormalPriority, | 219 manager_.Register(accelerators_2, AcceleratorManager::kNormalPriority, |
| 199 &target2); | 220 &target2); |
| 221 | |
| 200 EXPECT_EQ("Register a Register b Register c", | 222 EXPECT_EQ("Register a Register b Register c", |
| 201 delegate_.GetAndClearCommands()); | 223 delegate_.GetAndClearCommands()); |
| 202 manager_.UnregisterAll(&target1); | 224 manager_.UnregisterAll(&target1); |
| 203 { | 225 { |
| 204 const std::string commands = delegate_.GetAndClearCommands(); | 226 const std::string commands = delegate_.GetAndClearCommands(); |
| 205 // Ordering is not guaranteed. | 227 // Ordering is not guaranteed. |
| 206 EXPECT_TRUE(commands == "Unregister a Unregister b" || | 228 EXPECT_TRUE(commands == "Unregister a Unregister b" || |
| 207 commands == "Unregister b Unregister a"); | 229 commands == "Unregister b Unregister a"); |
| 208 } | 230 } |
| 209 | 231 |
| 210 // All the accelerators registered for |target1| are no longer processed. | 232 // All the accelerators registered for |target1| are no longer processed. |
| 211 EXPECT_FALSE(manager_.Process(accelerator_a)); | 233 EXPECT_FALSE(manager_.Process(accelerator_a)); |
| 212 EXPECT_FALSE(manager_.Process(accelerator_b)); | 234 EXPECT_FALSE(manager_.Process(accelerator_b)); |
| 213 EXPECT_EQ(0, target1.accelerator_pressed_count()); | 235 EXPECT_EQ(0, target1.accelerator_pressed_count()); |
| 214 | 236 |
| 215 // UnregisterAll with a different target does not affect the other target. | 237 // UnregisterAll with a different target does not affect the other target. |
| 216 EXPECT_TRUE(manager_.Process(accelerator_c)); | 238 EXPECT_TRUE(manager_.Process(accelerator_c)); |
| 217 EXPECT_EQ(1, target2.accelerator_pressed_count()); | 239 EXPECT_EQ(1, target2.accelerator_pressed_count()); |
| 218 } | 240 } |
| 219 | 241 |
| 220 TEST_F(AcceleratorManagerTest, Process) { | 242 TEST_F(AcceleratorManagerTest, Process) { |
| 221 TestTarget target; | 243 TestTarget target; |
| 222 | 244 |
| 223 // Test all cases of possible modifiers. | 245 // Test all cases of possible modifiers. |
| 224 for (size_t i = 0; i < (1 << arraysize(kAcceleratorModifiers)); ++i) { | 246 for (size_t i = 0; i < (1 << arraysize(kAcceleratorModifiers)); ++i) { |
| 225 const int modifiers = BuildAcceleratorModifier(i); | 247 const int modifiers = BuildAcceleratorModifier(i); |
| 226 Accelerator accelerator(GetAccelerator(VKEY_A, modifiers)); | 248 Accelerator accelerator(GetAccelerator(VKEY_A, modifiers)); |
| 227 manager_.Register(accelerator, AcceleratorManager::kNormalPriority, | 249 const std::vector<ui::Accelerator>& accelerators = {accelerator}; |
| 250 manager_.Register(accelerators, AcceleratorManager::kNormalPriority, | |
| 228 &target); | 251 &target); |
| 229 | 252 |
| 230 // The registered accelerator is processed. | 253 // The registered accelerator is processed. |
| 231 const int last_count = target.accelerator_pressed_count(); | 254 const int last_count = target.accelerator_pressed_count(); |
| 232 EXPECT_TRUE(manager_.Process(accelerator)) << i; | 255 EXPECT_TRUE(manager_.Process(accelerator)) << i; |
| 233 EXPECT_EQ(last_count + 1, target.accelerator_pressed_count()) << i; | 256 EXPECT_EQ(last_count + 1, target.accelerator_pressed_count()) << i; |
| 234 | 257 |
| 235 // The non-registered accelerators are not processed. | 258 // The non-registered accelerators are not processed. |
| 236 accelerator.set_type(ET_UNKNOWN); | 259 accelerator.set_type(ET_UNKNOWN); |
| 237 EXPECT_FALSE(manager_.Process(accelerator)) << i; // different type | 260 EXPECT_FALSE(manager_.Process(accelerator)) << i; // different type |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 260 manager_.UnregisterAll(&target); | 283 manager_.UnregisterAll(&target); |
| 261 } | 284 } |
| 262 } | 285 } |
| 263 | 286 |
| 264 // Verifies delegate is notifed correctly when unregistering and registering | 287 // Verifies delegate is notifed correctly when unregistering and registering |
| 265 // with the same accelerator. | 288 // with the same accelerator. |
| 266 TEST_F(AcceleratorManagerTest, Reregister) { | 289 TEST_F(AcceleratorManagerTest, Reregister) { |
| 267 const Accelerator accelerator_a(VKEY_A, EF_NONE); | 290 const Accelerator accelerator_a(VKEY_A, EF_NONE); |
| 268 TestTarget target; | 291 TestTarget target; |
| 269 delegate_.SetIdForAccelerator(accelerator_a, "a"); | 292 delegate_.SetIdForAccelerator(accelerator_a, "a"); |
| 270 manager_.Register(accelerator_a, AcceleratorManager::kNormalPriority, | 293 const std::vector<ui::Accelerator>& accelerators = {accelerator_a}; |
| 271 &target); | 294 manager_.Register(accelerators, AcceleratorManager::kNormalPriority, &target); |
| 272 EXPECT_EQ("Register a", delegate_.GetAndClearCommands()); | 295 EXPECT_EQ("Register a", delegate_.GetAndClearCommands()); |
| 273 manager_.UnregisterAll(&target); | 296 manager_.UnregisterAll(&target); |
| 274 EXPECT_EQ("Unregister a", delegate_.GetAndClearCommands()); | 297 EXPECT_EQ("Unregister a", delegate_.GetAndClearCommands()); |
| 275 manager_.Register(accelerator_a, AcceleratorManager::kNormalPriority, | 298 manager_.Register(accelerators, AcceleratorManager::kNormalPriority, &target); |
| 276 &target); | |
| 277 EXPECT_EQ("Register a", delegate_.GetAndClearCommands()); | 299 EXPECT_EQ("Register a", delegate_.GetAndClearCommands()); |
| 278 } | 300 } |
| 279 | 301 |
| 280 } // namespace test | 302 } // namespace test |
| 281 } // namespace ui | 303 } // namespace ui |
| OLD | NEW |