| Index: chrome/common/extensions/extension_manifests_unittest.cc
|
| diff --git a/chrome/common/extensions/extension_manifests_unittest.cc b/chrome/common/extensions/extension_manifests_unittest.cc
|
| index 367cd3c9e0d9760d98b2fe323b10ce81134aadec..7c41fd51edaf981e776548bdbccfe9ffe2ffb59a 100644
|
| --- a/chrome/common/extensions/extension_manifests_unittest.cc
|
| +++ b/chrome/common/extensions/extension_manifests_unittest.cc
|
| @@ -48,8 +48,8 @@ class ExtensionManifestTest : public testing::Test {
|
| ExtensionManifestTest() : enable_apps_(true) {}
|
|
|
| protected:
|
| - DictionaryValue* LoadManifestFile(const std::string& filename,
|
| - std::string* error) {
|
| + static DictionaryValue* LoadManifestFile(const std::string& filename,
|
| + std::string* error) {
|
| FilePath path;
|
| PathService::Get(chrome::DIR_TEST_DATA, &path);
|
| path = path.AppendASCII("extensions")
|
| @@ -61,70 +61,59 @@ class ExtensionManifestTest : public testing::Test {
|
| return static_cast<DictionaryValue*>(serializer.Deserialize(NULL, error));
|
| }
|
|
|
| - scoped_refptr<Extension> LoadExtensionWithLocation(
|
| - DictionaryValue* value,
|
| - Extension::Location location,
|
| - bool strict_error_checks,
|
| - std::string* error) {
|
| - FilePath path;
|
| - PathService::Get(chrome::DIR_TEST_DATA, &path);
|
| - path = path.AppendASCII("extensions").AppendASCII("manifest_tests");
|
| - int flags = Extension::NO_FLAGS;
|
| - if (strict_error_checks)
|
| - flags |= Extension::STRICT_ERROR_CHECKS;
|
| - return Extension::Create(path.DirName(), location, *value, flags, error);
|
| - }
|
| + // Helper class that simplifies creating methods that take either a filename
|
| + // to a manifest or the manifest itself.
|
| + class Manifest {
|
| + public:
|
| + // Purposely not marked explicit for convenience. The vast majority of
|
| + // callers pass string literal.
|
| + Manifest(const char* name)
|
| + : name_(name), manifest_(NULL) {
|
| + }
|
| + Manifest(DictionaryValue* manifest, const char* name)
|
| + : name_(name), manifest_(manifest) {
|
| + }
|
|
|
| - scoped_refptr<Extension> LoadExtension(const std::string& name,
|
| - std::string* error) {
|
| - return LoadExtensionWithLocation(name, Extension::INTERNAL, false, error);
|
| - }
|
| + const std::string& name() const { return name_; }
|
|
|
| - scoped_refptr<Extension> LoadExtensionStrict(const std::string& name,
|
| - std::string* error) {
|
| - return LoadExtensionWithLocation(name, Extension::INTERNAL, true, error);
|
| - }
|
| + DictionaryValue* GetManifest(std::string* error) const {
|
| + if (manifest_)
|
| + return manifest_;
|
|
|
| - scoped_refptr<Extension> LoadExtension(DictionaryValue* value,
|
| - std::string* error) {
|
| - // Loading as an installed extension disables strict error checks.
|
| - return LoadExtensionWithLocation(value, Extension::INTERNAL, false, error);
|
| - }
|
| -
|
| - scoped_refptr<Extension> LoadExtensionWithLocation(
|
| - const std::string& name,
|
| - Extension::Location location,
|
| - bool strict_error_checks,
|
| - std::string* error) {
|
| - scoped_ptr<DictionaryValue> value(LoadManifestFile(name, error));
|
| - if (!value.get())
|
| - return NULL;
|
| - return LoadExtensionWithLocation(value.get(), location,
|
| - strict_error_checks, error);
|
| - }
|
| + manifest_ = LoadManifestFile(name_, error);
|
| + manifest_holder_.reset(manifest_);
|
| + return manifest_;
|
| + }
|
|
|
| - scoped_refptr<Extension> LoadAndExpectSuccess(const std::string& name) {
|
| - std::string error;
|
| - scoped_refptr<Extension> extension = LoadExtension(name, &error);
|
| - EXPECT_TRUE(extension) << name;
|
| - EXPECT_EQ("", error) << name;
|
| - return extension;
|
| - }
|
| + private:
|
| + std::string name_;
|
| + mutable DictionaryValue* manifest_;
|
| + mutable scoped_ptr<DictionaryValue> manifest_holder_;
|
| + };
|
|
|
| - scoped_refptr<Extension> LoadStrictAndExpectSuccess(const std::string& name) {
|
| - std::string error;
|
| - scoped_refptr<Extension> extension = LoadExtensionStrict(name, &error);
|
| - EXPECT_TRUE(extension) << name;
|
| - EXPECT_EQ("", error) << name;
|
| - return extension;
|
| + scoped_refptr<Extension> LoadExtension(
|
| + const Manifest& manifest,
|
| + std::string* error,
|
| + Extension::Location location = Extension::INTERNAL,
|
| + int flags = Extension::NO_FLAGS) {
|
| + DictionaryValue* value = manifest.GetManifest(error);
|
| + if (!value)
|
| + return NULL;
|
| + FilePath path;
|
| + PathService::Get(chrome::DIR_TEST_DATA, &path);
|
| + path = path.AppendASCII("extensions").AppendASCII("manifest_tests");
|
| + return Extension::Create(path.DirName(), location, *value, flags, error);
|
| }
|
|
|
| - scoped_refptr<Extension> LoadAndExpectSuccess(DictionaryValue* manifest,
|
| - const std::string& name) {
|
| + scoped_refptr<Extension> LoadAndExpectSuccess(
|
| + const Manifest& manifest,
|
| + Extension::Location location = Extension::INTERNAL,
|
| + int flags = Extension::NO_FLAGS) {
|
| std::string error;
|
| - scoped_refptr<Extension> extension = LoadExtension(manifest, &error);
|
| - EXPECT_TRUE(extension) << "Unexpected failure for " << name;
|
| - EXPECT_EQ("", error) << "Unexpected error for " << name;
|
| + scoped_refptr<Extension> extension =
|
| + LoadExtension(manifest, &error, location, flags);
|
| + EXPECT_TRUE(extension) << manifest.name();
|
| + EXPECT_EQ("", error) << manifest.name();
|
| return extension;
|
| }
|
|
|
| @@ -139,26 +128,15 @@ class ExtensionManifestTest : public testing::Test {
|
| " expected '" << expected_error << "' but got '" << error << "'";
|
| }
|
|
|
| - void LoadAndExpectError(const std::string& name,
|
| - const std::string& expected_error) {
|
| + void LoadAndExpectError(const Manifest& manifest,
|
| + const std::string& expected_error,
|
| + Extension::Location location = Extension::INTERNAL,
|
| + int flags = Extension::NO_FLAGS) {
|
| std::string error;
|
| - scoped_refptr<Extension> extension(LoadExtension(name, &error));
|
| - VerifyExpectedError(extension.get(), name, error, expected_error);
|
| - }
|
| -
|
| - void LoadAndExpectErrorStrict(const std::string& name,
|
| - const std::string& expected_error) {
|
| - std::string error;
|
| - scoped_refptr<Extension> extension(LoadExtensionStrict(name, &error));
|
| - VerifyExpectedError(extension.get(), name, error, expected_error);
|
| - }
|
| -
|
| - void LoadAndExpectError(DictionaryValue* manifest,
|
| - const std::string& name,
|
| - const std::string& expected_error) {
|
| - std::string error;
|
| - scoped_refptr<Extension> extension(LoadExtension(manifest, &error));
|
| - VerifyExpectedError(extension.get(), name, error, expected_error);
|
| + scoped_refptr<Extension> extension(
|
| + LoadExtension(manifest, &error, location, flags));
|
| + VerifyExpectedError(extension.get(), manifest.name(), error,
|
| + expected_error);
|
| }
|
|
|
| struct Testcase {
|
| @@ -168,7 +146,8 @@ class ExtensionManifestTest : public testing::Test {
|
|
|
| void RunTestcases(const Testcase* testcases, size_t num_testcases) {
|
| for (size_t i = 0; i < num_testcases; ++i) {
|
| - LoadAndExpectError(testcases[i].manifest, testcases[i].expected_error);
|
| + LoadAndExpectError(testcases[i].manifest.c_str(),
|
| + testcases[i].expected_error);
|
| }
|
| }
|
|
|
| @@ -295,25 +274,30 @@ TEST_F(ExtensionManifestTest, InitFromValueValidNameInRTL) {
|
|
|
| TEST_F(ExtensionManifestTest, UpdateUrls) {
|
| // Test several valid update urls
|
| - LoadStrictAndExpectSuccess("update_url_valid_1.json");
|
| - LoadStrictAndExpectSuccess("update_url_valid_2.json");
|
| - LoadStrictAndExpectSuccess("update_url_valid_3.json");
|
| - LoadStrictAndExpectSuccess("update_url_valid_4.json");
|
| + LoadAndExpectSuccess("update_url_valid_1.json", Extension::INTERNAL,
|
| + Extension::STRICT_ERROR_CHECKS);
|
| + LoadAndExpectSuccess("update_url_valid_2.json", Extension::INTERNAL,
|
| + Extension::STRICT_ERROR_CHECKS);
|
| + LoadAndExpectSuccess("update_url_valid_3.json", Extension::INTERNAL,
|
| + Extension::STRICT_ERROR_CHECKS);
|
| + LoadAndExpectSuccess("update_url_valid_4.json", Extension::INTERNAL,
|
| + Extension::STRICT_ERROR_CHECKS);
|
|
|
| // Test some invalid update urls
|
| - LoadAndExpectErrorStrict("update_url_invalid_1.json",
|
| - errors::kInvalidUpdateURL);
|
| - LoadAndExpectErrorStrict("update_url_invalid_2.json",
|
| - errors::kInvalidUpdateURL);
|
| - LoadAndExpectErrorStrict("update_url_invalid_3.json",
|
| - errors::kInvalidUpdateURL);
|
| + LoadAndExpectError("update_url_invalid_1.json", errors::kInvalidUpdateURL,
|
| + Extension::INTERNAL, Extension::STRICT_ERROR_CHECKS);
|
| + LoadAndExpectError("update_url_invalid_2.json", errors::kInvalidUpdateURL,
|
| + Extension::INTERNAL, Extension::STRICT_ERROR_CHECKS);
|
| + LoadAndExpectError("update_url_invalid_3.json", errors::kInvalidUpdateURL,
|
| + Extension::INTERNAL, Extension::STRICT_ERROR_CHECKS);
|
| }
|
|
|
| // Tests that the old permission name "unlimited_storage" still works for
|
| // backwards compatibility (we renamed it to "unlimitedStorage").
|
| TEST_F(ExtensionManifestTest, OldUnlimitedStoragePermission) {
|
| - scoped_refptr<Extension> extension = LoadStrictAndExpectSuccess(
|
| - "old_unlimited_storage.json");
|
| + scoped_refptr<Extension> extension = LoadAndExpectSuccess(
|
| + "old_unlimited_storage.json", Extension::INTERNAL,
|
| + Extension::STRICT_ERROR_CHECKS);
|
| EXPECT_TRUE(extension->HasAPIPermission(
|
| ExtensionAPIPermission::kUnlimitedStorage));
|
| }
|
| @@ -370,13 +354,14 @@ TEST_F(ExtensionManifestTest, AppWebUrls) {
|
| // Ports in app.urls only raise an error when loading as a
|
| // developer would.
|
| LoadAndExpectSuccess("web_urls_invalid_has_port.json");
|
| - LoadAndExpectErrorStrict(
|
| + LoadAndExpectError(
|
| "web_urls_invalid_has_port.json",
|
| ExtensionErrorUtils::FormatErrorMessage(
|
| errors::kInvalidWebURL,
|
| base::IntToString(1),
|
| - URLPattern::GetParseResultString(URLPattern::PARSE_ERROR_HAS_COLON)));
|
| -
|
| + URLPattern::GetParseResultString(URLPattern::PARSE_ERROR_HAS_COLON)),
|
| + Extension::INTERNAL,
|
| + Extension::STRICT_ERROR_CHECKS);
|
|
|
| scoped_refptr<Extension> extension(
|
| LoadAndExpectSuccess("web_urls_default.json"));
|
| @@ -477,11 +462,11 @@ TEST_F(ExtensionManifestTest, ChromeResourcesPermissionValidOnlyForComponents) {
|
| errors::kInvalidPermissionScheme);
|
| std::string error;
|
| scoped_refptr<Extension> extension;
|
| - extension = LoadExtensionWithLocation(
|
| + extension = LoadExtension(
|
| "permission_chrome_resources_url.json",
|
| + &error,
|
| Extension::COMPONENT,
|
| - true, // Strict error checking
|
| - &error);
|
| + Extension::STRICT_ERROR_CHECKS);
|
| EXPECT_EQ("", error);
|
| }
|
|
|
| @@ -511,14 +496,16 @@ TEST_F(ExtensionManifestTest, InvalidContentScriptMatchPattern) {
|
| LoadAndExpectSuccess("forbid_ports_in_content_scripts.json");
|
|
|
| // Loading as a developer would should give an error.
|
| - LoadAndExpectErrorStrict(
|
| + LoadAndExpectError(
|
| "forbid_ports_in_content_scripts.json",
|
| ExtensionErrorUtils::FormatErrorMessage(
|
| errors::kInvalidMatch,
|
| base::IntToString(1),
|
| base::IntToString(0),
|
| URLPattern::GetParseResultString(
|
| - URLPattern::PARSE_ERROR_HAS_COLON)));
|
| + URLPattern::PARSE_ERROR_HAS_COLON)),
|
| + Extension::INTERNAL,
|
| + Extension::STRICT_ERROR_CHECKS);
|
| }
|
|
|
| TEST_F(ExtensionManifestTest, ExcludeMatchPatterns) {
|
| @@ -536,6 +523,9 @@ TEST_F(ExtensionManifestTest, ExcludeMatchPatterns) {
|
|
|
| TEST_F(ExtensionManifestTest, ExperimentalPermission) {
|
| LoadAndExpectError("experimental.json", errors::kExperimentalFlagRequired);
|
| + LoadAndExpectSuccess("experimental.json", Extension::COMPONENT);
|
| + LoadAndExpectSuccess("experimental.json", Extension::INTERNAL,
|
| + Extension::FROM_WEBSTORE);
|
| CommandLine old_command_line = *CommandLine::ForCurrentProcess();
|
| CommandLine::ForCurrentProcess()->AppendSwitch(
|
| switches::kEnableExperimentalExtensionApis);
|
| @@ -659,7 +649,8 @@ TEST_F(ExtensionManifestTest, AllowUnrecognizedPermissions) {
|
| // Extensions are allowed to contain unrecognized API permissions,
|
| // so there shouldn't be any errors.
|
| scoped_refptr<Extension> extension;
|
| - extension = LoadAndExpectSuccess(manifest.get(), message_name);
|
| + extension = LoadAndExpectSuccess(
|
| + Manifest(manifest.get(), message_name.c_str()));
|
| }
|
| *CommandLine::ForCurrentProcess() = old_command_line;
|
| }
|
| @@ -808,7 +799,8 @@ TEST_F(ExtensionManifestTest, ForbidPortsInPermissions) {
|
| // To ensure that we do not error out on a valid permission
|
| // in a future version of chrome, validation is to loose
|
| // to flag this case.
|
| - LoadStrictAndExpectSuccess("forbid_ports_in_permissions.json");
|
| + LoadAndExpectSuccess("forbid_ports_in_permissions.json",
|
| + Extension::INTERNAL, Extension::STRICT_ERROR_CHECKS);
|
| }
|
|
|
| TEST_F(ExtensionManifestTest, IsolatedApps) {
|
| @@ -864,11 +856,11 @@ TEST_F(ExtensionManifestTest, FileManagerURLOverride) {
|
| // A component extention can override chrome://files/ URL.
|
| std::string error;
|
| scoped_refptr<Extension> extension;
|
| - extension = LoadExtensionWithLocation(
|
| + extension = LoadExtension(
|
| "filebrowser_url_override.json",
|
| + &error,
|
| Extension::COMPONENT,
|
| - true, // Strict error checking
|
| - &error);
|
| + Extension::STRICT_ERROR_CHECKS);
|
| #if defined(FILE_MANAGER_EXTENSION)
|
| EXPECT_EQ("", error);
|
| #else
|
|
|