OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "extensions/common/extension_api.h" | 5 #include "extensions/common/extension_api.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/file_util.h" | 10 #include "base/file_util.h" |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
78 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_data); ++i) { | 78 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_data); ++i) { |
79 std::string feature_type; | 79 std::string feature_type; |
80 std::string feature_name; | 80 std::string feature_name; |
81 ExtensionAPI::SplitDependencyName( | 81 ExtensionAPI::SplitDependencyName( |
82 test_data[i].input, &feature_type, &feature_name); | 82 test_data[i].input, &feature_type, &feature_name); |
83 EXPECT_EQ(test_data[i].expected_feature_type, feature_type) << i; | 83 EXPECT_EQ(test_data[i].expected_feature_type, feature_type) << i; |
84 EXPECT_EQ(test_data[i].expected_feature_name, feature_name) << i; | 84 EXPECT_EQ(test_data[i].expected_feature_name, feature_name) << i; |
85 } | 85 } |
86 } | 86 } |
87 | 87 |
88 TEST(ExtensionAPITest, IsPrivileged) { | 88 TEST(ExtensionAPITest, IsAvailableInUntrustedContext) { |
89 scoped_ptr<ExtensionAPI> extension_api( | 89 scoped_ptr<ExtensionAPI> extension_api( |
90 ExtensionAPI::CreateWithDefaultConfiguration()); | 90 ExtensionAPI::CreateWithDefaultConfiguration()); |
| 91 scoped_refptr<const Extension> extension = |
| 92 ExtensionBuilder() |
| 93 .SetManifest(DictionaryBuilder() |
| 94 .Set("name", "extension") |
| 95 .Set("version", "1") |
| 96 .Set("permissions", ListBuilder().Append("storage")) |
| 97 .Set("manifest_version", 2)) |
| 98 .Build(); |
91 | 99 |
92 EXPECT_FALSE(extension_api->IsPrivileged("runtime.connect")); | 100 EXPECT_TRUE(extension_api->IsAvailableInUntrustedContext("runtime.connect", |
93 EXPECT_FALSE(extension_api->IsPrivileged("runtime.onConnect")); | 101 extension.get())); |
94 EXPECT_FALSE(extension_api->IsPrivileged("runtime.lastError")); | 102 EXPECT_TRUE(extension_api->IsAvailableInUntrustedContext("runtime.onConnect", |
| 103 extension.get())); |
| 104 EXPECT_TRUE(extension_api->IsAvailableInUntrustedContext("runtime.lastError", |
| 105 extension.get())); |
95 | 106 |
96 // Exists, but privileged. | 107 // Exists, but privileged. |
97 EXPECT_TRUE(extension_api->IsPrivileged("extension.getViews")); | 108 EXPECT_FALSE(extension_api->IsAvailableInUntrustedContext( |
98 EXPECT_TRUE(extension_api->IsPrivileged("history.search")); | 109 "extension.getViews", extension.get())); |
| 110 EXPECT_FALSE(extension_api->IsAvailableInUntrustedContext("history.search", |
| 111 extension.get())); |
99 | 112 |
100 // Whole APIs that are unprivileged. | 113 // Whole APIs that are unprivileged. |
101 EXPECT_FALSE(extension_api->IsPrivileged("app.getDetails")); | 114 EXPECT_TRUE( |
102 EXPECT_FALSE(extension_api->IsPrivileged("app.isInstalled")); | 115 extension_api->IsAvailableInUntrustedContext("app", extension.get())); |
103 EXPECT_FALSE(extension_api->IsPrivileged("storage.local")); | 116 EXPECT_TRUE(extension_api->IsAvailableInUntrustedContext("app.getDetails", |
104 EXPECT_FALSE(extension_api->IsPrivileged("storage.local.onChanged")); | 117 extension.get())); |
105 EXPECT_FALSE(extension_api->IsPrivileged("storage.local.set")); | 118 // There is no feature "app.isInstalled" (it's "app.getIsInstalled") but |
106 EXPECT_FALSE(extension_api->IsPrivileged("storage.local.MAX_ITEMS")); | 119 // this should be available nonetheless. |
107 EXPECT_FALSE(extension_api->IsPrivileged("storage.set")); | 120 EXPECT_TRUE(extension_api->IsAvailableInUntrustedContext("app.isInstalled", |
| 121 extension.get())); |
| 122 EXPECT_TRUE(extension_api->IsAvailableInUntrustedContext("storage.local", |
| 123 extension.get())); |
| 124 EXPECT_TRUE(extension_api->IsAvailableInUntrustedContext( |
| 125 "storage.local.onChanged", extension.get())); |
| 126 EXPECT_TRUE(extension_api->IsAvailableInUntrustedContext("storage.local.set", |
| 127 extension.get())); |
| 128 EXPECT_TRUE(extension_api->IsAvailableInUntrustedContext( |
| 129 "storage.local.MAX_ITEMS", extension.get())); |
| 130 EXPECT_TRUE(extension_api->IsAvailableInUntrustedContext("storage.set", |
| 131 extension.get())); |
| 132 |
| 133 // APIs which override unprivileged APIs. |
| 134 EXPECT_FALSE(extension_api->IsAvailableInUntrustedContext("app.runtime", |
| 135 extension.get())); |
| 136 EXPECT_FALSE(extension_api->IsAvailableInUntrustedContext("app.window", |
| 137 extension.get())); |
108 } | 138 } |
109 | 139 |
110 TEST(ExtensionAPITest, IsPrivilegedFeatures) { | 140 TEST(ExtensionAPITest, IsAvailableInUntrustedContextFeatures) { |
111 struct { | 141 struct { |
112 std::string api_full_name; | 142 std::string api_full_name; |
113 bool expect_is_privilged; | 143 bool expect_is_available; |
114 } test_data[] = { | 144 } test_data[] = {{"test1", true}, |
115 { "test1", false }, | 145 {"test1.foo", false}, |
116 { "test1.foo", true }, | 146 {"test2", false}, |
117 { "test2", true }, | 147 {"test2.foo", true}, |
118 { "test2.foo", false }, | 148 {"test2.bar", true}, |
119 { "test2.bar", false }, | 149 {"test2.baz", false}, |
120 { "test2.baz", true }, | 150 {"test2.qux", false}, |
121 { "test3", false }, | 151 {"test3", true}, |
122 { "test3.foo", true }, | 152 {"test3.foo", false}, |
123 { "test4", false } | 153 {"test4", true}, |
124 }; | 154 {"test5", true}}; |
125 | 155 |
126 base::FilePath api_features_path; | 156 base::FilePath api_features_path; |
127 PathService::Get(chrome::DIR_TEST_DATA, &api_features_path); | 157 PathService::Get(chrome::DIR_TEST_DATA, &api_features_path); |
128 api_features_path = api_features_path.AppendASCII("extensions") | 158 api_features_path = api_features_path.AppendASCII("extensions") |
129 .AppendASCII("extension_api_unittest") | 159 .AppendASCII("extension_api_unittest") |
130 .AppendASCII("privileged_api_features.json"); | 160 .AppendASCII("privileged_api_features.json"); |
131 | 161 |
132 std::string api_features_str; | 162 std::string api_features_str; |
133 ASSERT_TRUE(base::ReadFileToString( | 163 ASSERT_TRUE(base::ReadFileToString( |
134 api_features_path, &api_features_str)) << "privileged_api_features.json"; | 164 api_features_path, &api_features_str)) << "privileged_api_features.json"; |
135 | 165 |
136 scoped_ptr<base::DictionaryValue> value(static_cast<base::DictionaryValue*>( | 166 scoped_ptr<base::DictionaryValue> value(static_cast<base::DictionaryValue*>( |
137 base::JSONReader::Read(api_features_str))); | 167 base::JSONReader::Read(api_features_str))); |
138 BaseFeatureProvider api_feature_provider(*value, CreateAPIFeature); | 168 BaseFeatureProvider api_feature_provider(*value, CreateAPIFeature); |
139 | 169 |
| 170 scoped_refptr<Extension> extension = |
| 171 BuildExtension(ExtensionBuilder().Pass()).Build(); |
| 172 |
140 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_data); ++i) { | 173 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_data); ++i) { |
141 ExtensionAPI api; | 174 ExtensionAPI api; |
142 api.RegisterDependencyProvider("api", &api_feature_provider); | 175 api.RegisterDependencyProvider("api", &api_feature_provider); |
143 EXPECT_EQ(test_data[i].expect_is_privilged, | 176 EXPECT_EQ(test_data[i].expect_is_available, |
144 api.IsPrivileged(test_data[i].api_full_name)) << i; | 177 api.IsAvailableInUntrustedContext(test_data[i].api_full_name, |
| 178 extension.get())) |
| 179 << i; |
145 } | 180 } |
146 } | 181 } |
147 | 182 |
148 TEST(ExtensionAPITest, APIFeatures) { | 183 TEST(ExtensionAPITest, APIFeatures) { |
149 struct { | 184 struct { |
150 std::string api_full_name; | 185 std::string api_full_name; |
151 bool expect_is_available; | 186 bool expect_is_available; |
152 Feature::Context context; | 187 Feature::Context context; |
153 GURL url; | 188 GURL url; |
154 } test_data[] = { | 189 } test_data[] = { |
(...skipping 546 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
701 { bookmarks_create } | 736 { bookmarks_create } |
702 }; | 737 }; |
703 | 738 |
704 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_data); ++i) { | 739 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_data); ++i) { |
705 SimpleFeature* feature = test_data[i].feature; | 740 SimpleFeature* feature = test_data[i].feature; |
706 ASSERT_TRUE(feature) << i; | 741 ASSERT_TRUE(feature) << i; |
707 | 742 |
708 EXPECT_TRUE(feature->whitelist()->empty()); | 743 EXPECT_TRUE(feature->whitelist()->empty()); |
709 EXPECT_TRUE(feature->extension_types()->empty()); | 744 EXPECT_TRUE(feature->extension_types()->empty()); |
710 | 745 |
711 EXPECT_EQ(1u, feature->GetContexts()->size()); | |
712 EXPECT_TRUE(feature->GetContexts()->count( | |
713 Feature::BLESSED_EXTENSION_CONTEXT)); | |
714 | |
715 EXPECT_EQ(SimpleFeature::UNSPECIFIED_LOCATION, feature->location()); | 746 EXPECT_EQ(SimpleFeature::UNSPECIFIED_LOCATION, feature->location()); |
716 EXPECT_TRUE(feature->platforms()->empty()); | 747 EXPECT_TRUE(feature->platforms()->empty()); |
717 EXPECT_EQ(0, feature->min_manifest_version()); | 748 EXPECT_EQ(0, feature->min_manifest_version()); |
718 EXPECT_EQ(0, feature->max_manifest_version()); | 749 EXPECT_EQ(0, feature->max_manifest_version()); |
719 } | 750 } |
720 } | 751 } |
721 | 752 |
722 TEST(ExtensionAPITest, FeaturesRequireContexts) { | 753 TEST(ExtensionAPITest, FeaturesRequireContexts) { |
723 // TODO(cduvall): Make this check API featues. | 754 // TODO(cduvall): Make this check API featues. |
724 scoped_ptr<base::DictionaryValue> api_features1(new base::DictionaryValue()); | 755 scoped_ptr<base::DictionaryValue> api_features1(new base::DictionaryValue()); |
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
896 extension.get(), | 927 extension.get(), |
897 Feature::BLESSED_EXTENSION_CONTEXT, | 928 Feature::BLESSED_EXTENSION_CONTEXT, |
898 GURL()).is_available()); | 929 GURL()).is_available()); |
899 EXPECT_FALSE(extension_api->IsAvailable("pageAction", | 930 EXPECT_FALSE(extension_api->IsAvailable("pageAction", |
900 extension.get(), | 931 extension.get(), |
901 Feature::BLESSED_EXTENSION_CONTEXT, | 932 Feature::BLESSED_EXTENSION_CONTEXT, |
902 GURL()).is_available()); | 933 GURL()).is_available()); |
903 } | 934 } |
904 | 935 |
905 } // namespace extensions | 936 } // namespace extensions |
OLD | NEW |