Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(226)

Side by Side Diff: chrome/browser/extensions/api/commands/command_service.cc

Issue 299393002: Use ExtensionRegistryObserver instead of deprecated extension notification from c/b/extension (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 "chrome/browser/extensions/api/commands/command_service.h" 5 #include "chrome/browser/extensions/api/commands/command_service.h"
6 6
7 #include <vector> 7 #include <vector>
8 8
9 #include "base/lazy_instance.h" 9 #include "base/lazy_instance.h"
10 #include "base/prefs/scoped_user_pref_update.h" 10 #include "base/prefs/scoped_user_pref_update.h"
(...skipping 15 matching lines...) Expand all
26 #include "content/public/browser/notification_details.h" 26 #include "content/public/browser/notification_details.h"
27 #include "content/public/browser/notification_service.h" 27 #include "content/public/browser/notification_service.h"
28 #include "extensions/browser/extension_function_registry.h" 28 #include "extensions/browser/extension_function_registry.h"
29 #include "extensions/browser/extension_prefs.h" 29 #include "extensions/browser/extension_prefs.h"
30 #include "extensions/browser/extension_registry.h" 30 #include "extensions/browser/extension_registry.h"
31 #include "extensions/browser/extension_system.h" 31 #include "extensions/browser/extension_system.h"
32 #include "extensions/common/feature_switch.h" 32 #include "extensions/common/feature_switch.h"
33 #include "extensions/common/manifest_constants.h" 33 #include "extensions/common/manifest_constants.h"
34 #include "extensions/common/permissions/permissions_data.h" 34 #include "extensions/common/permissions/permissions_data.h"
35 35
36 using extensions::Extension; 36 namespace extensions {
37 using extensions::ExtensionPrefs;
38 using extensions::SettingsOverrides;
39 using extensions::UIOverrides;
40
41 namespace { 37 namespace {
42 38
43 const char kExtension[] = "extension"; 39 const char kExtension[] = "extension";
44 const char kCommandName[] = "command_name"; 40 const char kCommandName[] = "command_name";
45 const char kGlobal[] = "global"; 41 const char kGlobal[] = "global";
46 42
47 // A preference that indicates that the initial keybindings for the given 43 // A preference that indicates that the initial keybindings for the given
48 // extension have been set. 44 // extension have been set.
49 const char kInitialBindingsHaveBeenAssigned[] = "initial_keybindings_set"; 45 const char kInitialBindingsHaveBeenAssigned[] = "initial_keybindings_set";
50 46
51 std::string GetPlatformKeybindingKeyForAccelerator( 47 std::string GetPlatformKeybindingKeyForAccelerator(
52 const ui::Accelerator& accelerator, const std::string extension_id) { 48 const ui::Accelerator& accelerator, const std::string extension_id) {
53 std::string key = extensions::Command::CommandPlatform() + ":" + 49 std::string key = Command::CommandPlatform() + ":" +
54 extensions::Command::AcceleratorToString(accelerator); 50 Command::AcceleratorToString(accelerator);
55 51
56 // Media keys have a 1-to-many relationship with targets, unlike regular 52 // Media keys have a 1-to-many relationship with targets, unlike regular
57 // shortcut (1-to-1 relationship). That means two or more extensions can 53 // shortcut (1-to-1 relationship). That means two or more extensions can
58 // register for the same media key so the extension ID needs to be added to 54 // register for the same media key so the extension ID needs to be added to
59 // the key to make sure the key is unique. 55 // the key to make sure the key is unique.
60 if (extensions::Command::IsMediaKey(accelerator)) 56 if (Command::IsMediaKey(accelerator))
61 key += ":" + extension_id; 57 key += ":" + extension_id;
62 58
63 return key; 59 return key;
64 } 60 }
65 61
66 bool IsForCurrentPlatform(const std::string& key) { 62 bool IsForCurrentPlatform(const std::string& key) {
67 return StartsWithASCII( 63 return StartsWithASCII(key, Command::CommandPlatform() + ":", true);
68 key, extensions::Command::CommandPlatform() + ":", true);
69 } 64 }
70 65
71 void SetInitialBindingsHaveBeenAssigned( 66 void SetInitialBindingsHaveBeenAssigned(
72 ExtensionPrefs* prefs, const std::string& extension_id) { 67 ExtensionPrefs* prefs, const std::string& extension_id) {
73 prefs->UpdateExtensionPref(extension_id, kInitialBindingsHaveBeenAssigned, 68 prefs->UpdateExtensionPref(extension_id, kInitialBindingsHaveBeenAssigned,
74 new base::FundamentalValue(true)); 69 new base::FundamentalValue(true));
75 } 70 }
76 71
77 bool InitialBindingsHaveBeenAssigned( 72 bool InitialBindingsHaveBeenAssigned(
78 const ExtensionPrefs* prefs, const std::string& extension_id) { 73 const ExtensionPrefs* prefs, const std::string& extension_id) {
79 bool assigned = false; 74 bool assigned = false;
80 if (!prefs || !prefs->ReadPrefAsBoolean(extension_id, 75 if (!prefs || !prefs->ReadPrefAsBoolean(extension_id,
81 kInitialBindingsHaveBeenAssigned, 76 kInitialBindingsHaveBeenAssigned,
82 &assigned)) 77 &assigned))
83 return false; 78 return false;
84 79
85 return assigned; 80 return assigned;
86 } 81 }
87 82
88 // Checks if |extension| is permitted to automatically assign the |accelerator| 83 // Checks if |extension| is permitted to automatically assign the |accelerator|
89 // key. 84 // key.
90 bool CanAutoAssign(const ui::Accelerator& accelerator, 85 bool CanAutoAssign(const ui::Accelerator& accelerator,
91 const Extension* extension, 86 const Extension* extension,
92 Profile* profile, 87 Profile* profile,
93 bool is_named_command, 88 bool is_named_command,
94 bool is_global) { 89 bool is_global) {
95 // Media Keys are non-exclusive, so allow auto-assigning them. 90 // Media Keys are non-exclusive, so allow auto-assigning them.
96 if (extensions::Command::IsMediaKey(accelerator)) 91 if (Command::IsMediaKey(accelerator))
97 return true; 92 return true;
98 93
99 if (is_global) { 94 if (is_global) {
100 if (!is_named_command) 95 if (!is_named_command)
101 return false; // Browser and page actions are not global in nature. 96 return false; // Browser and page actions are not global in nature.
102 97
103 // Global shortcuts are restricted to (Ctrl|Command)+Shift+[0-9]. 98 // Global shortcuts are restricted to (Ctrl|Command)+Shift+[0-9].
104 #if defined OS_MACOSX 99 #if defined OS_MACOSX
105 if (!accelerator.IsCmdDown()) 100 if (!accelerator.IsCmdDown())
106 return false; 101 return false;
107 #else 102 #else
108 if (!accelerator.IsCtrlDown()) 103 if (!accelerator.IsCtrlDown())
109 return false; 104 return false;
110 #endif 105 #endif
111 if (!accelerator.IsShiftDown()) 106 if (!accelerator.IsShiftDown())
112 return false; 107 return false;
113 return (accelerator.key_code() >= ui::VKEY_0 && 108 return (accelerator.key_code() >= ui::VKEY_0 &&
114 accelerator.key_code() <= ui::VKEY_9); 109 accelerator.key_code() <= ui::VKEY_9);
115 } else { 110 } else {
116 // Not a global command, check if Chrome shortcut and whether 111 // Not a global command, check if Chrome shortcut and whether
117 // we can override it. 112 // we can override it.
118 if (accelerator == 113 if (accelerator == chrome::GetPrimaryChromeAcceleratorForCommandId(
119 chrome::GetPrimaryChromeAcceleratorForCommandId(IDC_BOOKMARK_PAGE) && 114 IDC_BOOKMARK_PAGE) &&
120 extensions::CommandService::RemovesBookmarkShortcut(extension)) { 115 CommandService::RemovesBookmarkShortcut(extension)) {
121 // If this check fails it either means we have an API to override a 116 // If this check fails it either means we have an API to override a
122 // key that isn't a ChromeAccelerator (and the API can therefore be 117 // key that isn't a ChromeAccelerator (and the API can therefore be
123 // deprecated) or the IsChromeAccelerator isn't consistently 118 // deprecated) or the IsChromeAccelerator isn't consistently
124 // returning true for all accelerators. 119 // returning true for all accelerators.
125 DCHECK(chrome::IsChromeAccelerator(accelerator, profile)); 120 DCHECK(chrome::IsChromeAccelerator(accelerator, profile));
126 return true; 121 return true;
127 } 122 }
128 123
129 return !chrome::IsChromeAccelerator(accelerator, profile); 124 return !chrome::IsChromeAccelerator(accelerator, profile);
130 } 125 }
131 } 126 }
132 127
133 } // namespace 128 } // namespace
134 129
135 namespace extensions {
136
137 // static 130 // static
138 void CommandService::RegisterProfilePrefs( 131 void CommandService::RegisterProfilePrefs(
139 user_prefs::PrefRegistrySyncable* registry) { 132 user_prefs::PrefRegistrySyncable* registry) {
140 registry->RegisterDictionaryPref( 133 registry->RegisterDictionaryPref(
141 prefs::kExtensionCommands, 134 prefs::kExtensionCommands,
142 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); 135 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
143 } 136 }
144 137
145 CommandService::CommandService(content::BrowserContext* context) 138 CommandService::CommandService(content::BrowserContext* context)
146 : profile_(Profile::FromBrowserContext(context)) { 139 : profile_(Profile::FromBrowserContext(context)),
140 extension_registry_observer_(this) {
147 ExtensionFunctionRegistry::GetInstance()-> 141 ExtensionFunctionRegistry::GetInstance()->
148 RegisterFunction<GetAllCommandsFunction>(); 142 RegisterFunction<GetAllCommandsFunction>();
149 143
150 registrar_.Add(this, 144 extension_registry_observer_.Add(ExtensionRegistry::Get(profile_));
151 chrome::NOTIFICATION_EXTENSION_INSTALLED_DEPRECATED,
152 content::Source<Profile>(profile_));
153 registrar_.Add(this,
154 chrome::NOTIFICATION_EXTENSION_UNINSTALLED_DEPRECATED,
155 content::Source<Profile>(profile_));
156 } 145 }
157 146
158 CommandService::~CommandService() { 147 CommandService::~CommandService() {
159 } 148 }
160 149
161 static base::LazyInstance<BrowserContextKeyedAPIFactory<CommandService> > 150 static base::LazyInstance<BrowserContextKeyedAPIFactory<CommandService> >
162 g_factory = LAZY_INSTANCE_INITIALIZER; 151 g_factory = LAZY_INSTANCE_INITIALIZER;
163 152
164 // static 153 // static
165 BrowserContextKeyedAPIFactory<CommandService>* 154 BrowserContextKeyedAPIFactory<CommandService>*
166 CommandService::GetFactoryInstance() { 155 CommandService::GetFactoryInstance() {
167 return g_factory.Pointer(); 156 return g_factory.Pointer();
168 } 157 }
169 158
170 // static 159 // static
171 CommandService* CommandService::Get(content::BrowserContext* context) { 160 CommandService* CommandService::Get(content::BrowserContext* context) {
172 return BrowserContextKeyedAPIFactory<CommandService>::Get(context); 161 return BrowserContextKeyedAPIFactory<CommandService>::Get(context);
173 } 162 }
174 163
175 // static 164 // static
176 bool CommandService::RemovesBookmarkShortcut( 165 bool CommandService::RemovesBookmarkShortcut(const Extension* extension) {
177 const extensions::Extension* extension) {
178 const UIOverrides* ui_overrides = UIOverrides::Get(extension); 166 const UIOverrides* ui_overrides = UIOverrides::Get(extension);
179 const SettingsOverrides* settings_overrides = 167 const SettingsOverrides* settings_overrides =
180 SettingsOverrides::Get(extension); 168 SettingsOverrides::Get(extension);
181 169
182 return ((settings_overrides && 170 return ((settings_overrides &&
183 SettingsOverrides::RemovesBookmarkShortcut(*settings_overrides)) || 171 SettingsOverrides::RemovesBookmarkShortcut(*settings_overrides)) ||
184 (ui_overrides && 172 (ui_overrides &&
185 UIOverrides::RemovesBookmarkShortcut(*ui_overrides))) && 173 UIOverrides::RemovesBookmarkShortcut(*ui_overrides))) &&
186 (extensions::PermissionsData::HasAPIPermission( 174 (PermissionsData::HasAPIPermission(
187 extension, 175 extension, APIPermission::kBookmarkManagerPrivate) ||
188 extensions::APIPermission::kBookmarkManagerPrivate) || 176 FeatureSwitch::enable_override_bookmarks_ui()->IsEnabled());
189 extensions::FeatureSwitch::enable_override_bookmarks_ui()->
190 IsEnabled());
191 } 177 }
192 178
193 // static 179 // static
194 bool CommandService::RemovesBookmarkOpenPagesShortcut( 180 bool CommandService::RemovesBookmarkOpenPagesShortcut(
195 const extensions::Extension* extension) { 181 const Extension* extension) {
196 const UIOverrides* ui_overrides = UIOverrides::Get(extension); 182 const UIOverrides* ui_overrides = UIOverrides::Get(extension);
197 const SettingsOverrides* settings_overrides = 183 const SettingsOverrides* settings_overrides =
198 SettingsOverrides::Get(extension); 184 SettingsOverrides::Get(extension);
199 185
200 return ((settings_overrides && 186 return ((settings_overrides &&
201 SettingsOverrides::RemovesBookmarkOpenPagesShortcut( 187 SettingsOverrides::RemovesBookmarkOpenPagesShortcut(
202 *settings_overrides)) || 188 *settings_overrides)) ||
203 (ui_overrides && 189 (ui_overrides &&
204 UIOverrides::RemovesBookmarkOpenPagesShortcut(*ui_overrides))) && 190 UIOverrides::RemovesBookmarkOpenPagesShortcut(*ui_overrides))) &&
205 (extensions::PermissionsData::HasAPIPermission( 191 (PermissionsData::HasAPIPermission(
206 extension, 192 extension, APIPermission::kBookmarkManagerPrivate) ||
207 extensions::APIPermission::kBookmarkManagerPrivate) || 193 FeatureSwitch::enable_override_bookmarks_ui()->IsEnabled());
208 extensions::FeatureSwitch::enable_override_bookmarks_ui()->
209 IsEnabled());
210 } 194 }
211 195
212 bool CommandService::GetBrowserActionCommand(const std::string& extension_id, 196 bool CommandService::GetBrowserActionCommand(const std::string& extension_id,
213 QueryType type, 197 QueryType type,
214 extensions::Command* command, 198 Command* command,
215 bool* active) const { 199 bool* active) const {
216 return GetExtensionActionCommand( 200 return GetExtensionActionCommand(
217 extension_id, type, command, active, BROWSER_ACTION); 201 extension_id, type, command, active, BROWSER_ACTION);
218 } 202 }
219 203
220 bool CommandService::GetPageActionCommand(const std::string& extension_id, 204 bool CommandService::GetPageActionCommand(const std::string& extension_id,
221 QueryType type, 205 QueryType type,
222 extensions::Command* command, 206 Command* command,
223 bool* active) const { 207 bool* active) const {
224 return GetExtensionActionCommand( 208 return GetExtensionActionCommand(
225 extension_id, type, command, active, PAGE_ACTION); 209 extension_id, type, command, active, PAGE_ACTION);
226 } 210 }
227 211
228 bool CommandService::GetNamedCommands( 212 bool CommandService::GetNamedCommands(const std::string& extension_id,
229 const std::string& extension_id, 213 QueryType type,
230 QueryType type, 214 CommandScope scope,
231 CommandScope scope, 215 CommandMap* command_map) const {
232 extensions::CommandMap* command_map) const {
233 const ExtensionSet& extensions = 216 const ExtensionSet& extensions =
234 ExtensionRegistry::Get(profile_)->enabled_extensions(); 217 ExtensionRegistry::Get(profile_)->enabled_extensions();
235 const Extension* extension = extensions.GetByID(extension_id); 218 const Extension* extension = extensions.GetByID(extension_id);
236 CHECK(extension); 219 CHECK(extension);
237 220
238 command_map->clear(); 221 command_map->clear();
239 const extensions::CommandMap* commands = 222 const CommandMap* commands = CommandsInfo::GetNamedCommands(extension);
240 CommandsInfo::GetNamedCommands(extension);
241 if (!commands) 223 if (!commands)
242 return false; 224 return false;
243 225
244 extensions::CommandMap::const_iterator iter = commands->begin(); 226 CommandMap::const_iterator iter = commands->begin();
245 for (; iter != commands->end(); ++iter) { 227 for (; iter != commands->end(); ++iter) {
246 // Look up to see if the user has overridden how the command should work. 228 // Look up to see if the user has overridden how the command should work.
247 extensions::Command saved_command = 229 Command saved_command =
248 FindCommandByName(extension_id, iter->second.command_name()); 230 FindCommandByName(extension_id, iter->second.command_name());
249 ui::Accelerator shortcut_assigned = saved_command.accelerator(); 231 ui::Accelerator shortcut_assigned = saved_command.accelerator();
250 232
251 if (type == ACTIVE_ONLY && shortcut_assigned.key_code() == ui::VKEY_UNKNOWN) 233 if (type == ACTIVE_ONLY && shortcut_assigned.key_code() == ui::VKEY_UNKNOWN)
252 continue; 234 continue;
253 235
254 extensions::Command command = iter->second; 236 Command command = iter->second;
255 if (scope != ANY_SCOPE && ((scope == GLOBAL) != saved_command.global())) 237 if (scope != ANY_SCOPE && ((scope == GLOBAL) != saved_command.global()))
256 continue; 238 continue;
257 239
258 if (shortcut_assigned.key_code() != ui::VKEY_UNKNOWN) 240 if (shortcut_assigned.key_code() != ui::VKEY_UNKNOWN)
259 command.set_accelerator(shortcut_assigned); 241 command.set_accelerator(shortcut_assigned);
260 command.set_global(saved_command.global()); 242 command.set_global(saved_command.global());
261 243
262 (*command_map)[iter->second.command_name()] = command; 244 (*command_map)[iter->second.command_name()] = command;
263 } 245 }
264 246
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
313 std::make_pair(extension_id, command_name); 295 std::make_pair(extension_id, command_name);
314 content::NotificationService::current()->Notify( 296 content::NotificationService::current()->Notify(
315 chrome::NOTIFICATION_EXTENSION_COMMAND_ADDED, 297 chrome::NOTIFICATION_EXTENSION_COMMAND_ADDED,
316 content::Source<Profile>(profile_), 298 content::Source<Profile>(profile_),
317 content::Details< 299 content::Details<
318 std::pair<const std::string, const std::string> >(&details)); 300 std::pair<const std::string, const std::string> >(&details));
319 301
320 return true; 302 return true;
321 } 303 }
322 304
323 void CommandService::Observe( 305 void CommandService::OnExtensionWillBeInstalled(
324 int type, 306 content::BrowserContext* browser_context,
325 const content::NotificationSource& source, 307 const Extension* extension,
326 const content::NotificationDetails& details) { 308 bool is_update,
327 switch (type) { 309 bool from_ephemeral,
328 case chrome::NOTIFICATION_EXTENSION_INSTALLED_DEPRECATED: 310 const std::string& old_name) {
329 AssignInitialKeybindings( 311 AssignInitialKeybindings(extension);
330 content::Details<const InstalledExtensionInfo>(details)->extension); 312 }
331 break; 313
332 case chrome::NOTIFICATION_EXTENSION_UNINSTALLED_DEPRECATED: 314 void CommandService::OnExtensionUninstalled(
333 RemoveKeybindingPrefs( 315 content::BrowserContext* browser_context,
334 content::Details<const Extension>(details)->id(), 316 const Extension* extension) {
335 std::string()); 317 RemoveKeybindingPrefs(extension->id(), std::string());
336 break;
337 default:
338 NOTREACHED();
339 break;
340 }
341 } 318 }
342 319
343 void CommandService::UpdateKeybindingPrefs(const std::string& extension_id, 320 void CommandService::UpdateKeybindingPrefs(const std::string& extension_id,
344 const std::string& command_name, 321 const std::string& command_name,
345 const std::string& keystroke) { 322 const std::string& keystroke) {
346 extensions::Command command = FindCommandByName(extension_id, command_name); 323 Command command = FindCommandByName(extension_id, command_name);
347 324
348 // The extension command might be assigned another shortcut. Remove that 325 // The extension command might be assigned another shortcut. Remove that
349 // shortcut before proceeding. 326 // shortcut before proceeding.
350 RemoveKeybindingPrefs(extension_id, command_name); 327 RemoveKeybindingPrefs(extension_id, command_name);
351 328
352 ui::Accelerator accelerator = 329 ui::Accelerator accelerator =
353 Command::StringToAccelerator(keystroke, command_name); 330 Command::StringToAccelerator(keystroke, command_name);
354 AddKeybindingPref(accelerator, extension_id, command_name, 331 AddKeybindingPref(accelerator, extension_id, command_name,
355 true, command.global()); 332 true, command.global());
356 } 333 }
357 334
358 bool CommandService::SetScope(const std::string& extension_id, 335 bool CommandService::SetScope(const std::string& extension_id,
359 const std::string& command_name, 336 const std::string& command_name,
360 bool global) { 337 bool global) {
361 extensions::Command command = FindCommandByName(extension_id, command_name); 338 Command command = FindCommandByName(extension_id, command_name);
362 if (global == command.global()) 339 if (global == command.global())
363 return false; 340 return false;
364 341
365 // Pre-existing shortcuts must be removed before proceeding because the 342 // Pre-existing shortcuts must be removed before proceeding because the
366 // handlers for global and non-global extensions are not one and the same. 343 // handlers for global and non-global extensions are not one and the same.
367 RemoveKeybindingPrefs(extension_id, command_name); 344 RemoveKeybindingPrefs(extension_id, command_name);
368 AddKeybindingPref(command.accelerator(), extension_id, 345 AddKeybindingPref(command.accelerator(), extension_id,
369 command_name, true, global); 346 command_name, true, global);
370 return true; 347 return true;
371 } 348 }
(...skipping 30 matching lines...) Expand all
402 379
403 return Command(command_name, base::string16(), shortcut, global); 380 return Command(command_name, base::string16(), shortcut, global);
404 } 381 }
405 382
406 return Command(); 383 return Command();
407 } 384 }
408 385
409 bool CommandService::GetBoundExtensionCommand( 386 bool CommandService::GetBoundExtensionCommand(
410 const std::string& extension_id, 387 const std::string& extension_id,
411 const ui::Accelerator& accelerator, 388 const ui::Accelerator& accelerator,
412 extensions::Command* command, 389 Command* command,
413 ExtensionCommandType* command_type) const { 390 ExtensionCommandType* command_type) const {
414 const ExtensionSet& extensions = 391 const Extension* extension =
415 ExtensionRegistry::Get(profile_)->enabled_extensions(); 392 ExtensionRegistry::Get(profile_)
416 const Extension* extension = extensions.GetByID(extension_id); 393 ->GetExtensionById(extension_id, ExtensionRegistry::ENABLED);
417 CHECK(extension); 394 CHECK(extension);
418 395
419 extensions::Command prospective_command; 396 Command prospective_command;
420 extensions::CommandMap command_map; 397 CommandMap command_map;
421 bool active = false; 398 bool active = false;
422 if (GetBrowserActionCommand(extension_id, 399 if (GetBrowserActionCommand(extension_id,
423 extensions::CommandService::ACTIVE_ONLY, 400 CommandService::ACTIVE_ONLY,
424 &prospective_command, 401 &prospective_command,
425 &active) && active && 402 &active) &&
426 accelerator == prospective_command.accelerator()) { 403 active && accelerator == prospective_command.accelerator()) {
427 if (command) 404 if (command)
428 *command = prospective_command; 405 *command = prospective_command;
429 if (command_type) 406 if (command_type)
430 *command_type = BROWSER_ACTION; 407 *command_type = BROWSER_ACTION;
431 return true; 408 return true;
432 } else if (GetPageActionCommand(extension_id, 409 } else if (GetPageActionCommand(extension_id,
433 extensions::CommandService::ACTIVE_ONLY, 410 CommandService::ACTIVE_ONLY,
434 &prospective_command, 411 &prospective_command,
435 &active) && active && 412 &active) &&
436 accelerator == prospective_command.accelerator()) { 413 active && accelerator == prospective_command.accelerator()) {
437 if (command) 414 if (command)
438 *command = prospective_command; 415 *command = prospective_command;
439 if (command_type) 416 if (command_type)
440 *command_type = PAGE_ACTION; 417 *command_type = PAGE_ACTION;
441 return true; 418 return true;
442 } else if (GetNamedCommands(extension_id, 419 } else if (GetNamedCommands(extension_id,
443 extensions::CommandService::ACTIVE_ONLY, 420 CommandService::ACTIVE_ONLY,
444 extensions::CommandService::REGULAR, 421 CommandService::REGULAR,
445 &command_map)) { 422 &command_map)) {
446 for (extensions::CommandMap::const_iterator it = command_map.begin(); 423 for (CommandMap::const_iterator it = command_map.begin();
447 it != command_map.end(); ++it) { 424 it != command_map.end();
425 ++it) {
448 if (accelerator == it->second.accelerator()) { 426 if (accelerator == it->second.accelerator()) {
449 if (command) 427 if (command)
450 *command = it->second; 428 *command = it->second;
451 if (command_type) 429 if (command_type)
452 *command_type = NAMED; 430 *command_type = NAMED;
453 return true; 431 return true;
454 } 432 }
455 } 433 }
456 } 434 }
457 return false; 435 return false;
458 } 436 }
459 437
460 bool CommandService::OverridesBookmarkShortcut( 438 bool CommandService::OverridesBookmarkShortcut(
461 const extensions::Extension* extension) const { 439 const Extension* extension) const {
462 return RemovesBookmarkShortcut(extension) && 440 return RemovesBookmarkShortcut(extension) &&
463 GetBoundExtensionCommand( 441 GetBoundExtensionCommand(
464 extension->id(), 442 extension->id(),
465 chrome::GetPrimaryChromeAcceleratorForCommandId(IDC_BOOKMARK_PAGE), 443 chrome::GetPrimaryChromeAcceleratorForCommandId(IDC_BOOKMARK_PAGE),
466 NULL, 444 NULL,
467 NULL); 445 NULL);
468 } 446 }
469 447
470 void CommandService::AssignInitialKeybindings(const Extension* extension) { 448 void CommandService::AssignInitialKeybindings(const Extension* extension) {
471 const extensions::CommandMap* commands = 449 const CommandMap* commands = CommandsInfo::GetNamedCommands(extension);
472 CommandsInfo::GetNamedCommands(extension);
473 if (!commands) 450 if (!commands)
474 return; 451 return;
475 452
476 ExtensionPrefs* extension_prefs = ExtensionPrefs::Get(profile_); 453 ExtensionPrefs* extension_prefs = ExtensionPrefs::Get(profile_);
477 if (InitialBindingsHaveBeenAssigned(extension_prefs, extension->id())) 454 if (InitialBindingsHaveBeenAssigned(extension_prefs, extension->id()))
478 return; 455 return;
479 SetInitialBindingsHaveBeenAssigned(extension_prefs, extension->id()); 456 SetInitialBindingsHaveBeenAssigned(extension_prefs, extension->id());
480 457
481 extensions::CommandMap::const_iterator iter = commands->begin(); 458 CommandMap::const_iterator iter = commands->begin();
482 for (; iter != commands->end(); ++iter) { 459 for (; iter != commands->end(); ++iter) {
483 const extensions::Command command = iter->second; 460 const Command command = iter->second;
484 if (CanAutoAssign(command.accelerator(), 461 if (CanAutoAssign(command.accelerator(),
485 extension, 462 extension,
486 profile_, 463 profile_,
487 true, // Is a named command. 464 true, // Is a named command.
488 command.global())) { 465 command.global())) {
489 AddKeybindingPref(command.accelerator(), 466 AddKeybindingPref(command.accelerator(),
490 extension->id(), 467 extension->id(),
491 command.command_name(), 468 command.command_name(),
492 false, // Overwriting not allowed. 469 false, // Overwriting not allowed.
493 command.global()); 470 command.global());
494 } 471 }
495 } 472 }
496 473
497 const extensions::Command* browser_action_command = 474 const Command* browser_action_command =
498 CommandsInfo::GetBrowserActionCommand(extension); 475 CommandsInfo::GetBrowserActionCommand(extension);
499 if (browser_action_command && 476 if (browser_action_command &&
500 CanAutoAssign(browser_action_command->accelerator(), 477 CanAutoAssign(browser_action_command->accelerator(),
501 extension, 478 extension,
502 profile_, 479 profile_,
503 false, // Not a named command. 480 false, // Not a named command.
504 false)) { // Not global. 481 false)) { // Not global.
505 AddKeybindingPref(browser_action_command->accelerator(), 482 AddKeybindingPref(browser_action_command->accelerator(),
506 extension->id(), 483 extension->id(),
507 browser_action_command->command_name(), 484 browser_action_command->command_name(),
508 false, // Overwriting not allowed. 485 false, // Overwriting not allowed.
509 false); // Not global. 486 false); // Not global.
510 } 487 }
511 488
512 const extensions::Command* page_action_command = 489 const Command* page_action_command =
513 CommandsInfo::GetPageActionCommand(extension); 490 CommandsInfo::GetPageActionCommand(extension);
514 if (page_action_command && 491 if (page_action_command &&
515 CanAutoAssign(page_action_command->accelerator(), 492 CanAutoAssign(page_action_command->accelerator(),
516 extension, 493 extension,
517 profile_, 494 profile_,
518 false, // Not a named command. 495 false, // Not a named command.
519 false)) { // Not global. 496 false)) { // Not global.
520 AddKeybindingPref(page_action_command->accelerator(), 497 AddKeybindingPref(page_action_command->accelerator(),
521 extension->id(), 498 extension->id(),
522 page_action_command->command_name(), 499 page_action_command->command_name(),
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
570 chrome::NOTIFICATION_EXTENSION_COMMAND_REMOVED, 547 chrome::NOTIFICATION_EXTENSION_COMMAND_REMOVED,
571 content::Source<Profile>(profile_), 548 content::Source<Profile>(profile_),
572 content::Details< 549 content::Details<
573 std::pair<const std::string, const std::string> >(&details)); 550 std::pair<const std::string, const std::string> >(&details));
574 } 551 }
575 } 552 }
576 553
577 bool CommandService::GetExtensionActionCommand( 554 bool CommandService::GetExtensionActionCommand(
578 const std::string& extension_id, 555 const std::string& extension_id,
579 QueryType query_type, 556 QueryType query_type,
580 extensions::Command* command, 557 Command* command,
581 bool* active, 558 bool* active,
582 ExtensionCommandType action_type) const { 559 ExtensionCommandType action_type) const {
583 const ExtensionSet& extensions = 560 const ExtensionSet& extensions =
584 ExtensionRegistry::Get(profile_)->enabled_extensions(); 561 ExtensionRegistry::Get(profile_)->enabled_extensions();
585 const Extension* extension = extensions.GetByID(extension_id); 562 const Extension* extension = extensions.GetByID(extension_id);
586 CHECK(extension); 563 CHECK(extension);
587 564
588 if (active) 565 if (active)
589 *active = false; 566 *active = false;
590 567
591 const extensions::Command* requested_command = NULL; 568 const Command* requested_command = NULL;
592 switch (action_type) { 569 switch (action_type) {
593 case BROWSER_ACTION: 570 case BROWSER_ACTION:
594 requested_command = CommandsInfo::GetBrowserActionCommand(extension); 571 requested_command = CommandsInfo::GetBrowserActionCommand(extension);
595 break; 572 break;
596 case PAGE_ACTION: 573 case PAGE_ACTION:
597 requested_command = CommandsInfo::GetPageActionCommand(extension); 574 requested_command = CommandsInfo::GetPageActionCommand(extension);
598 break; 575 break;
599 case NAMED: 576 case NAMED:
600 NOTREACHED(); 577 NOTREACHED();
601 return false; 578 return false;
602 } 579 }
603 if (!requested_command) 580 if (!requested_command)
604 return false; 581 return false;
605 582
606 // Look up to see if the user has overridden how the command should work. 583 // Look up to see if the user has overridden how the command should work.
607 extensions::Command saved_command = 584 Command saved_command =
608 FindCommandByName(extension_id, requested_command->command_name()); 585 FindCommandByName(extension_id, requested_command->command_name());
609 ui::Accelerator shortcut_assigned = saved_command.accelerator(); 586 ui::Accelerator shortcut_assigned = saved_command.accelerator();
610 587
611 if (active) 588 if (active)
612 *active = (shortcut_assigned.key_code() != ui::VKEY_UNKNOWN); 589 *active = (shortcut_assigned.key_code() != ui::VKEY_UNKNOWN);
613 590
614 if (query_type == ACTIVE_ONLY && 591 if (query_type == ACTIVE_ONLY &&
615 shortcut_assigned.key_code() == ui::VKEY_UNKNOWN) 592 shortcut_assigned.key_code() == ui::VKEY_UNKNOWN)
616 return false; 593 return false;
617 594
618 *command = *requested_command; 595 *command = *requested_command;
619 if (shortcut_assigned.key_code() != ui::VKEY_UNKNOWN) 596 if (shortcut_assigned.key_code() != ui::VKEY_UNKNOWN)
620 command->set_accelerator(shortcut_assigned); 597 command->set_accelerator(shortcut_assigned);
621 598
622 return true; 599 return true;
623 } 600 }
624 601
625 template <> 602 template <>
626 void 603 void
627 BrowserContextKeyedAPIFactory<CommandService>::DeclareFactoryDependencies() { 604 BrowserContextKeyedAPIFactory<CommandService>::DeclareFactoryDependencies() {
628 DependsOn(ExtensionCommandsGlobalRegistry::GetFactoryInstance()); 605 DependsOn(ExtensionCommandsGlobalRegistry::GetFactoryInstance());
629 } 606 }
630 607
631 } // namespace extensions 608 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698