| 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)) {
|
| + 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)));
|
| + }
|
| }
|
| }
|
|
|
|
|