Index: extensions/common/manifest_handler_helpers.cc |
diff --git a/extensions/common/manifest_handler_helpers.cc b/extensions/common/manifest_handler_helpers.cc |
index 4dc2f6b0837f204a39a30ca28eef5d691f556714..e5271f5e2ef9dea7b70c42a68fd81f5d06ce97f3 100644 |
--- a/extensions/common/manifest_handler_helpers.cc |
+++ b/extensions/common/manifest_handler_helpers.cc |
@@ -11,8 +11,10 @@ |
#include "extensions/common/error_utils.h" |
#include "extensions/common/extension.h" |
#include "extensions/common/extension_icon_set.h" |
+#include "extensions/common/file_util.h" |
#include "extensions/common/manifest_constants.h" |
- |
+#include "grit/extensions_strings.h" |
+#include "ui/base/l10n/l10n_util.h" |
namespace extensions { |
@@ -31,7 +33,8 @@ bool NormalizeAndValidatePath(std::string* path) { |
return true; |
} |
-bool LoadIconsFromDictionary(const base::DictionaryValue* icons_value, |
+bool LoadIconsFromDictionary(Extension* extension, |
+ const base::DictionaryValue* icons_value, |
ExtensionIconSet* icons, |
base::string16* error) { |
DCHECK(icons); |
@@ -48,7 +51,21 @@ bool LoadIconsFromDictionary(const base::DictionaryValue* icons_value, |
return false; |
} |
- icons->Add(size, icon_path); |
+ // For backwards compatibility, only warn (don't error out) if an icon is |
+ // missing. Component extensions can skip this check as their icons are not |
+ // located on disk. Unpacked extensions skip this check and fail later |
+ // during validation if the file isn't present. See crbug.com/570249 |
+ if (Manifest::IsComponentLocation(extension->location()) || |
+ Manifest::IsUnpackedLocation(extension->location()) || |
+ file_util::ValidateFilePath( |
+ extension->GetResource(icon_path).GetFilePath())) { |
+ icons->Add(size, icon_path); |
+ } else { |
+ extension->AddInstallWarning(InstallWarning( |
+ l10n_util::GetStringFUTF8(IDS_EXTENSION_LOAD_ICON_FAILED, |
+ base::UTF8ToUTF16(icon_path)), |
+ std::string())); |
+ } |
} |
return true; |
} |