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

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

Powered by Google App Engine
This is Rietveld 408576698