summaryrefslogtreecommitdiffstats
path: root/chrome/common
diff options
context:
space:
mode:
authorcira@chromium.org <cira@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-06-04 00:12:43 +0000
committercira@chromium.org <cira@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-06-04 00:12:43 +0000
commit62c5324aa1a9e1a1dd141ea14c71d885b729f9a4 (patch)
tree1a19c0220147bc07fea27e9e23630807bae05244 /chrome/common
parentb6501d3de476481309a598618b747da18219d7cd (diff)
downloadchromium_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.cc45
-rw-r--r--chrome/common/extensions/extension_file_util_unittest.cc15
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) {