| Index: chrome/common/extensions/extension_file_util.cc
|
| diff --git a/chrome/common/extensions/extension_file_util.cc b/chrome/common/extensions/extension_file_util.cc
|
| index 7b92b93bb6336ccf153094917e87e9113893edd7..4f1dbb6f0432b38b9c35233f2ea8e2ba8ccaa194 100644
|
| --- a/chrome/common/extensions/extension_file_util.cc
|
| +++ b/chrome/common/extensions/extension_file_util.cc
|
| @@ -35,6 +35,54 @@ using extensions::Extension;
|
|
|
| namespace errors = extension_manifest_errors;
|
|
|
| +namespace {
|
| +
|
| +bool ValidateExtensionIconSet(const ExtensionIconSet* icon_set,
|
| + const Extension* extension,
|
| + int error_message_id,
|
| + std::string* error) {
|
| + for (ExtensionIconSet::IconMap::const_iterator iter = icon_set->map().begin();
|
| + iter != icon_set->map().end();
|
| + ++iter) {
|
| + const FilePath path = extension->GetResource(iter->second).GetFilePath();
|
| + if (!extension_file_util::ValidateFilePath(path)) {
|
| + *error = l10n_util::GetStringFUTF8(error_message_id,
|
| + UTF8ToUTF16(iter->second));
|
| + return false;
|
| + }
|
| + }
|
| + return true;
|
| +}
|
| +
|
| +bool ValidateExtensionActionIcons(const Extension* extension,
|
| + const ExtensionAction* action,
|
| + int error_message_id,
|
| + std::string* error) {
|
| + if (!action)
|
| + return true;
|
| +
|
| + // Validate default icon set.
|
| + const ExtensionIconSet* default_icon = action->default_icon();
|
| + // Default icon may not be set.
|
| + if (default_icon &&
|
| + !ValidateExtensionIconSet(default_icon, extension, error_message_id,
|
| + error)) {
|
| + return false;
|
| + }
|
| +
|
| + // Validate page action icons's icon sets.
|
| + const std::vector<const ExtensionIconSet*>& page_action_icons =
|
| + action->page_action_icons();
|
| + for (size_t icon = 0; icon < page_action_icons.size(); ++icon) {
|
| + const ExtensionIconSet* icon_set = page_action_icons[icon];
|
| + if (!ValidateExtensionIconSet(icon_set, extension, error_message_id, error))
|
| + return false;
|
| + }
|
| + return true;
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| namespace extension_file_util {
|
|
|
| // Validates locale info. Doesn't check if messages.json files are valid.
|
| @@ -320,40 +368,14 @@ bool ValidateExtension(const Extension* extension,
|
| }
|
| }
|
|
|
| - // Validate icon location and icon file size for page actions.
|
| - ExtensionAction* page_action = extension->page_action();
|
| - if (page_action) {
|
| - std::vector<std::string> icon_paths(*page_action->icon_paths());
|
| - if (!page_action->default_icon_path().empty())
|
| - icon_paths.push_back(page_action->default_icon_path());
|
| - for (std::vector<std::string>::iterator iter = icon_paths.begin();
|
| - iter != icon_paths.end(); ++iter) {
|
| - const FilePath path = extension->GetResource(*iter).GetFilePath();
|
| - if (!ValidateFilePath(path)) {
|
| - *error =
|
| - l10n_util::GetStringFUTF8(
|
| - IDS_EXTENSION_LOAD_ICON_FOR_PAGE_ACTION_FAILED,
|
| - UTF8ToUTF16(*iter));
|
| - return false;
|
| - }
|
| - }
|
| + if (!ValidateExtensionActionIcons(extension, extension->page_action(),
|
| + IDS_EXTENSION_LOAD_ICON_FOR_PAGE_ACTION_FAILED, error)) {
|
| + return false;
|
| }
|
|
|
| - // Validate icon location and icon file size for browser actions.
|
| - // Note: browser actions don't use the icon_paths().
|
| - ExtensionAction* browser_action = extension->browser_action();
|
| - if (browser_action) {
|
| - std::string path = browser_action->default_icon_path();
|
| - if (!path.empty()) {
|
| - const FilePath file_path = extension->GetResource(path).GetFilePath();
|
| - if (!ValidateFilePath(file_path)) {
|
| - *error =
|
| - l10n_util::GetStringFUTF8(
|
| - IDS_EXTENSION_LOAD_ICON_FOR_BROWSER_ACTION_FAILED,
|
| - UTF8ToUTF16(path));
|
| - return false;
|
| - }
|
| - }
|
| + if (!ValidateExtensionActionIcons(extension, extension->browser_action(),
|
| + IDS_EXTENSION_LOAD_ICON_FOR_BROWSER_ACTION_FAILED, error)) {
|
| + return false;
|
| }
|
|
|
| // Validate that background scripts exist.
|
|
|