Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3217)

Unified Diff: chrome/common/extensions/extension_unittest.cc

Issue 173463: Update of the extension install UI: (Closed)
Patch Set: mpcompelte comments Created 11 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/common/extensions/extension_unittest.cc
diff --git a/chrome/common/extensions/extension_unittest.cc b/chrome/common/extensions/extension_unittest.cc
index 10edbbbe8f29f6118886e3c03d1920b3b6b8f609..ae751fc0d684c1f90ed2215bb3249bc9fc1f8d2e 100644
--- a/chrome/common/extensions/extension_unittest.cc
+++ b/chrome/common/extensions/extension_unittest.cc
@@ -485,74 +485,144 @@ TEST(ExtensionTest, MimeTypeSniffing) {
EXPECT_EQ("application/octet-stream", result);
}
-TEST(ExtensionTest, PermissionClass) {
-#if defined(OS_WIN)
- FilePath path(FILE_PATH_LITERAL("C:\\foo"));
-#elif defined(OS_POSIX)
- FilePath path(FILE_PATH_LITERAL("/foo"));
-#endif
- Extension::ResetGeneratedIdCounter();
+static Extension* LoadManifest(const std::string& dir,
+ const std::string& test_file) {
+ FilePath path;
+ PathService::Get(chrome::DIR_TEST_DATA, &path);
+ path = path.AppendASCII("extensions")
+ .AppendASCII(dir)
+ .AppendASCII(test_file);
+
+ JSONFileValueSerializer serializer(path);
+ scoped_ptr<Value> result(serializer.Deserialize(NULL));
+ if (!result.get())
+ return NULL;
- Extension extension(path);
std::string error;
- DictionaryValue bare_manifest;
- scoped_ptr<DictionaryValue> manifest;
-
- // Start with a minimalist extension.
- bare_manifest.SetString(keys::kVersion, "1.0.0.0");
- bare_manifest.SetString(keys::kName, "my extension");
- EXPECT_TRUE(extension.InitFromValue(bare_manifest, false, &error));
- EXPECT_EQ(Extension::PERMISSION_CLASS_LOW, extension.GetPermissionClass());
-
- // Toolstrips don't affect the permission class.
- manifest.reset(static_cast<DictionaryValue*>(bare_manifest.DeepCopy()));
- manifest->Set(keys::kToolstrips, ValueFromJSON(
- "[\"toolstrip.html\", \"toolstrip2.html\"]"));
- EXPECT_TRUE(extension.InitFromValue(*manifest, false, &error));
- EXPECT_EQ(Extension::PERMISSION_CLASS_LOW, extension.GetPermissionClass());
-
- // Requesting API permissions bumps you to medium.
- manifest.reset(static_cast<DictionaryValue*>(bare_manifest.DeepCopy()));
- manifest->Set(keys::kPermissions, ValueFromJSON(
- "[\"tabs\", \"bookmarks\"]"));
- EXPECT_TRUE(extension.InitFromValue(*manifest, false, &error));
- EXPECT_EQ(Extension::PERMISSION_CLASS_MEDIUM, extension.GetPermissionClass());
-
- // Adding a content script bumps you to high.
- manifest.reset(static_cast<DictionaryValue*>(bare_manifest.DeepCopy()));
- manifest->Set(keys::kContentScripts, ValueFromJSON(
- "[{"
- " \"matches\": [\"http://*.google.com/*\"],"
- " \"js\": [\"script.js\"]"
- "}]"));
- EXPECT_TRUE(extension.InitFromValue(*manifest, false, &error));
- EXPECT_EQ(Extension::PERMISSION_CLASS_HIGH, extension.GetPermissionClass());
-
- // ... or asking for a host permission.
- manifest.reset(static_cast<DictionaryValue*>(bare_manifest.DeepCopy()));
- manifest->Set(keys::kPermissions, ValueFromJSON(
- "[\"tabs\", \"http://google.com/*\"]"));
- EXPECT_TRUE(extension.InitFromValue(*manifest, false, &error));
- EXPECT_EQ(Extension::PERMISSION_CLASS_HIGH, extension.GetPermissionClass());
-
- // Using native code (NPAPI) is automatically the max class.
- manifest.reset(static_cast<DictionaryValue*>(bare_manifest.DeepCopy()));
- manifest->Set(keys::kPlugins, ValueFromJSON(
- "[{\"path\": \"harddrive_exploder.dll\"}]"));
- EXPECT_TRUE(extension.InitFromValue(*manifest, false, &error));
- EXPECT_EQ(Extension::PERMISSION_CLASS_FULL, extension.GetPermissionClass());
-
- // Using everything at once should obviously be the max class as well.
- manifest.reset(static_cast<DictionaryValue*>(bare_manifest.DeepCopy()));
- manifest->Set(keys::kPlugins, ValueFromJSON(
- "[{\"path\": \"harddrive_exploder.dll\"}]"));
- manifest->Set(keys::kPermissions, ValueFromJSON(
- "[\"tabs\", \"http://google.com/*\"]"));
- manifest->Set(keys::kContentScripts, ValueFromJSON(
- "[{"
- " \"matches\": [\"http://*.google.com/*\"],"
- " \"js\": [\"script.js\"]"
- "}]"));
- EXPECT_TRUE(extension.InitFromValue(*manifest, false, &error));
- EXPECT_EQ(Extension::PERMISSION_CLASS_FULL, extension.GetPermissionClass());
+ scoped_ptr<Extension> extension(new Extension);
+ extension->InitFromValue(*static_cast<DictionaryValue*>(result.get()),
+ false, &error);
+
+ result.release();
+ return extension.release();
+}
+
+TEST(ExtensionTest, EffectiveHostPermissions) {
+ scoped_ptr<Extension> extension;
+ std::set<std::string> hosts;
+
+ extension.reset(LoadManifest("effective_host_permissions", "empty.json"));
+ EXPECT_EQ(0, extension->GetEffectiveHostPermissions().size());
+ EXPECT_FALSE(extension->HasAccessToAllHosts());
+
+ extension.reset(LoadManifest("effective_host_permissions", "one_host.json"));
+ hosts = extension->GetEffectiveHostPermissions();
+ EXPECT_EQ(1, hosts.size());
+ EXPECT_TRUE(hosts.find("www.google.com") != hosts.end());
+ EXPECT_FALSE(extension->HasAccessToAllHosts());
+
+ extension.reset(LoadManifest("effective_host_permissions",
+ "one_host_wildcard.json"));
+ hosts = extension->GetEffectiveHostPermissions();
+ EXPECT_EQ(1, hosts.size());
+ EXPECT_TRUE(hosts.find("google.com") != hosts.end());
+ EXPECT_FALSE(extension->HasAccessToAllHosts());
+
+ extension.reset(LoadManifest("effective_host_permissions",
+ "two_hosts.json"));
+ hosts = extension->GetEffectiveHostPermissions();
+ EXPECT_EQ(2, hosts.size());
+ EXPECT_TRUE(hosts.find("www.google.com") != hosts.end());
+ EXPECT_TRUE(hosts.find("www.reddit.com") != hosts.end());
+ EXPECT_FALSE(extension->HasAccessToAllHosts());
+
+ extension.reset(LoadManifest("effective_host_permissions",
+ "duplicate_host.json"));
+ hosts = extension->GetEffectiveHostPermissions();
+ EXPECT_EQ(1, hosts.size());
+ EXPECT_TRUE(hosts.find("google.com") != hosts.end());
+ EXPECT_FALSE(extension->HasAccessToAllHosts());
+
+ extension.reset(LoadManifest("effective_host_permissions",
+ "https_not_considered.json"));
+ hosts = extension->GetEffectiveHostPermissions();
+ EXPECT_EQ(1, hosts.size());
+ EXPECT_TRUE(hosts.find("google.com") != hosts.end());
+ EXPECT_FALSE(extension->HasAccessToAllHosts());
+
+ extension.reset(LoadManifest("effective_host_permissions",
+ "two_content_scripts.json"));
+ hosts = extension->GetEffectiveHostPermissions();
+ EXPECT_EQ(3, hosts.size());
+ EXPECT_TRUE(hosts.find("google.com") != hosts.end());
+ EXPECT_TRUE(hosts.find("www.reddit.com") != hosts.end());
+ EXPECT_TRUE(hosts.find("news.ycombinator.com") != hosts.end());
+ EXPECT_FALSE(extension->HasAccessToAllHosts());
+
+ extension.reset(LoadManifest("effective_host_permissions",
+ "duplicate_content_script.json"));
+ hosts = extension->GetEffectiveHostPermissions();
+ EXPECT_EQ(2, hosts.size());
+ EXPECT_TRUE(hosts.find("google.com") != hosts.end());
+ EXPECT_TRUE(hosts.find("www.reddit.com") != hosts.end());
+ EXPECT_FALSE(extension->HasAccessToAllHosts());
+
+ extension.reset(LoadManifest("effective_host_permissions",
+ "all_hosts.json"));
+ hosts = extension->GetEffectiveHostPermissions();
+ EXPECT_EQ(1, hosts.size());
+ EXPECT_TRUE(hosts.find("") != hosts.end());
+ EXPECT_TRUE(extension->HasAccessToAllHosts());
+
+ extension.reset(LoadManifest("effective_host_permissions",
+ "all_hosts2.json"));
+ hosts = extension->GetEffectiveHostPermissions();
+ EXPECT_EQ(2, hosts.size());
+ EXPECT_TRUE(hosts.find("") != hosts.end());
+ EXPECT_TRUE(hosts.find("www.google.com") != hosts.end());
+ EXPECT_TRUE(extension->HasAccessToAllHosts());
+
+ extension.reset(LoadManifest("effective_host_permissions",
+ "all_hosts3.json"));
+ hosts = extension->GetEffectiveHostPermissions();
+ EXPECT_EQ(2, hosts.size());
+ EXPECT_TRUE(hosts.find("") != hosts.end());
+ EXPECT_TRUE(hosts.find("www.google.com") != hosts.end());
+ EXPECT_TRUE(extension->HasAccessToAllHosts());
+}
+
+TEST(ExtensionTest, AllowSilentUpgrade) {
+ const struct {
+ const char* base_name;
+ bool expect_success;
+ } kTests[] = {
+ { "allhosts1", true }, // all -> all
+ { "allhosts2", true }, // all -> one
+ { "allhosts3", false }, // one -> all
+ { "hosts1", true }, // http://a,http://b -> http://a,http://b
+ { "hosts2", true }, // http://a,http://b -> https://a,http://*.b
+ { "hosts3", true }, // http://a,http://b -> http://a
+ { "hosts4", false }, // http://a -> http://a,http://b
+ { "permissions1", true}, // tabs -> tabs
+ { "permissions2", true}, // tabs -> tabs,bookmarks
+ { "permissions3", false}, // http://a -> http://a,tabs
+ { "permissions4", true}, // plugin -> plugin,tabs
+ { "plugin1", true}, // plugin -> plugin
+ { "plugin2", true}, // plugin -> none
+ { "plugin3", false} // none -> plugin
+ };
+
+ for (size_t i = 0; i < arraysize(kTests); ++i) {
+ scoped_ptr<Extension> old_extension(
+ LoadManifest("allow_silent_upgrade",
+ std::string(kTests[i].base_name) + "_old.json"));
+ scoped_ptr<Extension> new_extension(
+ LoadManifest("allow_silent_upgrade",
+ std::string(kTests[i].base_name) + "_new.json"));
+
+ EXPECT_EQ(kTests[i].expect_success,
+ Extension::AllowSilentUpgrade(old_extension.get(),
+ new_extension.get()))
+ << kTests[i].base_name;
+ }
}

Powered by Google App Engine
This is Rietveld 408576698