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