diff options
author | cira@chromium.org <cira@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-06-04 00:12:43 +0000 |
---|---|---|
committer | cira@chromium.org <cira@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-06-04 00:12:43 +0000 |
commit | 62c5324aa1a9e1a1dd141ea14c71d885b729f9a4 (patch) | |
tree | 1a19c0220147bc07fea27e9e23630807bae05244 /chrome/common | |
parent | b6501d3de476481309a598618b747da18219d7cd (diff) | |
download | chromium_src-62c5324aa1a9e1a1dd141ea14c71d885b729f9a4.zip chromium_src-62c5324aa1a9e1a1dd141ea14c71d885b729f9a4.tar.gz chromium_src-62c5324aa1a9e1a1dd141ea14c71d885b729f9a4.tar.bz2 |
Don't load the user script that's not utf-8, and show UI that load failed.
BUG=41571
TEST=Try loading chrome/test/data/extensions/bad/bad_encoding extension. You should get error message about wrong encoding.
Review URL: http://codereview.chromium.org/2260006
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@48896 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/common')
-rw-r--r-- | chrome/common/extensions/extension_file_util.cc | 45 | ||||
-rw-r--r-- | chrome/common/extensions/extension_file_util_unittest.cc | 15 |
2 files changed, 49 insertions, 11 deletions
diff --git a/chrome/common/extensions/extension_file_util.cc b/chrome/common/extensions/extension_file_util.cc index 81ae50e..c25df25 100644 --- a/chrome/common/extensions/extension_file_util.cc +++ b/chrome/common/extensions/extension_file_util.cc @@ -29,6 +29,11 @@ namespace extension_file_util { // Validates locale info. Doesn't check if messages.json files are valid. static bool ValidateLocaleInfo(const Extension& extension, std::string* error); +// Returns false and sets the error if script file can't be loaded, +// or if it's not UTF-8 encoded. +static bool IsScriptValid(const FilePath& path, const FilePath& relative_path, + int message_id, std::string* error); + const char kInstallDirectoryName[] = "Extensions"; FilePath InstallExtension(const FilePath& unpacked_source_dir, @@ -163,7 +168,8 @@ bool ValidateExtension(Extension* extension, std::string* error) { return true; } - // Validate that claimed script resources actually exist. + // Validate that claimed script resources actually exist, + // and are UTF-8 encoded. for (size_t i = 0; i < extension->content_scripts().size(); ++i) { const UserScript& script = extension->content_scripts()[i]; @@ -171,24 +177,18 @@ bool ValidateExtension(Extension* extension, std::string* error) { const UserScript::File& js_script = script.js_scripts()[j]; const FilePath& path = ExtensionResource::GetFilePath( js_script.extension_root(), js_script.relative_path()); - if (!file_util::PathExists(path)) { - *error = - l10n_util::GetStringFUTF8(IDS_EXTENSION_LOAD_JAVASCRIPT_FAILED, - WideToUTF16(js_script.relative_path().ToWStringHack())); + if (!IsScriptValid(path, js_script.relative_path(), + IDS_EXTENSION_LOAD_JAVASCRIPT_FAILED, error)) return false; - } } for (size_t j = 0; j < script.css_scripts().size(); j++) { const UserScript::File& css_script = script.css_scripts()[j]; const FilePath& path = ExtensionResource::GetFilePath( css_script.extension_root(), css_script.relative_path()); - if (!file_util::PathExists(path)) { - *error = - l10n_util::GetStringFUTF8(IDS_EXTENSION_LOAD_CSS_FAILED, - WideToUTF16(css_script.relative_path().ToWStringHack())); + if (!IsScriptValid(path, css_script.relative_path(), + IDS_EXTENSION_LOAD_CSS_FAILED, error)) return false; - } } } @@ -411,6 +411,29 @@ static bool ValidateLocaleInfo(const Extension& extension, std::string* error) { return true; } +static bool IsScriptValid(const FilePath& path, + const FilePath& relative_path, + int message_id, + std::string* error) { + std::string content; + if (!file_util::PathExists(path) || + !file_util::ReadFileToString(path, &content)) { + *error = l10n_util::GetStringFUTF8( + message_id, + WideToUTF16(relative_path.ToWStringHack())); + return false; + } + + if (!IsStringUTF8(content)) { + *error = l10n_util::GetStringFUTF8( + IDS_EXTENSION_BAD_FILE_ENCODING, + WideToUTF16(relative_path.ToWStringHack())); + return false; + } + + return true; +} + bool CheckForIllegalFilenames(const FilePath& extension_path, std::string* error) { // Reserved underscore names. diff --git a/chrome/common/extensions/extension_file_util_unittest.cc b/chrome/common/extensions/extension_file_util_unittest.cc index 30be2da..9fc9d84 100644 --- a/chrome/common/extensions/extension_file_util_unittest.cc +++ b/chrome/common/extensions/extension_file_util_unittest.cc @@ -177,6 +177,21 @@ TEST(ExtensionFileUtil, LoadExtensionGivesHelpfullErrorOnBadManifest) { "Line: 2, column: 16, Syntax error.", error.c_str()); } +TEST(ExtensionFileUtil, FailLoadingNonUTF8Scripts) { + FilePath install_dir; + ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &install_dir)); + install_dir = install_dir.AppendASCII("extensions") + .AppendASCII("bad") + .AppendASCII("bad_encoding"); + + std::string error; + scoped_ptr<Extension> extension( + extension_file_util::LoadExtension(install_dir, false, &error)); + ASSERT_TRUE(extension == NULL); + ASSERT_STREQ("Could not load file 'bad_encoding.js' for content script. " + "It isn't UTF-8 encoded.", error.c_str()); +} + #define URL_PREFIX "chrome-extension://extension-id/" TEST(ExtensionFileUtil, ExtensionURLToRelativeFilePath) { |