Index: chrome/common/extensions/extension.cc |
diff --git a/chrome/common/extensions/extension.cc b/chrome/common/extensions/extension.cc |
index a2aa3c53f4739bb8a9065d004473bec9e7a8fe94..dcb4566ff44327ad51a03f190e0973841101b3bb 100644 |
--- a/chrome/common/extensions/extension.cc |
+++ b/chrome/common/extensions/extension.cc |
@@ -133,6 +133,36 @@ static void ConvertHexadecimalToIDAlphabet(std::string* id) { |
} |
} |
+bool LoadIconsFromDictionary(const DictionaryValue* icons_value, |
+ const int* icon_sizes, |
+ size_t num_icon_sizes, |
+ ExtensionIconSet* icons, |
+ string16* error) { |
+ DCHECK(icons); |
+ for (size_t i = 0; i < num_icon_sizes; ++i) { |
+ std::string key = base::IntToString(icon_sizes[i]); |
+ if (icons_value->HasKey(key)) { |
+ std::string icon_path; |
+ if (!icons_value->GetString(key, &icon_path)) { |
+ *error = ExtensionErrorUtils::FormatErrorMessageUTF16( |
+ errors::kInvalidIconPath, key); |
+ return false; |
+ } |
+ |
+ if (!icon_path.empty() && icon_path[0] == '/') |
+ icon_path = icon_path.substr(1); |
+ |
+ if (icon_path.empty()) { |
+ *error = ExtensionErrorUtils::FormatErrorMessageUTF16( |
+ errors::kInvalidIconPath, key); |
+ return false; |
+ } |
+ icons->Add(icon_sizes[i], icon_path); |
+ } |
+ } |
+ return true; |
+} |
+ |
// A singleton object containing global data needed by the extension objects. |
class ExtensionConfig { |
public: |
@@ -828,7 +858,9 @@ scoped_ptr<ExtensionAction> Extension::LoadExtensionActionHelper( |
return scoped_ptr<ExtensionAction>(); |
} |
- result->icon_paths()->push_back(path); |
+ scoped_ptr<ExtensionIconSet> icon_set(new ExtensionIconSet); |
+ icon_set->Add(extension_misc::EXTENSION_ICON_ACTION, path); |
+ result->AddPageActionIcon(icon_set.release()); |
} |
} |
@@ -842,16 +874,36 @@ scoped_ptr<ExtensionAction> Extension::LoadExtensionActionHelper( |
} |
} |
- std::string default_icon; |
- // Read the page action |default_icon| (optional). |
- if (extension_action->HasKey(keys::kPageActionDefaultIcon)) { |
+ if (extension_action->HasKey(keys::kPageActionDefaultIconSet)) { |
tbarzic
2012/08/30 18:06:45
I'm not too content with the name here ("default_i
|
+ const DictionaryValue* icons_value = NULL; |
+ if (!extension_action->GetDictionary(keys::kPageActionDefaultIconSet, |
+ &icons_value)) { |
+ *error = ASCIIToUTF16(errors::kInvalidIcons); |
+ return scoped_ptr<ExtensionAction>(); |
+ } |
+ |
+ scoped_ptr<ExtensionIconSet> default_icons(new ExtensionIconSet()); |
+ if (!LoadIconsFromDictionary(icons_value, |
+ extension_misc::kExtensionActionIconSizes, |
+ extension_misc::kNumExtensionActionIconSizes, |
+ default_icons.get(), |
+ error)) { |
+ return scoped_ptr<ExtensionAction>(); |
+ } |
+ |
+ result->set_default_icon(default_icons.release()); |
+ } else if (extension_action->HasKey(keys::kPageActionDefaultIcon)) { |
+ // Read the page action |default_icon| (optional). |
+ std::string default_icon; |
if (!extension_action->GetString(keys::kPageActionDefaultIcon, |
&default_icon) || |
default_icon.empty()) { |
*error = ASCIIToUTF16(errors::kInvalidPageActionIconPath); |
return scoped_ptr<ExtensionAction>(); |
} |
- result->set_default_icon_path(default_icon); |
+ scoped_ptr<ExtensionIconSet> icon_set(new ExtensionIconSet); |
+ icon_set->Add(extension_misc::EXTENSION_ICON_ACTION, default_icon); |
+ result->set_default_icon(icon_set.release()); |
} |
// Read the page action title from |default_title| if present, |name| if not |
@@ -1423,29 +1475,11 @@ bool Extension::LoadIcons(string16* error) { |
return false; |
} |
- for (size_t i = 0; i < extension_misc::kNumExtensionIconSizes; ++i) { |
- std::string key = |
- base::IntToString(extension_misc::kExtensionIconSizes[i]); |
- if (icons_value->HasKey(key)) { |
- std::string icon_path; |
- if (!icons_value->GetString(key, &icon_path)) { |
- *error = ExtensionErrorUtils::FormatErrorMessageUTF16( |
- errors::kInvalidIconPath, key); |
- return false; |
- } |
- |
- if (!icon_path.empty() && icon_path[0] == '/') |
- icon_path = icon_path.substr(1); |
- |
- if (icon_path.empty()) { |
- *error = ExtensionErrorUtils::FormatErrorMessageUTF16( |
- errors::kInvalidIconPath, key); |
- return false; |
- } |
- icons_.Add(extension_misc::kExtensionIconSizes[i], icon_path); |
- } |
- } |
- return true; |
+ return LoadIconsFromDictionary(icons_value, |
+ extension_misc::kExtensionIconSizes, |
+ extension_misc::kNumExtensionIconSizes, |
+ &icons_, |
+ error); |
} |
bool Extension::LoadCommands(string16* error) { |
@@ -2369,20 +2403,26 @@ bool Extension::LoadScriptBadge(string16* error) { |
} |
script_badge_->SetTitle(ExtensionAction::kDefaultTabId, name()); |
- if (!script_badge_->default_icon_path().empty()) { |
+ if (script_badge_->default_icon()) { |
install_warnings_.push_back( |
InstallWarning(InstallWarning::FORMAT_TEXT, |
errors::kScriptBadgeIconIgnored)); |
} |
- std::string icon16_path = icons().Get(extension_misc::EXTENSION_ICON_BITTY, |
- ExtensionIconSet::MATCH_EXACTLY); |
- if (!icon16_path.empty()) { |
- script_badge_->set_default_icon_path(icon16_path); |
+ |
+ scoped_ptr<ExtensionIconSet> icon_set(new ExtensionIconSet); |
+ |
+ for (size_t i = 0; i < extension_misc::kNumScriptBadgeIconSizes; i++) { |
+ std::string path = icons().Get(extension_misc::kScriptBadgeIconSizes[i], |
+ ExtensionIconSet::MATCH_EXACTLY); |
+ if (!path.empty()) { |
+ icon_set->Add(extension_misc::kScriptBadgeIconSizes[i], path); |
+ } |
+ } |
+ |
+ if (!icon_set->map().empty()) { |
+ script_badge_->set_default_icon(icon_set.release()); |
} else { |
- script_badge_->SetIcon( |
- ExtensionAction::kDefaultTabId, |
- ui::ResourceBundle::GetSharedInstance().GetImageNamed( |
- IDR_EXTENSIONS_FAVICON)); |
+ script_badge_->set_default_icon(NULL); |
} |
return true; |
@@ -3214,19 +3254,29 @@ std::set<FilePath> Extension::GetBrowserImages() const { |
// Page action icons. |
if (page_action()) { |
- std::vector<std::string>* icon_paths = page_action()->icon_paths(); |
- for (std::vector<std::string>::iterator iter = icon_paths->begin(); |
- iter != icon_paths->end(); ++iter) { |
- image_paths.insert(FilePath::FromWStringHack(UTF8ToWide(*iter))); |
+ const std::vector<const ExtensionIconSet*>& page_action_icons = |
+ page_action()->page_action_icons(); |
+ for (size_t icon = 0; icon < page_action_icons.size(); icon++) { |
+ for (ExtensionIconSet::IconMap::const_iterator iter = |
+ page_action_icons[icon]->map().begin(); |
+ iter != page_action_icons[icon]->map().end(); |
+ ++iter) { |
+ image_paths.insert(FilePath::FromWStringHack(UTF8ToWide(iter->second))); |
+ } |
} |
} |
// Browser action icons. |
if (browser_action()) { |
- std::vector<std::string>* icon_paths = browser_action()->icon_paths(); |
- for (std::vector<std::string>::iterator iter = icon_paths->begin(); |
- iter != icon_paths->end(); ++iter) { |
- image_paths.insert(FilePath::FromWStringHack(UTF8ToWide(*iter))); |
+ const std::vector<const ExtensionIconSet*>& page_action_icons = |
+ browser_action()->page_action_icons(); |
+ for (size_t icon = 0; icon < page_action_icons.size(); icon++) { |
+ for (ExtensionIconSet::IconMap::const_iterator iter = |
+ page_action_icons[icon]->map().begin(); |
+ iter != page_action_icons[icon]->map().end(); |
+ ++iter) { |
+ image_paths.insert(FilePath::FromWStringHack(UTF8ToWide(iter->second))); |
+ } |
} |
} |