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

Unified Diff: chrome/common/extensions/api/extension_api_unittest.cc

Issue 15091002: Lazily load API schemas from resource files and convert all APIs to features (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix chromeos tests Created 7 years, 6 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
« no previous file with comments | « chrome/common/extensions/api/extension_api_stub.cc ('k') | chrome/common/extensions/api/font_settings.json » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/common/extensions/api/extension_api_unittest.cc
diff --git a/chrome/common/extensions/api/extension_api_unittest.cc b/chrome/common/extensions/api/extension_api_unittest.cc
index 08604f70ee9f619c4ae0cde19742e2209412aea3..2efd202816905d47f4e31128ee9a291ded9deb0d 100644
--- a/chrome/common/extensions/api/extension_api_unittest.cc
+++ b/chrome/common/extensions/api/extension_api_unittest.cc
@@ -26,7 +26,6 @@
#include "testing/gtest/include/gtest/gtest.h"
namespace extensions {
-namespace {
SimpleFeature* CreateAPIFeature() {
return new APIFeature();
@@ -91,11 +90,6 @@ TEST(ExtensionAPITest, IsPrivileged) {
EXPECT_FALSE(extension_api->IsPrivileged("runtime.onConnect"));
EXPECT_FALSE(extension_api->IsPrivileged("runtime.lastError"));
- // Default unknown names to privileged for paranoia's sake.
- EXPECT_TRUE(extension_api->IsPrivileged(std::string()));
- EXPECT_TRUE(extension_api->IsPrivileged("<unknown-namespace>"));
- EXPECT_TRUE(extension_api->IsPrivileged("extension.<unknown-member>"));
-
// Exists, but privileged.
EXPECT_TRUE(extension_api->IsPrivileged("extension.getViews"));
EXPECT_TRUE(extension_api->IsPrivileged("history.search"));
@@ -148,7 +142,7 @@ TEST(ExtensionAPITest, IsPrivilegedFeatures) {
}
}
-TEST(ExtensionAPI, APIFeatures) {
+TEST(ExtensionAPITest, APIFeatures) {
struct {
std::string api_full_name;
bool expect_is_available;
@@ -186,7 +180,40 @@ TEST(ExtensionAPI, APIFeatures) {
{ "test7.foo", false, Feature::WEB_PAGE_CONTEXT, GURL("http://bar.com") },
{ "test7.foo", true, Feature::WEB_PAGE_CONTEXT, GURL("http://foo.com") },
{ "test7.bar", false, Feature::WEB_PAGE_CONTEXT, GURL("http://bar.com") },
- { "test7.bar", false, Feature::WEB_PAGE_CONTEXT, GURL("http://foo.com") }
+ { "test7.bar", false, Feature::WEB_PAGE_CONTEXT, GURL("http://foo.com") },
+
+ // Test parent/child.
+ { "parent1", true, Feature::CONTENT_SCRIPT_CONTEXT, GURL() },
+ { "parent1", false, Feature::WEB_PAGE_CONTEXT, GURL("http://foo.com") },
+ { "parent1.child1", false, Feature::CONTENT_SCRIPT_CONTEXT, GURL() },
+ { "parent1.child1", true, Feature::WEB_PAGE_CONTEXT,
+ GURL("http://foo.com") },
+ { "parent1.child2", true, Feature::CONTENT_SCRIPT_CONTEXT, GURL() },
+ { "parent1.child2", false, Feature::WEB_PAGE_CONTEXT,
+ GURL("http://foo.com") },
+ { "parent2", true, Feature::CONTENT_SCRIPT_CONTEXT, GURL() },
+ { "parent2", true, Feature::BLESSED_EXTENSION_CONTEXT, GURL() },
+ { "parent2", true, Feature::UNBLESSED_EXTENSION_CONTEXT, GURL() },
+ { "parent2.child3", false, Feature::CONTENT_SCRIPT_CONTEXT, GURL() },
+ { "parent2.child3", true, Feature::BLESSED_EXTENSION_CONTEXT, GURL() },
+ { "parent2.child3", false, Feature::UNBLESSED_EXTENSION_CONTEXT, GURL() },
+ { "parent2.child3.child.child", true, Feature::CONTENT_SCRIPT_CONTEXT,
+ GURL() },
+ { "parent2.child3.child.child", false, Feature::BLESSED_EXTENSION_CONTEXT,
+ GURL() },
+ { "parent2.child3.child.child", true, Feature::UNBLESSED_EXTENSION_CONTEXT,
+ GURL() },
+ { "parent3", true, Feature::CONTENT_SCRIPT_CONTEXT, GURL() },
+ { "parent3", false, Feature::BLESSED_EXTENSION_CONTEXT, GURL() },
+ { "parent3", false, Feature::UNBLESSED_EXTENSION_CONTEXT, GURL() },
+ { "parent3.noparent", true, Feature::CONTENT_SCRIPT_CONTEXT, GURL() },
+ { "parent3.noparent", true, Feature::BLESSED_EXTENSION_CONTEXT, GURL() },
+ { "parent3.noparent", true, Feature::UNBLESSED_EXTENSION_CONTEXT, GURL() },
+ { "parent3.noparent.child", true, Feature::CONTENT_SCRIPT_CONTEXT, GURL() },
+ { "parent3.noparent.child", true, Feature::BLESSED_EXTENSION_CONTEXT,
+ GURL() },
+ { "parent3.noparent.child", true, Feature::UNBLESSED_EXTENSION_CONTEXT,
+ GURL() }
};
base::FilePath api_features_path;
@@ -209,7 +236,7 @@ TEST(ExtensionAPI, APIFeatures) {
for (base::DictionaryValue::Iterator iter(*value); !iter.IsAtEnd();
iter.Advance()) {
if (iter.key().find(".") == std::string::npos)
- api.RegisterSchema(iter.key(), "");
+ api.RegisterSchemaResource(iter.key(), 0);
}
EXPECT_EQ(test_data[i].expect_is_available,
@@ -220,7 +247,7 @@ TEST(ExtensionAPI, APIFeatures) {
}
}
-TEST(ExtensionAPI, IsAnyFeatureAvailableToContext) {
+TEST(ExtensionAPITest, IsAnyFeatureAvailableToContext) {
struct {
std::string api_full_name;
bool expect_is_available;
@@ -261,7 +288,7 @@ TEST(ExtensionAPI, IsAnyFeatureAvailableToContext) {
for (base::DictionaryValue::Iterator iter(*value); !iter.IsAtEnd();
iter.Advance()) {
if (iter.key().find(".") == std::string::npos)
- api.RegisterSchema(iter.key(), "");
+ api.RegisterSchemaResource(iter.key(), 0);
}
EXPECT_EQ(test_data[i].expect_is_available,
@@ -339,65 +366,65 @@ TEST(ExtensionAPITest, ExtensionWithUnprivilegedAPIs) {
// "runtime" has privileged parts that should not be accessed by content
// scripts.
- EXPECT_FALSE(extension_api->IsAvailable("runtime",
- extension.get(),
- Feature::CONTENT_SCRIPT_CONTEXT,
- GURL()).is_available());
- EXPECT_FALSE(extension_api->IsAvailable("runtime.sendNativeMessage",
- extension.get(),
- Feature::CONTENT_SCRIPT_CONTEXT,
- GURL()).is_available());
+ EXPECT_FALSE(extension_api->IsAnyFeatureAvailableToContext(
+ "runtime.getBackgroundPage",
+ Feature::CONTENT_SCRIPT_CONTEXT,
+ GURL()));
+ EXPECT_FALSE(extension_api->IsAnyFeatureAvailableToContext(
+ "runtime.sendNativeMessage",
+ Feature::CONTENT_SCRIPT_CONTEXT,
+ GURL()));
// "runtime" also has unprivileged parts.
- EXPECT_TRUE(extension_api->IsAvailable("runtime.sendMessage",
- extension.get(),
- Feature::CONTENT_SCRIPT_CONTEXT,
- GURL()).is_available());
- EXPECT_TRUE(extension_api->IsAvailable("runtime.id",
- extension.get(),
- Feature::CONTENT_SCRIPT_CONTEXT,
- GURL()).is_available());
+ EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext(
+ "runtime.sendMessage",
+ Feature::CONTENT_SCRIPT_CONTEXT,
+ GURL()));
+ EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext(
+ "runtime.id",
+ Feature::CONTENT_SCRIPT_CONTEXT,
+ GURL()));
// "storage" is completely unprivileged.
- EXPECT_TRUE(extension_api->IsAvailable("storage",
- extension.get(),
- Feature::BLESSED_EXTENSION_CONTEXT,
- GURL()).is_available());
- EXPECT_TRUE(extension_api->IsAvailable("storage",
- extension.get(),
- Feature::UNBLESSED_EXTENSION_CONTEXT,
- GURL()).is_available());
- EXPECT_TRUE(extension_api->IsAvailable("storage",
- extension.get(),
- Feature::CONTENT_SCRIPT_CONTEXT,
- GURL()).is_available());
+ EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext(
+ "storage",
+ Feature::BLESSED_EXTENSION_CONTEXT,
+ GURL()));
+ EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext(
+ "storage",
+ Feature::UNBLESSED_EXTENSION_CONTEXT,
+ GURL()));
+ EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext(
+ "storage",
+ Feature::CONTENT_SCRIPT_CONTEXT,
+ GURL()));
// "extension" is partially unprivileged.
- EXPECT_TRUE(extension_api->IsAvailable("extension",
- extension.get(),
- Feature::BLESSED_EXTENSION_CONTEXT,
- GURL()).is_available());
- EXPECT_TRUE(extension_api->IsAvailable("extension",
- extension.get(),
- Feature::UNBLESSED_EXTENSION_CONTEXT,
- GURL()).is_available());
- EXPECT_TRUE(extension_api->IsAvailable("extension",
- extension.get(),
- Feature::CONTENT_SCRIPT_CONTEXT,
- GURL()).is_available());
+ EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext(
+ "extension",
+ Feature::BLESSED_EXTENSION_CONTEXT,
+ GURL()));
+ EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext(
+ "extension",
+ Feature::UNBLESSED_EXTENSION_CONTEXT,
+ GURL()));
+ EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext(
+ "extension",
+ Feature::CONTENT_SCRIPT_CONTEXT,
+ GURL()));
// "history" is entirely privileged.
- EXPECT_TRUE(extension_api->IsAvailable("history",
- extension.get(),
- Feature::BLESSED_EXTENSION_CONTEXT,
- GURL()).is_available());
- EXPECT_FALSE(extension_api->IsAvailable("history",
- extension.get(),
- Feature::UNBLESSED_EXTENSION_CONTEXT,
- GURL()).is_available());
- EXPECT_FALSE(extension_api->IsAvailable("history",
- extension.get(),
- Feature::CONTENT_SCRIPT_CONTEXT,
- GURL()).is_available());
+ EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext(
+ "history",
+ Feature::BLESSED_EXTENSION_CONTEXT,
+ GURL()));
+ EXPECT_FALSE(extension_api->IsAnyFeatureAvailableToContext(
+ "history",
+ Feature::UNBLESSED_EXTENSION_CONTEXT,
+ GURL()));
+ EXPECT_FALSE(extension_api->IsAnyFeatureAvailableToContext(
+ "history",
+ Feature::CONTENT_SCRIPT_CONTEXT,
+ GURL()));
}
scoped_refptr<Extension> CreateHostedApp() {
@@ -407,7 +434,6 @@ scoped_refptr<Extension> CreateHostedApp() {
values.Set(extension_manifest_keys::kWebURLs, new base::ListValue());
values.SetString(extension_manifest_keys::kLaunchWebURL,
"http://www.example.com");
-
std::string error;
scoped_refptr<Extension> extension(Extension::Create(
base::FilePath(), Manifest::INTERNAL, values, Extension::NO_FLAGS,
@@ -416,6 +442,38 @@ scoped_refptr<Extension> CreateHostedApp() {
return extension;
}
+scoped_refptr<Extension> CreatePackagedAppWithPermissions(
+ const std::set<std::string>& permissions) {
+ base::DictionaryValue values;
+ values.SetString(extension_manifest_keys::kName, "test");
+ values.SetString(extension_manifest_keys::kVersion, "0.1");
+ values.SetString(extension_manifest_keys::kPlatformAppBackground,
+ "http://www.example.com");
+
+ base::DictionaryValue* app = new base::DictionaryValue();
+ base::DictionaryValue* background = new base::DictionaryValue();
+ base::ListValue* scripts = new base::ListValue();
+ scripts->Append(new base::StringValue("test.js"));
+ background->Set("scripts", scripts);
+ app->Set("background", background);
+ values.Set(extension_manifest_keys::kApp, app);
+ {
+ scoped_ptr<base::ListValue> permissions_list(new base::ListValue());
+ for (std::set<std::string>::const_iterator i = permissions.begin();
+ i != permissions.end(); ++i) {
+ permissions_list->Append(new base::StringValue(*i));
+ }
+ values.Set("permissions", permissions_list.release());
+ }
+
+ std::string error;
+ scoped_refptr<Extension> extension(Extension::Create(
+ base::FilePath(), Manifest::INTERNAL, values, Extension::NO_FLAGS,
+ &error));
+ CHECK(extension.get()) << error;
+ return extension;
+}
+
TEST(ExtensionAPITest, HostedAppPermissions) {
scoped_refptr<Extension> extension = CreateHostedApp();
@@ -441,6 +499,59 @@ TEST(ExtensionAPITest, HostedAppPermissions) {
GURL()).is_available());
}
+TEST(ExtensionAPITest, AppAndFriendsAvailability) {
+
+ scoped_ptr<ExtensionAPI> extension_api(
+ ExtensionAPI::CreateWithDefaultConfiguration());
+
+ // Make sure chrome.app.runtime and chrome.app.window are available to apps,
+ // and chrome.app is not.
+ {
+ std::set<std::string> permissions;
+ permissions.insert("app.runtime");
+ permissions.insert("app.window");
+ scoped_refptr<Extension> extension =
+ CreatePackagedAppWithPermissions(permissions);
+ EXPECT_FALSE(extension_api->IsAvailable(
+ "app",
+ extension.get(),
+ Feature::BLESSED_EXTENSION_CONTEXT,
+ GURL("http://foo.com")).is_available());
+ EXPECT_TRUE(extension_api->IsAvailable(
+ "app.runtime",
+ extension.get(),
+ Feature::BLESSED_EXTENSION_CONTEXT,
+ GURL("http://foo.com")).is_available());
+ EXPECT_TRUE(extension_api->IsAvailable(
+ "app.window",
+ extension.get(),
+ Feature::BLESSED_EXTENSION_CONTEXT,
+ GURL("http://foo.com")).is_available());
+ }
+ // Make sure chrome.app.runtime and chrome.app.window are not available to
+ // extensions, and chrome.app is.
+ {
+ std::set<std::string> permissions;
+ scoped_refptr<Extension> extension =
+ CreateExtensionWithPermissions(permissions);
+ EXPECT_TRUE(extension_api->IsAvailable(
+ "app",
+ extension.get(),
+ Feature::BLESSED_EXTENSION_CONTEXT,
+ GURL("http://foo.com")).is_available());
+ EXPECT_FALSE(extension_api->IsAvailable(
+ "app.runtime",
+ extension.get(),
+ Feature::BLESSED_EXTENSION_CONTEXT,
+ GURL("http://foo.com")).is_available());
+ EXPECT_FALSE(extension_api->IsAvailable(
+ "app.window",
+ extension.get(),
+ Feature::BLESSED_EXTENSION_CONTEXT,
+ GURL("http://foo.com")).is_available());
+ }
+}
+
TEST(ExtensionAPITest, ExtensionWithDependencies) {
// Extension with the "ttsEngine" permission but not the "tts" permission; it
// should not automatically get "tts" permission.
@@ -581,6 +692,8 @@ TEST(ExtensionAPITest, FeaturesRequireContexts) {
base::ListValue* contexts = new base::ListValue();
contexts->Append(new base::StringValue("content_script"));
test1->Set("contexts", contexts);
+ test1->SetString("channel", "stable");
+ test2->SetString("channel", "stable");
api_features1->Set("test", test1);
api_features2->Set("test", test2);
@@ -622,7 +735,8 @@ TEST(ExtensionAPITest, TypesHaveNamespace) {
<< "Failed to load: " << manifest_path.value();
ExtensionAPI api;
- api.RegisterSchema("test.foo", manifest_str);
+ api.RegisterSchemaResource("test.foo", 0);
+ api.LoadSchema("test.foo", manifest_str);
const base::DictionaryValue* schema = api.GetSchema("test.foo");
@@ -669,5 +783,4 @@ TEST(ExtensionAPITest, TypesHaveNamespace) {
EXPECT_EQ("fully.qualified.Type", type);
}
-} // namespace
} // namespace extensions
« no previous file with comments | « chrome/common/extensions/api/extension_api_stub.cc ('k') | chrome/common/extensions/api/font_settings.json » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698