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 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 |
|
mfomitchev
2017/01/26 23:13:57
Nit: A list of "'Register ' + <id>" separated by w
thanhph1
2017/01/27 16:18:21
Done.
| |
| 75 // . OnAcceleratorRegistered() -> 'Unregister' + id | 75 // . OnAcceleratorUnregistered() -> 'Unregister' + id |
| 76 // where the id is specified using SetIdForAccelerator(). | 76 // where the id is specified using SetIdForAccelerator(). |
| 77 class TestAcceleratorManagerDelegate : public AcceleratorManagerDelegate { | 77 class TestAcceleratorManagerDelegate : public AcceleratorManagerDelegate { |
| 78 public: | 78 public: |
| 79 TestAcceleratorManagerDelegate() {} | 79 TestAcceleratorManagerDelegate() {} |
| 80 ~TestAcceleratorManagerDelegate() override {} | 80 ~TestAcceleratorManagerDelegate() override {} |
| 81 | 81 |
| 82 void SetIdForAccelerator(const Accelerator& accelerator, | 82 void SetIdForAccelerator(const Accelerator& accelerator, |
| 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 // AcceleratorManagerDelegate: | 93 // AcceleratorManagerDelegate: |
| 94 void OnAcceleratorRegistered(const Accelerator& accelerator) override { | 94 void OnAcceleratorsRegistered( |
| 95 if (!commands_.empty()) | 95 const std::vector<ui::Accelerator>& accelerators) override { |
| 96 commands_ += " "; | 96 for (auto iter = accelerators.begin(); iter != accelerators.end(); ++iter) { |
| 97 commands_ += "Register " + accelerator_to_id_[accelerator]; | 97 if (!commands_.empty()) |
| 98 commands_ += " "; | |
| 99 commands_ += "Register " + accelerator_to_id_[*iter]; | |
| 100 } | |
| 98 } | 101 } |
| 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; | |
|
mfomitchev
2017/01/26 23:13:57
Would be good to similarly update the Register tes
thanhph1
2017/01/27 16:18:21
Done.
| |
| 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, | 180 |
| 162 &target); | |
| 163 EXPECT_EQ("Register a", delegate_.GetAndClearCommands()); | |
| 164 const Accelerator accelerator_b(VKEY_B, EF_NONE); | 181 const Accelerator accelerator_b(VKEY_B, EF_NONE); |
| 165 delegate_.SetIdForAccelerator(accelerator_b, "b"); | 182 delegate_.SetIdForAccelerator(accelerator_b, "b"); |
| 166 manager_.Register(accelerator_b, AcceleratorManager::kNormalPriority, | 183 |
| 167 &target); | 184 manager_.Register({accelerator_a, accelerator_b}, |
| 168 EXPECT_EQ("Register b", delegate_.GetAndClearCommands()); | 185 AcceleratorManager::kNormalPriority, &target); |
| 186 | |
| 187 EXPECT_EQ("Register a Register b", delegate_.GetAndClearCommands()); | |
| 169 | 188 |
| 170 // Unregistering a different accelerator does not affect the other | 189 // Unregistering a different accelerator does not affect the other |
| 171 // accelerator. | 190 // accelerator. |
| 172 manager_.Unregister(accelerator_b, &target); | 191 manager_.Unregister(accelerator_b, &target); |
| 173 EXPECT_EQ("Unregister b", delegate_.GetAndClearCommands()); | 192 EXPECT_EQ("Unregister b", delegate_.GetAndClearCommands()); |
| 174 EXPECT_TRUE(manager_.Process(accelerator_a)); | 193 EXPECT_TRUE(manager_.Process(accelerator_a)); |
| 175 EXPECT_EQ(1, target.accelerator_pressed_count()); | 194 EXPECT_EQ(1, target.accelerator_pressed_count()); |
| 176 | 195 |
| 177 // The unregistered accelerator is no longer processed. | 196 // The unregistered accelerator is no longer processed. |
| 178 target.set_accelerator_pressed_count(0); | 197 target.set_accelerator_pressed_count(0); |
| 179 manager_.Unregister(accelerator_a, &target); | 198 manager_.Unregister(accelerator_a, &target); |
| 180 EXPECT_EQ("Unregister a", delegate_.GetAndClearCommands()); | 199 EXPECT_EQ("Unregister a", delegate_.GetAndClearCommands()); |
| 181 EXPECT_FALSE(manager_.Process(accelerator_a)); | 200 EXPECT_FALSE(manager_.Process(accelerator_a)); |
| 182 EXPECT_EQ(0, target.accelerator_pressed_count()); | 201 EXPECT_EQ(0, target.accelerator_pressed_count()); |
| 183 } | 202 } |
| 184 | 203 |
| 185 TEST_F(AcceleratorManagerTest, UnregisterAll) { | 204 TEST_F(AcceleratorManagerTest, UnregisterAll) { |
| 186 const Accelerator accelerator_a(VKEY_A, EF_NONE); | 205 const Accelerator accelerator_a(VKEY_A, EF_NONE); |
| 187 delegate_.SetIdForAccelerator(accelerator_a, "a"); | 206 delegate_.SetIdForAccelerator(accelerator_a, "a"); |
| 188 TestTarget target1; | 207 TestTarget target1; |
| 189 manager_.Register(accelerator_a, AcceleratorManager::kNormalPriority, | |
| 190 &target1); | |
| 191 const Accelerator accelerator_b(VKEY_B, EF_NONE); | 208 const Accelerator accelerator_b(VKEY_B, EF_NONE); |
| 192 delegate_.SetIdForAccelerator(accelerator_b, "b"); | 209 delegate_.SetIdForAccelerator(accelerator_b, "b"); |
| 193 manager_.Register(accelerator_b, AcceleratorManager::kNormalPriority, | 210 manager_.Register({accelerator_a, accelerator_b}, |
| 194 &target1); | 211 AcceleratorManager::kNormalPriority, &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"); |
| 197 TestTarget target2; | 215 TestTarget target2; |
| 198 manager_.Register(accelerator_c, AcceleratorManager::kNormalPriority, | 216 manager_.Register({accelerator_c}, AcceleratorManager::kNormalPriority, |
| 199 &target2); | 217 &target2); |
| 200 EXPECT_EQ("Register a Register b Register c", | 218 EXPECT_EQ("Register a Register b Register c", |
| 201 delegate_.GetAndClearCommands()); | 219 delegate_.GetAndClearCommands()); |
| 202 manager_.UnregisterAll(&target1); | 220 manager_.UnregisterAll(&target1); |
| 203 { | 221 { |
| 204 const std::string commands = delegate_.GetAndClearCommands(); | 222 const std::string commands = delegate_.GetAndClearCommands(); |
| 205 // Ordering is not guaranteed. | 223 // Ordering is not guaranteed. |
| 206 EXPECT_TRUE(commands == "Unregister a Unregister b" || | 224 EXPECT_TRUE(commands == "Unregister a Unregister b" || |
| 207 commands == "Unregister b Unregister a"); | 225 commands == "Unregister b Unregister a"); |
| 208 } | 226 } |
| 209 | 227 |
| 210 // All the accelerators registered for |target1| are no longer processed. | 228 // All the accelerators registered for |target1| are no longer processed. |
| 211 EXPECT_FALSE(manager_.Process(accelerator_a)); | 229 EXPECT_FALSE(manager_.Process(accelerator_a)); |
| 212 EXPECT_FALSE(manager_.Process(accelerator_b)); | 230 EXPECT_FALSE(manager_.Process(accelerator_b)); |
| 213 EXPECT_EQ(0, target1.accelerator_pressed_count()); | 231 EXPECT_EQ(0, target1.accelerator_pressed_count()); |
| 214 | 232 |
| 215 // UnregisterAll with a different target does not affect the other target. | 233 // UnregisterAll with a different target does not affect the other target. |
| 216 EXPECT_TRUE(manager_.Process(accelerator_c)); | 234 EXPECT_TRUE(manager_.Process(accelerator_c)); |
| 217 EXPECT_EQ(1, target2.accelerator_pressed_count()); | 235 EXPECT_EQ(1, target2.accelerator_pressed_count()); |
| 218 } | 236 } |
| 219 | 237 |
| 220 TEST_F(AcceleratorManagerTest, Process) { | 238 TEST_F(AcceleratorManagerTest, Process) { |
| 221 TestTarget target; | 239 TestTarget target; |
| 222 | 240 |
| 223 // Test all cases of possible modifiers. | 241 // Test all cases of possible modifiers. |
| 224 for (size_t i = 0; i < (1 << arraysize(kAcceleratorModifiers)); ++i) { | 242 for (size_t i = 0; i < (1 << arraysize(kAcceleratorModifiers)); ++i) { |
| 225 const int modifiers = BuildAcceleratorModifier(i); | 243 const int modifiers = BuildAcceleratorModifier(i); |
| 226 Accelerator accelerator(GetAccelerator(VKEY_A, modifiers)); | 244 Accelerator accelerator(GetAccelerator(VKEY_A, modifiers)); |
| 227 manager_.Register(accelerator, AcceleratorManager::kNormalPriority, | 245 manager_.Register({accelerator}, AcceleratorManager::kNormalPriority, |
| 228 &target); | 246 &target); |
| 229 | 247 |
| 230 // The registered accelerator is processed. | 248 // The registered accelerator is processed. |
| 231 const int last_count = target.accelerator_pressed_count(); | 249 const int last_count = target.accelerator_pressed_count(); |
| 232 EXPECT_TRUE(manager_.Process(accelerator)) << i; | 250 EXPECT_TRUE(manager_.Process(accelerator)) << i; |
| 233 EXPECT_EQ(last_count + 1, target.accelerator_pressed_count()) << i; | 251 EXPECT_EQ(last_count + 1, target.accelerator_pressed_count()) << i; |
| 234 | 252 |
| 235 // The non-registered accelerators are not processed. | 253 // The non-registered accelerators are not processed. |
| 236 accelerator.set_type(ET_UNKNOWN); | 254 accelerator.set_type(ET_UNKNOWN); |
| 237 EXPECT_FALSE(manager_.Process(accelerator)) << i; // different type | 255 EXPECT_FALSE(manager_.Process(accelerator)) << i; // different type |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 260 manager_.UnregisterAll(&target); | 278 manager_.UnregisterAll(&target); |
| 261 } | 279 } |
| 262 } | 280 } |
| 263 | 281 |
| 264 // Verifies delegate is notifed correctly when unregistering and registering | 282 // Verifies delegate is notifed correctly when unregistering and registering |
| 265 // with the same accelerator. | 283 // with the same accelerator. |
| 266 TEST_F(AcceleratorManagerTest, Reregister) { | 284 TEST_F(AcceleratorManagerTest, Reregister) { |
| 267 const Accelerator accelerator_a(VKEY_A, EF_NONE); | 285 const Accelerator accelerator_a(VKEY_A, EF_NONE); |
| 268 TestTarget target; | 286 TestTarget target; |
| 269 delegate_.SetIdForAccelerator(accelerator_a, "a"); | 287 delegate_.SetIdForAccelerator(accelerator_a, "a"); |
| 270 manager_.Register(accelerator_a, AcceleratorManager::kNormalPriority, | 288 manager_.Register({accelerator_a}, AcceleratorManager::kNormalPriority, |
| 271 &target); | 289 &target); |
| 272 EXPECT_EQ("Register a", delegate_.GetAndClearCommands()); | 290 EXPECT_EQ("Register a", delegate_.GetAndClearCommands()); |
| 273 manager_.UnregisterAll(&target); | 291 manager_.UnregisterAll(&target); |
| 274 EXPECT_EQ("Unregister a", delegate_.GetAndClearCommands()); | 292 EXPECT_EQ("Unregister a", delegate_.GetAndClearCommands()); |
| 275 manager_.Register(accelerator_a, AcceleratorManager::kNormalPriority, | 293 manager_.Register({accelerator_a}, AcceleratorManager::kNormalPriority, |
| 276 &target); | 294 &target); |
| 277 EXPECT_EQ("Register a", delegate_.GetAndClearCommands()); | 295 EXPECT_EQ("Register a", delegate_.GetAndClearCommands()); |
| 278 } | 296 } |
| 279 | 297 |
| 280 } // namespace test | 298 } // namespace test |
| 281 } // namespace ui | 299 } // namespace ui |
| OLD | NEW |