summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/extensions/extension_action.cc95
-rw-r--r--chrome/browser/extensions/extension_action.h6
-rw-r--r--chrome/browser/extensions/extension_action_manager_unittest.cc8
-rw-r--r--chrome/browser/extensions/extension_action_storage_manager.cc46
-rw-r--r--chrome/browser/ui/cocoa/location_bar/page_action_decoration.mm11
-rw-r--r--chrome/browser/ui/extensions/extension_action_view_controller.cc12
-rw-r--r--chrome/browser/ui/views/location_bar/page_action_with_badge_view.cc4
-rw-r--r--chrome/common/extensions/api/extension_action/action_info.cc20
-rw-r--r--chrome/common/extensions/api/extension_action/browser_action_manifest_unittest.cc32
-rw-r--r--extensions/common/constants.cc9
-rw-r--r--extensions/common/constants.h14
-rw-r--r--extensions/common/manifest_handler_helpers.cc21
-rw-r--r--extensions/common/manifest_handler_helpers.h5
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