| Index: chrome/browser/extensions/extension_action_manager.cc
|
| diff --git a/chrome/browser/extensions/extension_action_manager.cc b/chrome/browser/extensions/extension_action_manager.cc
|
| index b4799741373788db69ca8511c2a4e6cd1c9bd681..1b334e3eba4a10fcec0496774544eca7f48765e5 100644
|
| --- a/chrome/browser/extensions/extension_action_manager.cc
|
| +++ b/chrome/browser/extensions/extension_action_manager.cc
|
| @@ -6,12 +6,13 @@
|
|
|
| #include "chrome/browser/extensions/api/system_indicator/system_indicator_manager_factory.h"
|
| #include "chrome/browser/extensions/extension_action.h"
|
| -#include "chrome/browser/extensions/extension_service.h"
|
| #include "chrome/browser/profiles/profile.h"
|
| #include "components/keyed_service/content/browser_context_dependency_manager.h"
|
| #include "extensions/browser/extension_registry.h"
|
| #include "extensions/browser/extension_system.h"
|
| #include "extensions/browser/extensions_browser_client.h"
|
| +#include "extensions/common/constants.h"
|
| +#include "extensions/common/manifest_handlers/icons_handler.h"
|
|
|
| namespace extensions {
|
|
|
| @@ -82,17 +83,55 @@ void ExtensionActionManager::OnExtensionUnloaded(
|
|
|
| namespace {
|
|
|
| +// Loads resources missing from |action| (i.e. title, icons) from the "icons"
|
| +// key of |extension|'s manifest.
|
| +void PopulateMissingValues(const Extension& extension,
|
| + ExtensionAction* action) {
|
| + const int* kIconSizes = extension_misc::kExtensionActionIconSizes;
|
| + const size_t kNumIconSizes = extension_misc::kNumExtensionActionIconSizes;
|
| +
|
| + // If the title is missing from |action|, set it to |extension|'s name.
|
| + if (action->GetTitle(ExtensionAction::kDefaultTabId).empty())
|
| + action->SetTitle(ExtensionAction::kDefaultTabId, extension.name());
|
| +
|
| + scoped_ptr<ExtensionIconSet> default_icon(new ExtensionIconSet());
|
| + if (action->default_icon())
|
| + *default_icon = *action->default_icon();
|
| +
|
| + const ExtensionIconSet& extension_icons =
|
| + extensions::IconsInfo::GetIcons(&extension);
|
| + std::string largest_icon = extension_icons.Get(
|
| + extension_misc::EXTENSION_ICON_GIGANTOR,
|
| + ExtensionIconSet::MATCH_SMALLER);
|
| +
|
| + if (!largest_icon.empty()) {
|
| + int largest_icon_size = extension_icons.GetIconSizeFromPath(largest_icon);
|
| + // Replace any missing extension action icons with the largest icon
|
| + // retrieved from |extension|'s manifest so long as the largest icon is
|
| + // larger than the current key.
|
| + for (int i = kNumIconSizes - 1; i >= 0; --i) {
|
| + int size = kIconSizes[i];
|
| + if (default_icon->Get(size, ExtensionIconSet::MATCH_BIGGER).empty()
|
| + && largest_icon_size > size) {
|
| + default_icon->Add(size, largest_icon);
|
| + break;
|
| + }
|
| + }
|
| + action->set_default_icon(default_icon.Pass());
|
| + }
|
| +}
|
| +
|
| // Returns map[extension_id] if that entry exists. Otherwise, if
|
| // action_info!=NULL, creates an ExtensionAction from it, fills in the map, and
|
| // returns that. Otherwise (action_info==NULL), returns NULL.
|
| ExtensionAction* GetOrCreateOrNull(
|
| std::map<std::string, linked_ptr<ExtensionAction> >* map,
|
| - const std::string& extension_id,
|
| + const Extension& extension,
|
| ActionInfo::Type action_type,
|
| const ActionInfo* action_info,
|
| Profile* profile) {
|
| std::map<std::string, linked_ptr<ExtensionAction> >::const_iterator it =
|
| - map->find(extension_id);
|
| + map->find(extension.id());
|
| if (it != map->end())
|
| return it->second.get();
|
| if (!action_info)
|
| @@ -101,37 +140,55 @@ ExtensionAction* GetOrCreateOrNull(
|
| // Only create action info for enabled extensions.
|
| // This avoids bugs where actions are recreated just after being removed
|
| // in response to OnExtensionUnloaded().
|
| - ExtensionService* service =
|
| - ExtensionSystem::Get(profile)->extension_service();
|
| - if (!service->GetExtensionById(extension_id, false))
|
| + if (!ExtensionRegistry::Get(profile)
|
| + ->enabled_extensions().Contains(extension.id())) {
|
| return NULL;
|
| + }
|
|
|
| linked_ptr<ExtensionAction> action(new ExtensionAction(
|
| - extension_id, action_type, *action_info));
|
| - (*map)[extension_id] = action;
|
| + extension.id(), action_type, *action_info));
|
| + (*map)[extension.id()] = action;
|
| + PopulateMissingValues(extension, action.get());
|
| return action.get();
|
| }
|
|
|
| } // namespace
|
|
|
| ExtensionAction* ExtensionActionManager::GetPageAction(
|
| - const extensions::Extension& extension) const {
|
| - return GetOrCreateOrNull(&page_actions_, extension.id(),
|
| + const Extension& extension) const {
|
| + return GetOrCreateOrNull(&page_actions_, extension,
|
| ActionInfo::TYPE_PAGE,
|
| ActionInfo::GetPageActionInfo(&extension),
|
| profile_);
|
| }
|
|
|
| ExtensionAction* ExtensionActionManager::GetBrowserAction(
|
| - const extensions::Extension& extension) const {
|
| - return GetOrCreateOrNull(&browser_actions_, extension.id(),
|
| + const Extension& extension) const {
|
| + return GetOrCreateOrNull(&browser_actions_, extension,
|
| ActionInfo::TYPE_BROWSER,
|
| ActionInfo::GetBrowserActionInfo(&extension),
|
| profile_);
|
| }
|
|
|
| +scoped_ptr<ExtensionAction> ExtensionActionManager::GetBestFitAction(
|
| + const Extension& extension,
|
| + ActionInfo::Type type) const {
|
| + const ActionInfo* info = ActionInfo::GetBrowserActionInfo(&extension);
|
| + if (!info)
|
| + info = ActionInfo::GetPageActionInfo(&extension);
|
| +
|
| + // Create a new ExtensionAction of |type| with |extension|'s ActionInfo.
|
| + // If no ActionInfo exists for |extension|, create and return a new action
|
| + // with a blank ActionInfo.
|
| + // Populate any missing values from |extension|'s manifest.
|
| + scoped_ptr<ExtensionAction> new_action(new ExtensionAction(
|
| + extension.id(), type, info ? *info : ActionInfo()));
|
| + PopulateMissingValues(extension, new_action.get());
|
| + return new_action.Pass();
|
| +}
|
| +
|
| ExtensionAction* ExtensionActionManager::GetSystemIndicator(
|
| - const extensions::Extension& extension) const {
|
| + const Extension& extension) const {
|
| // If it does not already exist, create the SystemIndicatorManager for the
|
| // given profile. This could return NULL if the system indicator area is
|
| // unavailable on the current system. If so, return NULL to signal that
|
| @@ -139,7 +196,7 @@ ExtensionAction* ExtensionActionManager::GetSystemIndicator(
|
| if (!extensions::SystemIndicatorManagerFactory::GetForProfile(profile_))
|
| return NULL;
|
|
|
| - return GetOrCreateOrNull(&system_indicators_, extension.id(),
|
| + return GetOrCreateOrNull(&system_indicators_, extension,
|
| ActionInfo::TYPE_SYSTEM_INDICATOR,
|
| ActionInfo::GetSystemIndicatorInfo(&extension),
|
| profile_);
|
|
|