diff options
13 files changed, 121 insertions, 162 deletions
diff --git a/chrome/browser/extensions/extension_action.cc b/chrome/browser/extensions/extension_action.cc index c6033e5..3b22254 100644 --- a/chrome/browser/extensions/extension_action.cc +++ b/chrome/browser/extensions/extension_action.cc @@ -8,6 +8,7 @@ #include "base/base64.h" #include "base/logging.h" +#include "base/strings/string_number_conversions.h" #include "extensions/browser/extension_icon_image.h" #include "extensions/browser/extension_icon_placeholder.h" #include "extensions/common/constants.h" @@ -22,6 +23,7 @@ #include "third_party/skia/include/core/SkCanvas.h" #include "third_party/skia/include/core/SkPaint.h" #include "third_party/skia/include/effects/SkGradientShader.h" +#include "ui/base/resource/material_design/material_design_controller.h" #include "ui/base/resource/resource_bundle.h" #include "ui/gfx/animation/animation_delegate.h" #include "ui/gfx/canvas.h" @@ -43,23 +45,6 @@ gfx::Image GetDefaultIcon() { IDR_EXTENSIONS_FAVICON); } -// Given the extension action type, returns the size the extension action icon -// should have. The icon should be square, so only one dimension is -// returned. -int GetIconSizeForType(extensions::ActionInfo::Type type) { - switch (type) { - case extensions::ActionInfo::TYPE_BROWSER: - case extensions::ActionInfo::TYPE_PAGE: - case extensions::ActionInfo::TYPE_SYSTEM_INDICATOR: - // TODO(dewittj) Report the actual icon size of the system - // indicator. - return extension_misc::EXTENSION_ICON_ACTION; - default: - NOTREACHED(); - return 0; - } -} - class GetAttentionImageSource : public gfx::ImageSkiaSource { public: explicit GetAttentionImageSource(const gfx::ImageSkia& icon) @@ -86,9 +71,6 @@ struct IconRepresentationInfo { ui::ScaleFactor scale; }; -const IconRepresentationInfo kIconSizes[] = {{"19", ui::SCALE_FACTOR_100P}, - {"38", ui::SCALE_FACTOR_200P}}; - template <class T> bool HasValue(const std::map<int, T>& map, int tab_id) { return map.find(tab_id) != map.end(); @@ -96,9 +78,13 @@ bool HasValue(const std::map<int, T>& map, int tab_id) { } // namespace +extension_misc::ExtensionIcons ExtensionAction::ActionIconSize() { + return ui::MaterialDesignController::IsModeMaterial() + ? extension_misc::EXTENSION_ICON_BITTY + : extension_misc::EXTENSION_ICON_ACTION; +} + const int ExtensionAction::kDefaultTabId = -1; -const int ExtensionAction::kPageActionIconMaxSize = - extension_misc::EXTENSION_ICON_ACTION; ExtensionAction::ExtensionAction(const extensions::Extension& extension, extensions::ActionInfo::Type action_type, @@ -140,14 +126,18 @@ void ExtensionAction::SetIcon(int tab_id, const gfx::Image& image) { bool ExtensionAction::ParseIconFromCanvasDictionary( const base::DictionaryValue& dict, gfx::ImageSkia* icon) { - // Try to extract an icon for each known scale. - for (size_t i = 0; i < arraysize(kIconSizes); i++) { + for (base::DictionaryValue::Iterator iter(dict); !iter.IsAtEnd(); + iter.Advance()) { + int icon_size = 0; + if (!base::StringToInt(iter.key(), &icon_size)) + continue; + const base::BinaryValue* image_data; std::string binary_string64; IPC::Message pickle; - if (dict.GetBinary(kIconSizes[i].size_string, &image_data)) { + if (iter.value().GetAsBinary(&image_data)) { pickle = IPC::Message(image_data->GetBuffer(), image_data->GetSize()); - } else if (dict.GetString(kIconSizes[i].size_string, &binary_string64)) { + } else if (iter.value().GetAsString(&binary_string64)) { std::string binary_string; if (!base::Base64Decode(binary_string64, &binary_string)) return false; @@ -155,12 +145,13 @@ bool ExtensionAction::ParseIconFromCanvasDictionary( } else { continue; } - base::PickleIterator iter(pickle); + base::PickleIterator pickle_iter(pickle); SkBitmap bitmap; - if (!IPC::ReadParam(&pickle, &iter, &bitmap)) + if (!IPC::ReadParam(&pickle, &pickle_iter, &bitmap)) return false; CHECK(!bitmap.isNull()); - float scale = ui::GetScaleForScaleFactor(kIconSizes[i].scale); + float scale = + static_cast<float>(icon_size) / ExtensionAction::ActionIconSize(); icon->AddRepresentation(gfx::ImageSkiaRep(bitmap, scale)); } return true; @@ -240,12 +231,8 @@ extensions::IconImage* ExtensionAction::LoadDefaultIconImage( content::BrowserContext* browser_context) { if (default_icon_ && !default_icon_image_) { default_icon_image_.reset(new extensions::IconImage( - browser_context, - &extension, - *default_icon(), - GetIconSizeForType(action_type_), - *GetDefaultIcon().ToImageSkia(), - nullptr)); + browser_context, &extension, *default_icon(), ActionIconSize(), + *GetDefaultIcon().ToImageSkia(), nullptr)); } return default_icon_image_.get(); } @@ -262,8 +249,8 @@ gfx::Image ExtensionAction::GetDefaultIconImage() const { // default (puzzle piece). if (extensions::FeatureSwitch::extension_action_redesign()->IsEnabled()) { placeholder_icon_image_ = - extensions::ExtensionIconPlaceholder::CreateImage( - extension_misc::EXTENSION_ICON_ACTION, extension_name_); + extensions::ExtensionIconPlaceholder::CreateImage(ActionIconSize(), + extension_name_); } else { placeholder_icon_image_ = GetDefaultIcon(); } @@ -316,32 +303,14 @@ void ExtensionAction::Populate(const extensions::Extension& extension, set_id(manifest_data.id); // Initialize the specified icon set. - if (!manifest_data.default_icon.empty()) + if (!manifest_data.default_icon.empty()) { default_icon_.reset(new ExtensionIconSet(manifest_data.default_icon)); - - const ExtensionIconSet& extension_icons = - extensions::IconsInfo::GetIcons(&extension); - // Look for any other icons. - std::string largest_icon = extension_icons.Get( - extension_misc::EXTENSION_ICON_GIGANTOR, ExtensionIconSet::MATCH_SMALLER); - - if (!largest_icon.empty()) { - // We found an icon to use, so create an icon set if one doesn't exist. - if (!default_icon_) - default_icon_.reset(new ExtensionIconSet()); - 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 = extension_misc::kNumExtensionActionIconSizes - 1; i >= 0; - --i) { - int size = extension_misc::kExtensionActionIconSizes[i].size; - if (default_icon_->Get(size, ExtensionIconSet::MATCH_BIGGER).empty() && - largest_icon_size > size) { - default_icon_->Add(size, largest_icon); - break; - } - } + } else { + // Fall back to the product icons if no action icon exists. + const ExtensionIconSet& product_icons = + extensions::IconsInfo::GetIcons(&extension); + if (!product_icons.empty()) + default_icon_.reset(new ExtensionIconSet(product_icons)); } } @@ -354,7 +323,7 @@ int ExtensionAction::GetIconWidth(int tab_id) const { // If there is a default icon, the icon width will be set depending on our // action type. if (default_icon_) - return GetIconSizeForType(action_type()); + return ActionIconSize(); // If no icon has been set and there is no default icon, we need favicon // width. diff --git a/chrome/browser/extensions/extension_action.h b/chrome/browser/extensions/extension_action.h index ff29481..866c1e4 100644 --- a/chrome/browser/extensions/extension_action.h +++ b/chrome/browser/extensions/extension_action.h @@ -12,6 +12,7 @@ #include "base/memory/scoped_ptr.h" #include "base/stl_util.h" #include "chrome/common/extensions/api/extension_action/action_info.h" +#include "extensions/common/constants.h" #include "third_party/skia/include/core/SkColor.h" #include "ui/gfx/image/image.h" @@ -47,13 +48,12 @@ class ExtensionAction { // the UI. }; + static extension_misc::ExtensionIcons ActionIconSize(); + // Use this ID to indicate the default state for properties that take a tab_id // parameter. static const int kDefaultTabId; - // Max size (both dimensions) for page actions. - static const int kPageActionIconMaxSize; - ExtensionAction(const extensions::Extension& extension, extensions::ActionInfo::Type action_type, const extensions::ActionInfo& manifest_data); diff --git a/chrome/browser/extensions/extension_action_manager_unittest.cc b/chrome/browser/extensions/extension_action_manager_unittest.cc index b29328e..d040762 100644 --- a/chrome/browser/extensions/extension_action_manager_unittest.cc +++ b/chrome/browser/extensions/extension_action_manager_unittest.cc @@ -98,9 +98,9 @@ bool ExtensionActionManagerTest::IconsMatch(const Extension& extension, const ExtensionAction& action, int action_key) { return action.default_icon()->Get(action_key, - ExtensionIconSet::MATCH_EXACTLY) == - IconsInfo::GetIcons(&extension).Get(extension_key, - ExtensionIconSet::MATCH_EXACTLY); + ExtensionIconSet::MATCH_BIGGER) == + IconsInfo::GetIcons(&extension) + .Get(extension_key, ExtensionIconSet::MATCH_EXACTLY); } ExtensionAction* ExtensionActionManagerTest::GetAction( @@ -127,7 +127,7 @@ void ExtensionActionManagerTest::TestPopulateMissingValues( ASSERT_TRUE(action); ASSERT_TRUE(TitlesMatch(*extension.get(), *action)); - ASSERT_TRUE(IconsMatch(*extension.get(), 128, *action, 38)); + ASSERT_TRUE(IconsMatch(*extension.get(), 48, *action, 38)); // Test that the action's missing default_icons are not replaced with smaller // icons. diff --git a/chrome/browser/extensions/extension_action_storage_manager.cc b/chrome/browser/extensions/extension_action_storage_manager.cc index a7de1e6..401e077 100644 --- a/chrome/browser/extensions/extension_action_storage_manager.cc +++ b/chrome/browser/extensions/extension_action_storage_manager.cc @@ -75,8 +75,7 @@ bool StringToSkBitmap(const std::string& str, SkBitmap* bitmap) { } // Conversion function for reading/writing to storage. -std::string RepresentationToString(const gfx::ImageSkia& image, float scale) { - SkBitmap bitmap = image.GetRepresentation(scale).sk_bitmap(); +std::string BitmapToString(const SkBitmap& bitmap) { SkAutoLockPixels lock_image(bitmap); std::vector<unsigned char> data; bool success = gfx::PNGCodec::EncodeBGRASkBitmap(bitmap, false, &data); @@ -95,9 +94,6 @@ void SetDefaultsFromValue(const base::DictionaryValue* dict, ExtensionAction* action) { const int kDefaultTabId = ExtensionAction::kDefaultTabId; std::string str_value; - int int_value; - SkBitmap bitmap; - gfx::ImageSkia icon; // For each value, don't set it if it has been modified already. if (dict->GetString(kPopupUrlStorageKey, &str_value) && @@ -121,9 +117,11 @@ void SetDefaultsFromValue(const base::DictionaryValue* dict, !action->HasBadgeTextColor(kDefaultTabId)) { action->SetBadgeTextColor(kDefaultTabId, RawStringToSkColor(str_value)); } - if (dict->GetInteger(kAppearanceStorageKey, &int_value) && + + int appearance_storage = 0; + if (dict->GetInteger(kAppearanceStorageKey, &appearance_storage) && !action->HasIsVisible(kDefaultTabId)) { - switch (int_value) { + switch (appearance_storage) { case INVISIBLE: case OBSOLETE_WANTS_ATTENTION: action->SetIsVisible(kDefaultTabId, false); @@ -137,13 +135,18 @@ void SetDefaultsFromValue(const base::DictionaryValue* dict, const base::DictionaryValue* icon_value = NULL; if (dict->GetDictionary(kIconStorageKey, &icon_value) && !action->HasIcon(kDefaultTabId)) { - for (size_t i = 0; i < extension_misc::kNumExtensionActionIconSizes; i++) { - const extension_misc::IconRepresentationInfo& icon_info = - extension_misc::kExtensionActionIconSizes[i]; - if (icon_value->GetString(icon_info.size_string, &str_value) && - StringToSkBitmap(str_value, &bitmap)) { + gfx::ImageSkia icon; + SkBitmap bitmap; + for (base::DictionaryValue::Iterator iter(*icon_value); !iter.IsAtEnd(); + iter.Advance()) { + int icon_size = 0; + std::string icon_string; + if (base::StringToInt(iter.key(), &icon_size) && + iter.value().GetAsString(&icon_string) && + StringToSkBitmap(icon_string, &bitmap)) { CHECK(!bitmap.isNull()); - float scale = ui::GetScaleForScaleFactor(icon_info.scale); + float scale = + static_cast<float>(icon_size) / ExtensionAction::ActionIconSize(); icon.AddRepresentation(gfx::ImageSkiaRep(bitmap, scale)); } } @@ -173,18 +176,15 @@ scoped_ptr<base::DictionaryValue> DefaultsToValue(ExtensionAction* action) { action->GetExplicitlySetIcon(kDefaultTabId).AsImageSkia(); if (!icon.isNull()) { scoped_ptr<base::DictionaryValue> icon_value(new base::DictionaryValue()); - for (size_t i = 0; i < extension_misc::kNumExtensionActionIconSizes; i++) { - const extension_misc::IconRepresentationInfo& icon_info = - extension_misc::kExtensionActionIconSizes[i]; - float scale = ui::GetScaleForScaleFactor(icon_info.scale); - if (icon.HasRepresentation(scale)) { - icon_value->SetString(icon_info.size_string, - RepresentationToString(icon, scale)); - } + std::vector<gfx::ImageSkiaRep> image_reps = icon.image_reps(); + for (const gfx::ImageSkiaRep& rep : image_reps) { + int size = static_cast<int>(rep.scale() * icon.width()); + std::string size_string = base::IntToString(size); + icon_value->SetString(size_string, BitmapToString(rep.sk_bitmap())); } - dict->Set(kIconStorageKey, icon_value.release()); + dict->Set(kIconStorageKey, icon_value.Pass()); } - return dict.Pass(); + return dict; } } // namespace diff --git a/chrome/browser/ui/cocoa/location_bar/page_action_decoration.mm b/chrome/browser/ui/cocoa/location_bar/page_action_decoration.mm index a911f4a..8a045c9 100644 --- a/chrome/browser/ui/cocoa/location_bar/page_action_decoration.mm +++ b/chrome/browser/ui/cocoa/location_bar/page_action_decoration.mm @@ -50,10 +50,9 @@ PageActionDecoration::PageActionDecoration( PageActionDecoration::~PageActionDecoration() {} -// Always |kPageActionIconMaxSize| wide. |ImageDecoration| draws the -// image centered. +// Always |ActionIconSize| wide. |ImageDecoration| draws the image centered. CGFloat PageActionDecoration::GetWidthForSpace(CGFloat width) { - return ExtensionAction::kPageActionIconMaxSize; + return ExtensionAction::ActionIconSize(); } bool PageActionDecoration::AcceptsMousePress() { @@ -93,8 +92,8 @@ void PageActionDecoration::UpdateVisibility(WebContents* contents) { SetToolTip(viewController_->GetTooltip(contents)); // Set the image. - gfx::Size size(ExtensionAction::kPageActionIconMaxSize, - ExtensionAction::kPageActionIconMaxSize); + gfx::Size size(ExtensionAction::ActionIconSize(), + ExtensionAction::ActionIconSize()); gfx::Image icon = viewController_->GetIcon(contents, size); if (!icon.IsEmpty()) { SetImage(icon.ToNSImage()); @@ -120,7 +119,7 @@ NSPoint PageActionDecoration::GetBubblePointInFrame(NSRect frame) { // easier (the middle of the centered image is the middle of the // frame). const CGFloat delta_height = - NSHeight(frame) - ExtensionAction::kPageActionIconMaxSize; + NSHeight(frame) - ExtensionAction::ActionIconSize(); const CGFloat bottom_inset = std::ceil(delta_height / 2.0); // Return a point just below the bottom of the maximal drawing area. diff --git a/chrome/browser/ui/extensions/extension_action_view_controller.cc b/chrome/browser/ui/extensions/extension_action_view_controller.cc index 2093797..fbb8ebb 100644 --- a/chrome/browser/ui/extensions/extension_action_view_controller.cc +++ b/chrome/browser/ui/extensions/extension_action_view_controller.cc @@ -27,7 +27,6 @@ #include "extensions/common/extension.h" #include "extensions/common/feature_switch.h" #include "extensions/common/manifest_constants.h" -#include "ui/base/resource/material_design/material_design_controller.h" #include "ui/gfx/image/image_skia.h" #include "ui/gfx/image/image_skia_operations.h" @@ -366,16 +365,7 @@ ExtensionActionViewController::GetIconImageSource( scoped_ptr<IconWithBadgeImageSource> image_source( new IconWithBadgeImageSource(size)); - gfx::Image icon(icon_factory_.GetIcon(tab_id)); - if (ui::MaterialDesignController::IsModeMaterial()) { - // TODO(tdanderson): Use a 16x16 icon if it exists instead of resizing. - icon = gfx::Image(gfx::ImageSkiaOperations::CreateResizedImage( - *icon.ToImageSkia(), - skia::ImageOperations::RESIZE_BEST, - gfx::Size(extension_misc::EXTENSION_ICON_BITTY, - extension_misc::EXTENSION_ICON_BITTY))); - } - image_source->SetIcon(icon); + image_source->SetIcon(icon_factory_.GetIcon(tab_id)); scoped_ptr<IconWithBadgeImageSource::Badge> badge; std::string badge_text = extension_action_->GetBadgeText(tab_id); diff --git a/chrome/browser/ui/views/location_bar/page_action_with_badge_view.cc b/chrome/browser/ui/views/location_bar/page_action_with_badge_view.cc index 5fee7a6..c0be1c9 100644 --- a/chrome/browser/ui/views/location_bar/page_action_with_badge_view.cc +++ b/chrome/browser/ui/views/location_bar/page_action_with_badge_view.cc @@ -21,8 +21,8 @@ void PageActionWithBadgeView::GetAccessibleState( } gfx::Size PageActionWithBadgeView::GetPreferredSize() const { - return gfx::Size(ExtensionAction::kPageActionIconMaxSize, - ExtensionAction::kPageActionIconMaxSize); + return gfx::Size(ExtensionAction::ActionIconSize(), + ExtensionAction::ActionIconSize()); } void PageActionWithBadgeView::UpdateVisibility(content::WebContents* contents) { diff --git a/chrome/common/extensions/api/extension_action/action_info.cc b/chrome/common/extensions/api/extension_action/action_info.cc index 8cf0386..a3be61b 100644 --- a/chrome/common/extensions/api/extension_action/action_info.cc +++ b/chrome/common/extensions/api/extension_action/action_info.cc @@ -91,25 +91,17 @@ scoped_ptr<ActionInfo> ActionInfo::Load(const Extension* extension, const base::DictionaryValue* icons_value = NULL; std::string default_icon; if (dict->GetDictionary(keys::kPageActionDefaultIcon, &icons_value)) { - int icon_sizes[extension_misc::kNumExtensionActionIconSizes]; - for (size_t i = 0u; i < extension_misc::kNumExtensionActionIconSizes; ++i) - icon_sizes[i] = extension_misc::kExtensionActionIconSizes[i].size; - if (!manifest_handler_helpers::LoadIconsFromDictionary( - icons_value, - icon_sizes, - extension_misc::kNumExtensionActionIconSizes, - &result->default_icon, - error)) { + if (!manifest_handler_helpers::LoadAllIconsFromDictionary( + icons_value, &result->default_icon, error)) { return scoped_ptr<ActionInfo>(); } } else if (dict->GetString(keys::kPageActionDefaultIcon, &default_icon) && manifest_handler_helpers::NormalizeAndValidatePath( &default_icon)) { - // Choose the most optimistic (highest) icon density - e.g. 38 not 19 - - // regardless of the actual icon resolution, whatever that happens to be. - // Code elsewhere knows how to scale 38 down to 19. - result->default_icon.Add(extension_misc::EXTENSION_ICON_ACTION * - extension_misc::kNumExtensionActionIconSizes, + // Choose the most optimistic (highest) icon density regardless of the + // actual icon resolution, whatever that happens to be. Code elsewhere + // knows how to scale down to 19. + result->default_icon.Add(extension_misc::EXTENSION_ICON_GIGANTOR, default_icon); } else { *error = base::ASCIIToUTF16(errors::kInvalidPageActionIconPath); diff --git a/chrome/common/extensions/api/extension_action/browser_action_manifest_unittest.cc b/chrome/common/extensions/api/extension_action/browser_action_manifest_unittest.cc index 4693a94..539477b 100644 --- a/chrome/common/extensions/api/extension_action/browser_action_manifest_unittest.cc +++ b/chrome/common/extensions/api/extension_action/browser_action_manifest_unittest.cc @@ -4,6 +4,7 @@ #include "chrome/common/extensions/api/extension_action/action_info.h" #include "chrome/common/extensions/manifest_tests/chrome_manifest_test.h" +#include "extensions/common/constants.h" #include "extensions/common/error_utils.h" #include "extensions/common/extension_builder.h" #include "extensions/common/extension_icon_set.h" @@ -60,23 +61,27 @@ TEST_F(BrowserActionManifestTest, const ExtensionIconSet& icons = browser_action_info->default_icon; EXPECT_EQ(1u, icons.map().size()); - EXPECT_EQ("icon.png", icons.Get(38, ExtensionIconSet::MATCH_EXACTLY)); + EXPECT_EQ("icon.png", icons.Get(extension_misc::EXTENSION_ICON_GIGANTOR, + ExtensionIconSet::MATCH_EXACTLY)); } TEST_F(BrowserActionManifestTest, BrowserActionManifestIcons_DictDefaultIcon) { + // Arbitrary sizes should be allowed (useful for various scale factors). scoped_refptr<const Extension> extension = ExtensionBuilder() - .SetManifest(DictionaryBuilder() - .Set("name", "Dictionary default icon") - .Set("version", "1.0.0") - .Set("manifest_version", 2) - .Set("browser_action", DictionaryBuilder() - .Set("default_icon", DictionaryBuilder() - .Set("19", "icon19.png") - .Set("24", "icon24.png") // Should be ignored. - .Set("38", "icon38.png")))) - .Build(); + .SetManifest( + DictionaryBuilder() + .Set("name", "Dictionary default icon") + .Set("version", "1.0.0") + .Set("manifest_version", 2) + .Set("browser_action", + DictionaryBuilder().Set("default_icon", + DictionaryBuilder() + .Set("19", "icon19.png") + .Set("24", "icon24.png") + .Set("38", "icon38.png")))) + .Build(); ASSERT_TRUE(extension.get()); const ActionInfo* browser_action_info = @@ -86,9 +91,10 @@ TEST_F(BrowserActionManifestTest, const ExtensionIconSet& icons = browser_action_info->default_icon; - // 24px icon should be ignored. - EXPECT_EQ(2u, icons.map().size()); + // 24px icon should be included. + EXPECT_EQ(3u, icons.map().size()); EXPECT_EQ("icon19.png", icons.Get(19, ExtensionIconSet::MATCH_EXACTLY)); + EXPECT_EQ("icon24.png", icons.Get(24, ExtensionIconSet::MATCH_EXACTLY)); EXPECT_EQ("icon38.png", icons.Get(38, ExtensionIconSet::MATCH_EXACTLY)); } diff --git a/extensions/common/constants.cc b/extensions/common/constants.cc index ff10df9..8d079b2 100644 --- a/extensions/common/constants.cc +++ b/extensions/common/constants.cc @@ -75,15 +75,6 @@ const int kExtensionIconSizes[] = {EXTENSION_ICON_GIGANTOR, // 512 const size_t kNumExtensionIconSizes = arraysize(kExtensionIconSizes); -const IconRepresentationInfo kExtensionActionIconSizes[] = { - { EXTENSION_ICON_ACTION, "19", ui::SCALE_FACTOR_100P }, - { 2 * EXTENSION_ICON_ACTION, "38", ui::SCALE_FACTOR_200P } -}; - -static_assert(kNumExtensionActionIconSizes == - arraysize(kExtensionActionIconSizes), - "num action icon sizes must be in sync with action icon sizes"); - const char kPdfExtensionId[] = "mhjfbmdgcfjbbpaeojofohoefgiehjai"; const char kQuickOfficeComponentExtensionId[] = "bpmcpldpdmajfigpchkicefoigmkfalc"; diff --git a/extensions/common/constants.h b/extensions/common/constants.h index 7af8701..8022896 100644 --- a/extensions/common/constants.h +++ b/extensions/common/constants.h @@ -194,20 +194,6 @@ enum ExtensionIcons { extern const int kExtensionIconSizes[]; extern const size_t kNumExtensionIconSizes; -struct IconRepresentationInfo { - // Size in pixels. - const int size; - // Size as a string that will be used to retrieve representation value from - // ExtensionAction SetIcon function arguments. - const char* const size_string; - // Scale factor for which the representation should be used. - const ui::ScaleFactor scale; -}; - -// The icon representations for extension actions. -extern const IconRepresentationInfo kExtensionActionIconSizes[]; -const size_t kNumExtensionActionIconSizes = 2u; - // The extension id of the PDF extension. extern const char kPdfExtensionId[]; diff --git a/extensions/common/manifest_handler_helpers.cc b/extensions/common/manifest_handler_helpers.cc index d3dfea6..7186321 100644 --- a/extensions/common/manifest_handler_helpers.cc +++ b/extensions/common/manifest_handler_helpers.cc @@ -59,6 +59,27 @@ bool LoadIconsFromDictionary(const base::DictionaryValue* icons_value, return true; } +bool LoadAllIconsFromDictionary(const base::DictionaryValue* icons_value, + ExtensionIconSet* icons, + base::string16* error) { + DCHECK(icons); + for (base::DictionaryValue::Iterator iterator(*icons_value); + !iterator.IsAtEnd(); iterator.Advance()) { + int size = 0; + std::string icon_path; + if (!base::StringToInt(iterator.key(), &size) || + !iterator.value().GetAsString(&icon_path) || + !NormalizeAndValidatePath(&icon_path)) { + *error = ErrorUtils::FormatErrorMessageUTF16(errors::kInvalidIconPath, + iterator.key()); + return false; + } + + icons->Add(size, icon_path); + } + return true; +} + } // namespace manifest_handler_helpers } // namespace extensions diff --git a/extensions/common/manifest_handler_helpers.h b/extensions/common/manifest_handler_helpers.h index 01fe6cc..4f88174 100644 --- a/extensions/common/manifest_handler_helpers.h +++ b/extensions/common/manifest_handler_helpers.h @@ -33,6 +33,11 @@ bool LoadIconsFromDictionary(const base::DictionaryValue* icons_value, ExtensionIconSet* icons, base::string16* error); +// As above, but loads all icons in |icons_value|. +bool LoadAllIconsFromDictionary(const base::DictionaryValue* icons_value, + ExtensionIconSet* icons, + base::string16* error); + } // namespace manifest_handler_helpers } // namespace extensions |