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

Side by Side Diff: chrome/common/extensions/api/common_extension_api_unittest.cc

Issue 2241203003: Pass user session type to extension feature checks (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: split out some stuff Created 4 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 unified diff | Download patch
OLDNEW
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 <stddef.h> 7 #include <stddef.h>
8 8
9 #include <memory> 9 #include <memory>
10 #include <string> 10 #include <string>
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
88 EXPECT_EQ(test_data[i].expected_feature_type, feature_type) << i; 88 EXPECT_EQ(test_data[i].expected_feature_type, feature_type) << i;
89 EXPECT_EQ(test_data[i].expected_feature_name, feature_name) << i; 89 EXPECT_EQ(test_data[i].expected_feature_name, feature_name) << i;
90 } 90 }
91 } 91 }
92 92
93 TEST(ExtensionAPITest, APIFeatures) { 93 TEST(ExtensionAPITest, APIFeatures) {
94 struct { 94 struct {
95 std::string api_full_name; 95 std::string api_full_name;
96 bool expect_is_available; 96 bool expect_is_available;
97 Feature::Context context; 97 Feature::Context context;
98 Feature::SessionType session_type;
98 GURL url; 99 GURL url;
99 } test_data[] = { 100 } test_data[] = {
100 { "test1", false, Feature::WEB_PAGE_CONTEXT, GURL() }, 101 {"test1", false, Feature::WEB_PAGE_CONTEXT,
101 { "test1", true, Feature::BLESSED_EXTENSION_CONTEXT, GURL() }, 102 Feature::SESSION_TYPE_UNSPECIFIED, GURL()},
102 { "test1", true, Feature::UNBLESSED_EXTENSION_CONTEXT, GURL() }, 103 {"test1", true, Feature::BLESSED_EXTENSION_CONTEXT,
103 { "test1", true, Feature::CONTENT_SCRIPT_CONTEXT, GURL() }, 104 Feature::SESSION_TYPE_UNSPECIFIED, GURL()},
104 { "test2", true, Feature::WEB_PAGE_CONTEXT, GURL("http://google.com") }, 105 {"test1", true, Feature::UNBLESSED_EXTENSION_CONTEXT,
105 { "test2", false, Feature::BLESSED_EXTENSION_CONTEXT, 106 Feature::SESSION_TYPE_UNSPECIFIED, GURL()},
106 GURL("http://google.com") }, 107 {"test1", true, Feature::CONTENT_SCRIPT_CONTEXT,
107 { "test2.foo", false, Feature::WEB_PAGE_CONTEXT, 108 Feature::SESSION_TYPE_UNSPECIFIED, GURL()},
108 GURL("http://google.com") }, 109 {"test2", true, Feature::WEB_PAGE_CONTEXT,
109 { "test2.foo", true, Feature::CONTENT_SCRIPT_CONTEXT, GURL() }, 110 Feature::SESSION_TYPE_UNSPECIFIED, GURL("http://google.com")},
110 { "test3", false, Feature::WEB_PAGE_CONTEXT, GURL("http://google.com") }, 111 {"test2", false, Feature::BLESSED_EXTENSION_CONTEXT,
111 { "test3.foo", true, Feature::WEB_PAGE_CONTEXT, GURL("http://google.com") }, 112 Feature::SESSION_TYPE_UNSPECIFIED, GURL("http://google.com")},
112 { "test3.foo", true, Feature::BLESSED_EXTENSION_CONTEXT, 113 {"test2.foo", false, Feature::WEB_PAGE_CONTEXT,
113 GURL("http://bad.com") }, 114 Feature::SESSION_TYPE_UNSPECIFIED, GURL("http://google.com")},
114 { "test4", true, Feature::BLESSED_EXTENSION_CONTEXT, 115 {"test2.foo", true, Feature::CONTENT_SCRIPT_CONTEXT,
115 GURL("http://bad.com") }, 116 Feature::SESSION_TYPE_UNSPECIFIED, GURL()},
116 { "test4.foo", false, Feature::BLESSED_EXTENSION_CONTEXT, 117 {"test3", false, Feature::WEB_PAGE_CONTEXT,
117 GURL("http://bad.com") }, 118 Feature::SESSION_TYPE_UNSPECIFIED, GURL("http://google.com")},
118 { "test4.foo", false, Feature::UNBLESSED_EXTENSION_CONTEXT, 119 {"test3.foo", true, Feature::WEB_PAGE_CONTEXT,
119 GURL("http://bad.com") }, 120 Feature::SESSION_TYPE_UNSPECIFIED, GURL("http://google.com")},
120 { "test4.foo.foo", true, Feature::CONTENT_SCRIPT_CONTEXT, GURL() }, 121 {"test3.foo", true, Feature::BLESSED_EXTENSION_CONTEXT,
121 { "test5", true, Feature::WEB_PAGE_CONTEXT, GURL("http://foo.com") }, 122 Feature::SESSION_TYPE_UNSPECIFIED, GURL("http://bad.com")},
122 { "test5", false, Feature::WEB_PAGE_CONTEXT, GURL("http://bar.com") }, 123 {"test4", true, Feature::BLESSED_EXTENSION_CONTEXT,
123 { "test5.blah", true, Feature::WEB_PAGE_CONTEXT, GURL("http://foo.com") }, 124 Feature::SESSION_TYPE_UNSPECIFIED, GURL("http://bad.com")},
124 { "test5.blah", false, Feature::WEB_PAGE_CONTEXT, GURL("http://bar.com") }, 125 {"test4.foo", false, Feature::BLESSED_EXTENSION_CONTEXT,
125 { "test6", false, Feature::BLESSED_EXTENSION_CONTEXT, GURL() }, 126 Feature::SESSION_TYPE_UNSPECIFIED, GURL("http://bad.com")},
126 { "test6.foo", true, Feature::BLESSED_EXTENSION_CONTEXT, GURL() }, 127 {"test4.foo", false, Feature::UNBLESSED_EXTENSION_CONTEXT,
127 { "test7", true, Feature::WEB_PAGE_CONTEXT, GURL("http://foo.com") }, 128 Feature::SESSION_TYPE_UNSPECIFIED, GURL("http://bad.com")},
128 { "test7.foo", false, Feature::WEB_PAGE_CONTEXT, GURL("http://bar.com") }, 129 {"test4.foo.foo", true, Feature::CONTENT_SCRIPT_CONTEXT,
129 { "test7.foo", true, Feature::WEB_PAGE_CONTEXT, GURL("http://foo.com") }, 130 Feature::SESSION_TYPE_UNSPECIFIED, GURL()},
130 { "test7.bar", false, Feature::WEB_PAGE_CONTEXT, GURL("http://bar.com") }, 131 {"test5", true, Feature::WEB_PAGE_CONTEXT,
131 { "test7.bar", false, Feature::WEB_PAGE_CONTEXT, GURL("http://foo.com") }, 132 Feature::SESSION_TYPE_UNSPECIFIED, GURL("http://foo.com")},
133 {"test5", false, Feature::WEB_PAGE_CONTEXT,
134 Feature::SESSION_TYPE_UNSPECIFIED, GURL("http://bar.com")},
135 {"test5.blah", true, Feature::WEB_PAGE_CONTEXT,
136 Feature::SESSION_TYPE_UNSPECIFIED, GURL("http://foo.com")},
137 {"test5.blah", false, Feature::WEB_PAGE_CONTEXT,
138 Feature::SESSION_TYPE_UNSPECIFIED, GURL("http://bar.com")},
139 {"test6", false, Feature::BLESSED_EXTENSION_CONTEXT,
140 Feature::SESSION_TYPE_UNSPECIFIED, GURL()},
141 {"test6.foo", true, Feature::BLESSED_EXTENSION_CONTEXT,
142 Feature::SESSION_TYPE_UNSPECIFIED, GURL()},
143 {"test7", true, Feature::WEB_PAGE_CONTEXT,
144 Feature::SESSION_TYPE_UNSPECIFIED, GURL("http://foo.com")},
145 {"test7.foo", false, Feature::WEB_PAGE_CONTEXT,
146 Feature::SESSION_TYPE_UNSPECIFIED, GURL("http://bar.com")},
147 {"test7.foo", true, Feature::WEB_PAGE_CONTEXT,
148 Feature::SESSION_TYPE_UNSPECIFIED, GURL("http://foo.com")},
149 {"test7.bar", false, Feature::WEB_PAGE_CONTEXT,
150 Feature::SESSION_TYPE_UNSPECIFIED, GURL("http://bar.com")},
151 {"test7.bar", false, Feature::WEB_PAGE_CONTEXT,
152 Feature::SESSION_TYPE_UNSPECIFIED, GURL("http://foo.com")},
132 153
133 // Test parent/child. 154 // Test parent/child.
134 { "parent1", true, Feature::CONTENT_SCRIPT_CONTEXT, GURL() }, 155 {"parent1", true, Feature::CONTENT_SCRIPT_CONTEXT,
135 { "parent1", false, Feature::WEB_PAGE_CONTEXT, GURL("http://foo.com") }, 156 Feature::SESSION_TYPE_UNSPECIFIED, GURL()},
136 { "parent1.child1", false, Feature::CONTENT_SCRIPT_CONTEXT, GURL() }, 157 {"parent1", false, Feature::WEB_PAGE_CONTEXT,
137 { "parent1.child1", true, Feature::WEB_PAGE_CONTEXT, 158 Feature::SESSION_TYPE_UNSPECIFIED, GURL("http://foo.com")},
138 GURL("http://foo.com") }, 159 {"parent1.child1", false, Feature::CONTENT_SCRIPT_CONTEXT,
139 { "parent1.child2", true, Feature::CONTENT_SCRIPT_CONTEXT, GURL() }, 160 Feature::SESSION_TYPE_UNSPECIFIED, GURL()},
140 { "parent1.child2", false, Feature::WEB_PAGE_CONTEXT, 161 {"parent1.child1", true, Feature::WEB_PAGE_CONTEXT,
141 GURL("http://foo.com") }, 162 Feature::SESSION_TYPE_UNSPECIFIED, GURL("http://foo.com")},
142 { "parent2", true, Feature::CONTENT_SCRIPT_CONTEXT, GURL() }, 163 {"parent1.child2", true, Feature::CONTENT_SCRIPT_CONTEXT,
143 { "parent2", true, Feature::BLESSED_EXTENSION_CONTEXT, GURL() }, 164 Feature::SESSION_TYPE_UNSPECIFIED, GURL()},
144 { "parent2", true, Feature::UNBLESSED_EXTENSION_CONTEXT, GURL() }, 165 {"parent1.child2", false, Feature::WEB_PAGE_CONTEXT,
145 { "parent2.child3", false, Feature::CONTENT_SCRIPT_CONTEXT, GURL() }, 166 Feature::SESSION_TYPE_UNSPECIFIED, GURL("http://foo.com")},
146 { "parent2.child3", true, Feature::BLESSED_EXTENSION_CONTEXT, GURL() }, 167 {"parent2", true, Feature::CONTENT_SCRIPT_CONTEXT,
147 { "parent2.child3", false, Feature::UNBLESSED_EXTENSION_CONTEXT, GURL() }, 168 Feature::SESSION_TYPE_UNSPECIFIED, GURL()},
148 { "parent2.child3.child.child", true, Feature::CONTENT_SCRIPT_CONTEXT, 169 {"parent2", true, Feature::BLESSED_EXTENSION_CONTEXT,
149 GURL() }, 170 Feature::SESSION_TYPE_UNSPECIFIED, GURL()},
150 { "parent2.child3.child.child", false, Feature::BLESSED_EXTENSION_CONTEXT, 171 {"parent2", true, Feature::UNBLESSED_EXTENSION_CONTEXT,
151 GURL() }, 172 Feature::SESSION_TYPE_UNSPECIFIED, GURL()},
152 { "parent2.child3.child.child", true, Feature::UNBLESSED_EXTENSION_CONTEXT, 173 {"parent2.child3", false, Feature::CONTENT_SCRIPT_CONTEXT,
153 GURL() }, 174 Feature::SESSION_TYPE_UNSPECIFIED, GURL()},
154 { "parent3", true, Feature::CONTENT_SCRIPT_CONTEXT, GURL() }, 175 {"parent2.child3", true, Feature::BLESSED_EXTENSION_CONTEXT,
155 { "parent3", false, Feature::BLESSED_EXTENSION_CONTEXT, GURL() }, 176 Feature::SESSION_TYPE_UNSPECIFIED, GURL()},
156 { "parent3", false, Feature::UNBLESSED_EXTENSION_CONTEXT, GURL() }, 177 {"parent2.child3", false, Feature::UNBLESSED_EXTENSION_CONTEXT,
157 { "parent3.noparent", true, Feature::CONTENT_SCRIPT_CONTEXT, GURL() }, 178 Feature::SESSION_TYPE_UNSPECIFIED, GURL()},
158 { "parent3.noparent", true, Feature::BLESSED_EXTENSION_CONTEXT, GURL() }, 179 {"parent2.child3.child.child", true, Feature::CONTENT_SCRIPT_CONTEXT,
159 { "parent3.noparent", true, Feature::UNBLESSED_EXTENSION_CONTEXT, GURL() }, 180 Feature::SESSION_TYPE_UNSPECIFIED, GURL()},
160 { "parent3.noparent.child", true, Feature::CONTENT_SCRIPT_CONTEXT, GURL() }, 181 {"parent2.child3.child.child", false, Feature::BLESSED_EXTENSION_CONTEXT,
161 { "parent3.noparent.child", true, Feature::BLESSED_EXTENSION_CONTEXT, 182 Feature::SESSION_TYPE_UNSPECIFIED, GURL()},
162 GURL() }, 183 {"parent2.child3.child.child", true, Feature::UNBLESSED_EXTENSION_CONTEXT,
163 { "parent3.noparent.child", true, Feature::UNBLESSED_EXTENSION_CONTEXT, 184 Feature::SESSION_TYPE_UNSPECIFIED, GURL()},
164 GURL() } 185 {"parent3", true, Feature::CONTENT_SCRIPT_CONTEXT,
186 Feature::SESSION_TYPE_UNSPECIFIED, GURL()},
187 {"parent3", false, Feature::BLESSED_EXTENSION_CONTEXT,
188 Feature::SESSION_TYPE_UNSPECIFIED, GURL()},
189 {"parent3", false, Feature::UNBLESSED_EXTENSION_CONTEXT,
190 Feature::SESSION_TYPE_UNSPECIFIED, GURL()},
191 {"parent3.noparent", true, Feature::CONTENT_SCRIPT_CONTEXT,
192 Feature::SESSION_TYPE_UNSPECIFIED, GURL()},
193 {"parent3.noparent", true, Feature::BLESSED_EXTENSION_CONTEXT,
194 Feature::SESSION_TYPE_UNSPECIFIED, GURL()},
195 {"parent3.noparent", true, Feature::UNBLESSED_EXTENSION_CONTEXT,
196 Feature::SESSION_TYPE_UNSPECIFIED, GURL()},
197 {"parent3.noparent.child", true, Feature::CONTENT_SCRIPT_CONTEXT,
198 Feature::SESSION_TYPE_UNSPECIFIED, GURL()},
199 {"parent3.noparent.child", true, Feature::BLESSED_EXTENSION_CONTEXT,
200 Feature::SESSION_TYPE_UNSPECIFIED, GURL()},
201 {"parent3.noparent.child", true, Feature::UNBLESSED_EXTENSION_CONTEXT,
202 Feature::SESSION_TYPE_UNSPECIFIED, GURL()},
165 }; 203 };
166 204
167 base::FilePath api_features_path; 205 base::FilePath api_features_path;
168 PathService::Get(chrome::DIR_TEST_DATA, &api_features_path); 206 PathService::Get(chrome::DIR_TEST_DATA, &api_features_path);
169 api_features_path = api_features_path.AppendASCII("extensions") 207 api_features_path = api_features_path.AppendASCII("extensions")
170 .AppendASCII("extension_api_unittest") 208 .AppendASCII("extension_api_unittest")
171 .AppendASCII("api_features.json"); 209 .AppendASCII("api_features.json");
172 210
173 std::string api_features_str; 211 std::string api_features_str;
174 ASSERT_TRUE(base::ReadFileToString( 212 ASSERT_TRUE(base::ReadFileToString(
175 api_features_path, &api_features_str)) << "api_features.json"; 213 api_features_path, &api_features_str)) << "api_features.json";
176 214
177 std::unique_ptr<base::DictionaryValue> value( 215 std::unique_ptr<base::DictionaryValue> value(
178 static_cast<base::DictionaryValue*>( 216 static_cast<base::DictionaryValue*>(
179 base::JSONReader::Read(api_features_str).release())); 217 base::JSONReader::Read(api_features_str).release()));
180 JSONFeatureProvider api_feature_provider(*value, CreateAPIFeature); 218 JSONFeatureProvider api_feature_provider(*value, CreateAPIFeature);
181 219
182 for (size_t i = 0; i < arraysize(test_data); ++i) { 220 for (size_t i = 0; i < arraysize(test_data); ++i) {
183 ExtensionAPI api; 221 ExtensionAPI api;
184 api.RegisterDependencyProvider("api", &api_feature_provider); 222 api.RegisterDependencyProvider("api", &api_feature_provider);
185 for (base::DictionaryValue::Iterator iter(*value); !iter.IsAtEnd(); 223 for (base::DictionaryValue::Iterator iter(*value); !iter.IsAtEnd();
186 iter.Advance()) { 224 iter.Advance()) {
187 if (iter.key().find(".") == std::string::npos) 225 if (iter.key().find(".") == std::string::npos)
188 api.RegisterSchemaResource(iter.key(), 0); 226 api.RegisterSchemaResource(iter.key(), 0);
189 } 227 }
190 228
191 ExtensionAPI::OverrideSharedInstanceForTest scope(&api); 229 ExtensionAPI::OverrideSharedInstanceForTest scope(&api);
192 bool expected = test_data[i].expect_is_available; 230 bool expected = test_data[i].expect_is_available;
193 Feature::Availability availability = 231 Feature::Availability availability =
194 api.IsAvailable(test_data[i].api_full_name, 232 api.IsAvailable(test_data[i].api_full_name, NULL, test_data[i].context,
195 NULL, 233 test_data[i].session_type, test_data[i].url);
196 test_data[i].context,
197 test_data[i].url);
198 EXPECT_EQ(expected, availability.is_available()) 234 EXPECT_EQ(expected, availability.is_available())
199 << base::StringPrintf("Test %d: Feature '%s' was %s: %s", 235 << base::StringPrintf("Test %d: Feature '%s' was %s: %s",
200 static_cast<int>(i), 236 static_cast<int>(i),
201 test_data[i].api_full_name.c_str(), 237 test_data[i].api_full_name.c_str(),
202 expected ? "not available" : "available", 238 expected ? "not available" : "available",
203 availability.message().c_str()); 239 availability.message().c_str());
204 } 240 }
205 } 241 }
206 242
207 TEST(ExtensionAPITest, IsAnyFeatureAvailableToContext) { 243 TEST(ExtensionAPITest, IsAnyFeatureAvailableToContext) {
(...skipping 21 matching lines...) Expand all
229 .Set("name", "extension") 265 .Set("name", "extension")
230 .Set("version", "1") 266 .Set("version", "1")
231 .Set("manifest_version", 2) 267 .Set("manifest_version", 2)
232 .Build()) 268 .Build())
233 .Build(); 269 .Build();
234 270
235 struct { 271 struct {
236 std::string api_full_name; 272 std::string api_full_name;
237 bool expect_is_available; 273 bool expect_is_available;
238 Feature::Context context; 274 Feature::Context context;
275 Feature::SessionType session_type;
239 const Extension* extension; 276 const Extension* extension;
240 GURL url; 277 GURL url;
241 } test_data[] = { 278 } test_data[] = {
242 { "test1", false, Feature::WEB_PAGE_CONTEXT, NULL, GURL() }, 279 {"test1", false, Feature::WEB_PAGE_CONTEXT,
243 { "test1", true, Feature::UNBLESSED_EXTENSION_CONTEXT, NULL, GURL() }, 280 Feature::SESSION_TYPE_UNSPECIFIED, NULL, GURL()},
244 { "test1", false, Feature::UNBLESSED_EXTENSION_CONTEXT, app.get(), GURL() }, 281 {"test1", true, Feature::UNBLESSED_EXTENSION_CONTEXT,
245 { "test1", true, Feature::UNBLESSED_EXTENSION_CONTEXT, extension.get(), 282 Feature::SESSION_TYPE_UNSPECIFIED, NULL, GURL()},
246 GURL() }, 283 {"test1", false, Feature::UNBLESSED_EXTENSION_CONTEXT,
247 { "test2", true, Feature::CONTENT_SCRIPT_CONTEXT, NULL, GURL() }, 284 Feature::SESSION_TYPE_UNSPECIFIED, app.get(), GURL()},
248 { "test2", true, Feature::WEB_PAGE_CONTEXT, NULL, 285 {"test1", true, Feature::UNBLESSED_EXTENSION_CONTEXT,
249 GURL("http://google.com") }, 286 Feature::SESSION_TYPE_UNSPECIFIED, extension.get(), GURL()},
250 { "test2.foo", false, Feature::WEB_PAGE_CONTEXT, NULL, 287 {"test2", true, Feature::CONTENT_SCRIPT_CONTEXT,
251 GURL("http://google.com") }, 288 Feature::SESSION_TYPE_UNSPECIFIED, NULL, GURL()},
252 { "test3", true, Feature::CONTENT_SCRIPT_CONTEXT, NULL, GURL() }, 289 {"test2", true, Feature::WEB_PAGE_CONTEXT,
253 { "test3", true, Feature::WEB_PAGE_CONTEXT, NULL, GURL("http://foo.com") }, 290 Feature::SESSION_TYPE_UNSPECIFIED, NULL, GURL("http://google.com")},
254 { "test4.foo", true, Feature::CONTENT_SCRIPT_CONTEXT, NULL, GURL() }, 291 {"test2.foo", false, Feature::WEB_PAGE_CONTEXT,
255 { "test7", false, Feature::WEB_PAGE_CONTEXT, NULL, 292 Feature::SESSION_TYPE_UNSPECIFIED, NULL, GURL("http://google.com")},
256 GURL("http://google.com") }, 293 {"test3", true, Feature::CONTENT_SCRIPT_CONTEXT,
257 { "test7", true, Feature::WEB_PAGE_CONTEXT, NULL, GURL("http://foo.com") }, 294 Feature::SESSION_TYPE_UNSPECIFIED, NULL, GURL()},
258 { "test7", false, Feature::WEB_PAGE_CONTEXT, NULL, GURL("http://bar.com") } 295 {"test3", true, Feature::WEB_PAGE_CONTEXT,
259 }; 296 Feature::SESSION_TYPE_UNSPECIFIED, NULL, GURL("http://foo.com")},
297 {"test4.foo", true, Feature::CONTENT_SCRIPT_CONTEXT,
298 Feature::SESSION_TYPE_UNSPECIFIED, NULL, GURL()},
299 {"test7", false, Feature::WEB_PAGE_CONTEXT,
300 Feature::SESSION_TYPE_UNSPECIFIED, NULL, GURL("http://google.com")},
301 {"test7", true, Feature::WEB_PAGE_CONTEXT,
302 Feature::SESSION_TYPE_UNSPECIFIED, NULL, GURL("http://foo.com")},
303 {"test7", false, Feature::WEB_PAGE_CONTEXT,
304 Feature::SESSION_TYPE_UNSPECIFIED, NULL, GURL("http://bar.com")}};
260 305
261 base::FilePath api_features_path; 306 base::FilePath api_features_path;
262 PathService::Get(chrome::DIR_TEST_DATA, &api_features_path); 307 PathService::Get(chrome::DIR_TEST_DATA, &api_features_path);
263 api_features_path = api_features_path.AppendASCII("extensions") 308 api_features_path = api_features_path.AppendASCII("extensions")
264 .AppendASCII("extension_api_unittest") 309 .AppendASCII("extension_api_unittest")
265 .AppendASCII("api_features.json"); 310 .AppendASCII("api_features.json");
266 311
267 std::string api_features_str; 312 std::string api_features_str;
268 ASSERT_TRUE(base::ReadFileToString( 313 ASSERT_TRUE(base::ReadFileToString(
269 api_features_path, &api_features_str)) << "api_features.json"; 314 api_features_path, &api_features_str)) << "api_features.json";
270 315
271 std::unique_ptr<base::DictionaryValue> value( 316 std::unique_ptr<base::DictionaryValue> value(
272 static_cast<base::DictionaryValue*>( 317 static_cast<base::DictionaryValue*>(
273 base::JSONReader::Read(api_features_str).release())); 318 base::JSONReader::Read(api_features_str).release()));
274 JSONFeatureProvider api_feature_provider(*value, CreateAPIFeature); 319 JSONFeatureProvider api_feature_provider(*value, CreateAPIFeature);
275 320
276 for (size_t i = 0; i < arraysize(test_data); ++i) { 321 for (size_t i = 0; i < arraysize(test_data); ++i) {
277 ExtensionAPI api; 322 ExtensionAPI api;
278 api.RegisterDependencyProvider("api", &api_feature_provider); 323 api.RegisterDependencyProvider("api", &api_feature_provider);
279 for (base::DictionaryValue::Iterator iter(*value); !iter.IsAtEnd(); 324 for (base::DictionaryValue::Iterator iter(*value); !iter.IsAtEnd();
280 iter.Advance()) { 325 iter.Advance()) {
281 if (iter.key().find(".") == std::string::npos) 326 if (iter.key().find(".") == std::string::npos)
282 api.RegisterSchemaResource(iter.key(), 0); 327 api.RegisterSchemaResource(iter.key(), 0);
283 } 328 }
284 329
285 Feature* test_feature = 330 Feature* test_feature =
286 api_feature_provider.GetFeature(test_data[i].api_full_name); 331 api_feature_provider.GetFeature(test_data[i].api_full_name);
287 ASSERT_TRUE(test_feature); 332 ASSERT_TRUE(test_feature);
288 EXPECT_EQ(test_data[i].expect_is_available, 333 EXPECT_EQ(test_data[i].expect_is_available,
289 api.IsAnyFeatureAvailableToContext(*test_feature, 334 api.IsAnyFeatureAvailableToContext(
290 test_data[i].extension, 335 *test_feature, test_data[i].extension, test_data[i].context,
291 test_data[i].context, 336 test_data[i].session_type, test_data[i].url))
292 test_data[i].url))
293 << i; 337 << i;
294 } 338 }
295 } 339 }
296 340
297 TEST(ExtensionAPITest, LazyGetSchema) { 341 TEST(ExtensionAPITest, LazyGetSchema) {
298 std::unique_ptr<ExtensionAPI> apis( 342 std::unique_ptr<ExtensionAPI> apis(
299 ExtensionAPI::CreateWithDefaultConfiguration()); 343 ExtensionAPI::CreateWithDefaultConfiguration());
300 344
301 EXPECT_EQ(NULL, apis->GetSchema(std::string())); 345 EXPECT_EQ(NULL, apis->GetSchema(std::string()));
302 EXPECT_EQ(NULL, apis->GetSchema(std::string())); 346 EXPECT_EQ(NULL, apis->GetSchema(std::string()));
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
356 extension = CreateExtensionWithPermissions(permissions); 400 extension = CreateExtensionWithPermissions(permissions);
357 } 401 }
358 402
359 std::unique_ptr<ExtensionAPI> extension_api( 403 std::unique_ptr<ExtensionAPI> extension_api(
360 ExtensionAPI::CreateWithDefaultConfiguration()); 404 ExtensionAPI::CreateWithDefaultConfiguration());
361 405
362 const FeatureProvider& api_features = *FeatureProvider::GetAPIFeatures(); 406 const FeatureProvider& api_features = *FeatureProvider::GetAPIFeatures();
363 407
364 // "storage" is completely unprivileged. 408 // "storage" is completely unprivileged.
365 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext( 409 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext(
366 *api_features.GetFeature("storage"), 410 *api_features.GetFeature("storage"), NULL,
367 NULL, 411 Feature::BLESSED_EXTENSION_CONTEXT, Feature::SESSION_TYPE_UNSPECIFIED,
368 Feature::BLESSED_EXTENSION_CONTEXT,
369 GURL())); 412 GURL()));
370 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext( 413 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext(
371 *api_features.GetFeature("storage"), 414 *api_features.GetFeature("storage"), NULL,
372 NULL, 415 Feature::UNBLESSED_EXTENSION_CONTEXT, Feature::SESSION_TYPE_UNSPECIFIED,
373 Feature::UNBLESSED_EXTENSION_CONTEXT,
374 GURL())); 416 GURL()));
375 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext( 417 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext(
376 *api_features.GetFeature("storage"), 418 *api_features.GetFeature("storage"), NULL,
377 NULL, 419 Feature::CONTENT_SCRIPT_CONTEXT, Feature::SESSION_TYPE_UNSPECIFIED,
378 Feature::CONTENT_SCRIPT_CONTEXT,
379 GURL())); 420 GURL()));
380 421
381 // "extension" is partially unprivileged. 422 // "extension" is partially unprivileged.
382 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext( 423 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext(
383 *api_features.GetFeature("extension"), 424 *api_features.GetFeature("extension"), NULL,
384 NULL, 425 Feature::BLESSED_EXTENSION_CONTEXT, Feature::SESSION_TYPE_UNSPECIFIED,
385 Feature::BLESSED_EXTENSION_CONTEXT,
386 GURL())); 426 GURL()));
387 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext( 427 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext(
388 *api_features.GetFeature("extension"), 428 *api_features.GetFeature("extension"), NULL,
389 NULL, 429 Feature::UNBLESSED_EXTENSION_CONTEXT, Feature::SESSION_TYPE_UNSPECIFIED,
390 Feature::UNBLESSED_EXTENSION_CONTEXT,
391 GURL())); 430 GURL()));
392 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext( 431 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext(
393 *api_features.GetFeature("extension"), 432 *api_features.GetFeature("extension"), NULL,
394 NULL, 433 Feature::CONTENT_SCRIPT_CONTEXT, Feature::SESSION_TYPE_UNSPECIFIED,
395 Feature::CONTENT_SCRIPT_CONTEXT,
396 GURL())); 434 GURL()));
397 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext( 435 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext(
398 *api_features.GetFeature("extension.getURL"), 436 *api_features.GetFeature("extension.getURL"), NULL,
399 NULL, 437 Feature::CONTENT_SCRIPT_CONTEXT, Feature::SESSION_TYPE_UNSPECIFIED,
400 Feature::CONTENT_SCRIPT_CONTEXT,
401 GURL())); 438 GURL()));
402 439
403 // "history" is entirely privileged. 440 // "history" is entirely privileged.
404 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext( 441 EXPECT_TRUE(extension_api->IsAnyFeatureAvailableToContext(
405 *api_features.GetFeature("history"), 442 *api_features.GetFeature("history"), NULL,
406 NULL, 443 Feature::BLESSED_EXTENSION_CONTEXT, Feature::SESSION_TYPE_UNSPECIFIED,
407 Feature::BLESSED_EXTENSION_CONTEXT,
408 GURL())); 444 GURL()));
409 EXPECT_FALSE(extension_api->IsAnyFeatureAvailableToContext( 445 EXPECT_FALSE(extension_api->IsAnyFeatureAvailableToContext(
410 *api_features.GetFeature("history"), 446 *api_features.GetFeature("history"), NULL,
411 NULL, 447 Feature::UNBLESSED_EXTENSION_CONTEXT, Feature::SESSION_TYPE_UNSPECIFIED,
412 Feature::UNBLESSED_EXTENSION_CONTEXT,
413 GURL())); 448 GURL()));
414 EXPECT_FALSE(extension_api->IsAnyFeatureAvailableToContext( 449 EXPECT_FALSE(extension_api->IsAnyFeatureAvailableToContext(
415 *api_features.GetFeature("history"), 450 *api_features.GetFeature("history"), NULL,
416 NULL, 451 Feature::CONTENT_SCRIPT_CONTEXT, Feature::SESSION_TYPE_UNSPECIFIED,
417 Feature::CONTENT_SCRIPT_CONTEXT,
418 GURL())); 452 GURL()));
419 } 453 }
420 454
421 scoped_refptr<Extension> CreateHostedApp() { 455 scoped_refptr<Extension> CreateHostedApp() {
422 base::DictionaryValue values; 456 base::DictionaryValue values;
423 values.SetString(manifest_keys::kName, "test"); 457 values.SetString(manifest_keys::kName, "test");
424 values.SetString(manifest_keys::kVersion, "0.1"); 458 values.SetString(manifest_keys::kVersion, "0.1");
425 values.Set(manifest_keys::kWebURLs, new base::ListValue()); 459 values.Set(manifest_keys::kWebURLs, new base::ListValue());
426 values.SetString(manifest_keys::kLaunchWebURL, 460 values.SetString(manifest_keys::kLaunchWebURL,
427 "http://www.example.com"); 461 "http://www.example.com");
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
465 return extension; 499 return extension;
466 } 500 }
467 501
468 TEST(ExtensionAPITest, HostedAppPermissions) { 502 TEST(ExtensionAPITest, HostedAppPermissions) {
469 scoped_refptr<Extension> extension = CreateHostedApp(); 503 scoped_refptr<Extension> extension = CreateHostedApp();
470 504
471 std::unique_ptr<ExtensionAPI> extension_api( 505 std::unique_ptr<ExtensionAPI> extension_api(
472 ExtensionAPI::CreateWithDefaultConfiguration()); 506 ExtensionAPI::CreateWithDefaultConfiguration());
473 507
474 // "runtime" and "tabs" should not be available in hosted apps. 508 // "runtime" and "tabs" should not be available in hosted apps.
475 EXPECT_FALSE(extension_api->IsAvailable("runtime", 509 EXPECT_FALSE(extension_api
476 extension.get(), 510 ->IsAvailable("runtime", extension.get(),
477 Feature::BLESSED_EXTENSION_CONTEXT, 511 Feature::BLESSED_EXTENSION_CONTEXT,
478 GURL()).is_available()); 512 Feature::SESSION_TYPE_UNSPECIFIED, GURL())
479 EXPECT_FALSE(extension_api->IsAvailable("runtime.id", 513 .is_available());
480 extension.get(), 514 EXPECT_FALSE(extension_api
481 Feature::BLESSED_EXTENSION_CONTEXT, 515 ->IsAvailable("runtime.id", extension.get(),
482 GURL()).is_available()); 516 Feature::BLESSED_EXTENSION_CONTEXT,
483 EXPECT_FALSE(extension_api->IsAvailable("runtime.sendMessage", 517 Feature::SESSION_TYPE_UNSPECIFIED, GURL())
484 extension.get(), 518 .is_available());
485 Feature::BLESSED_EXTENSION_CONTEXT, 519 EXPECT_FALSE(extension_api
486 GURL()).is_available()); 520 ->IsAvailable("runtime.sendMessage", extension.get(),
487 EXPECT_FALSE(extension_api->IsAvailable("runtime.sendNativeMessage", 521 Feature::BLESSED_EXTENSION_CONTEXT,
488 extension.get(), 522 Feature::SESSION_TYPE_UNSPECIFIED, GURL())
489 Feature::BLESSED_EXTENSION_CONTEXT, 523 .is_available());
490 GURL()).is_available()); 524 EXPECT_FALSE(extension_api
491 EXPECT_FALSE(extension_api->IsAvailable("tabs.create", 525 ->IsAvailable("runtime.sendNativeMessage", extension.get(),
492 extension.get(), 526 Feature::BLESSED_EXTENSION_CONTEXT,
493 Feature::BLESSED_EXTENSION_CONTEXT, 527 Feature::SESSION_TYPE_UNSPECIFIED, GURL())
494 GURL()).is_available()); 528 .is_available());
529 EXPECT_FALSE(extension_api
530 ->IsAvailable("tabs.create", extension.get(),
531 Feature::BLESSED_EXTENSION_CONTEXT,
532 Feature::SESSION_TYPE_UNSPECIFIED, GURL())
533 .is_available());
495 } 534 }
496 535
497 TEST(ExtensionAPITest, AppAndFriendsAvailability) { 536 TEST(ExtensionAPITest, AppAndFriendsAvailability) {
498 std::unique_ptr<ExtensionAPI> extension_api( 537 std::unique_ptr<ExtensionAPI> extension_api(
499 ExtensionAPI::CreateWithDefaultConfiguration()); 538 ExtensionAPI::CreateWithDefaultConfiguration());
500 539
501 // Make sure chrome.app.runtime and chrome.app.window are available to apps, 540 // Make sure chrome.app.runtime and chrome.app.window are available to apps,
502 // and chrome.app is not. 541 // and chrome.app is not.
503 { 542 {
504 std::set<std::string> permissions; 543 std::set<std::string> permissions;
505 permissions.insert("app.runtime"); 544 permissions.insert("app.runtime");
506 permissions.insert("app.window"); 545 permissions.insert("app.window");
507 scoped_refptr<Extension> extension = 546 scoped_refptr<Extension> extension =
508 CreatePackagedAppWithPermissions(permissions); 547 CreatePackagedAppWithPermissions(permissions);
509 EXPECT_FALSE(extension_api->IsAvailable( 548 EXPECT_FALSE(extension_api
510 "app", 549 ->IsAvailable("app", extension.get(),
511 extension.get(), 550 Feature::BLESSED_EXTENSION_CONTEXT,
512 Feature::BLESSED_EXTENSION_CONTEXT, 551 Feature::SESSION_TYPE_UNSPECIFIED,
513 GURL("http://foo.com")).is_available()); 552 GURL("http://foo.com"))
514 EXPECT_TRUE(extension_api->IsAvailable( 553 .is_available());
515 "app.runtime", 554 EXPECT_TRUE(extension_api
516 extension.get(), 555 ->IsAvailable("app.runtime", extension.get(),
517 Feature::BLESSED_EXTENSION_CONTEXT, 556 Feature::BLESSED_EXTENSION_CONTEXT,
518 GURL("http://foo.com")).is_available()); 557 Feature::SESSION_TYPE_UNSPECIFIED,
519 EXPECT_TRUE(extension_api->IsAvailable( 558 GURL("http://foo.com"))
520 "app.window", 559 .is_available());
521 extension.get(), 560 EXPECT_TRUE(extension_api
522 Feature::BLESSED_EXTENSION_CONTEXT, 561 ->IsAvailable("app.window", extension.get(),
523 GURL("http://foo.com")).is_available()); 562 Feature::BLESSED_EXTENSION_CONTEXT,
563 Feature::SESSION_TYPE_UNSPECIFIED,
564 GURL("http://foo.com"))
565 .is_available());
524 } 566 }
525 // Make sure chrome.app.runtime and chrome.app.window are not available to 567 // Make sure chrome.app.runtime and chrome.app.window are not available to
526 // extensions, and chrome.app is. 568 // extensions, and chrome.app is.
527 { 569 {
528 std::set<std::string> permissions; 570 std::set<std::string> permissions;
529 scoped_refptr<Extension> extension = 571 scoped_refptr<Extension> extension =
530 CreateExtensionWithPermissions(permissions); 572 CreateExtensionWithPermissions(permissions);
531 EXPECT_TRUE(extension_api->IsAvailable( 573 EXPECT_TRUE(extension_api
532 "app", 574 ->IsAvailable("app", extension.get(),
533 extension.get(), 575 Feature::BLESSED_EXTENSION_CONTEXT,
534 Feature::BLESSED_EXTENSION_CONTEXT, 576 Feature::SESSION_TYPE_UNSPECIFIED,
535 GURL("http://foo.com")).is_available()); 577 GURL("http://foo.com"))
536 EXPECT_FALSE(extension_api->IsAvailable( 578 .is_available());
537 "app.runtime", 579 EXPECT_FALSE(extension_api
538 extension.get(), 580 ->IsAvailable("app.runtime", extension.get(),
539 Feature::BLESSED_EXTENSION_CONTEXT, 581 Feature::BLESSED_EXTENSION_CONTEXT,
540 GURL("http://foo.com")).is_available()); 582 Feature::SESSION_TYPE_UNSPECIFIED,
541 EXPECT_FALSE(extension_api->IsAvailable( 583 GURL("http://foo.com"))
542 "app.window", 584 .is_available());
543 extension.get(), 585 EXPECT_FALSE(extension_api
544 Feature::BLESSED_EXTENSION_CONTEXT, 586 ->IsAvailable("app.window", extension.get(),
545 GURL("http://foo.com")).is_available()); 587 Feature::BLESSED_EXTENSION_CONTEXT,
588 Feature::SESSION_TYPE_UNSPECIFIED,
589 GURL("http://foo.com"))
590 .is_available());
546 } 591 }
547 } 592 }
548 593
549 TEST(ExtensionAPITest, ExtensionWithDependencies) { 594 TEST(ExtensionAPITest, ExtensionWithDependencies) {
550 // Extension with the "ttsEngine" permission but not the "tts" permission; it 595 // Extension with the "ttsEngine" permission but not the "tts" permission; it
551 // should not automatically get "tts" permission. 596 // should not automatically get "tts" permission.
552 { 597 {
553 scoped_refptr<Extension> extension = 598 scoped_refptr<Extension> extension =
554 CreateExtensionWithPermission("ttsEngine"); 599 CreateExtensionWithPermission("ttsEngine");
555 std::unique_ptr<ExtensionAPI> api( 600 std::unique_ptr<ExtensionAPI> api(
556 ExtensionAPI::CreateWithDefaultConfiguration()); 601 ExtensionAPI::CreateWithDefaultConfiguration());
557 EXPECT_TRUE(api->IsAvailable("ttsEngine", 602 EXPECT_TRUE(api->IsAvailable("ttsEngine", extension.get(),
558 extension.get(),
559 Feature::BLESSED_EXTENSION_CONTEXT, 603 Feature::BLESSED_EXTENSION_CONTEXT,
560 GURL()).is_available()); 604 Feature::SESSION_TYPE_UNSPECIFIED, GURL())
561 EXPECT_FALSE(api->IsAvailable("tts", 605 .is_available());
562 extension.get(), 606 EXPECT_FALSE(api->IsAvailable("tts", extension.get(),
563 Feature::BLESSED_EXTENSION_CONTEXT, 607 Feature::BLESSED_EXTENSION_CONTEXT,
564 GURL()).is_available()); 608 Feature::SESSION_TYPE_UNSPECIFIED, GURL())
609 .is_available());
565 } 610 }
566 611
567 // Conversely, extension with the "tts" permission but not the "ttsEngine" 612 // Conversely, extension with the "tts" permission but not the "ttsEngine"
568 // permission shouldn't get the "ttsEngine" permission. 613 // permission shouldn't get the "ttsEngine" permission.
569 { 614 {
570 scoped_refptr<Extension> extension = 615 scoped_refptr<Extension> extension =
571 CreateExtensionWithPermission("tts"); 616 CreateExtensionWithPermission("tts");
572 std::unique_ptr<ExtensionAPI> api( 617 std::unique_ptr<ExtensionAPI> api(
573 ExtensionAPI::CreateWithDefaultConfiguration()); 618 ExtensionAPI::CreateWithDefaultConfiguration());
574 EXPECT_FALSE(api->IsAvailable("ttsEngine", 619 EXPECT_FALSE(api->IsAvailable("ttsEngine", extension.get(),
575 extension.get(),
576 Feature::BLESSED_EXTENSION_CONTEXT, 620 Feature::BLESSED_EXTENSION_CONTEXT,
577 GURL()).is_available()); 621 Feature::SESSION_TYPE_UNSPECIFIED, GURL())
578 EXPECT_TRUE(api->IsAvailable("tts", 622 .is_available());
579 extension.get(), 623 EXPECT_TRUE(api->IsAvailable("tts", extension.get(),
580 Feature::BLESSED_EXTENSION_CONTEXT, 624 Feature::BLESSED_EXTENSION_CONTEXT,
581 GURL()).is_available()); 625 Feature::SESSION_TYPE_UNSPECIFIED, GURL())
626 .is_available());
582 } 627 }
583 } 628 }
584 629
585 bool MatchesURL( 630 bool MatchesURL(
586 ExtensionAPI* api, const std::string& api_name, const std::string& url) { 631 ExtensionAPI* api, const std::string& api_name, const std::string& url) {
587 return api->IsAvailable( 632 return api
588 api_name, NULL, Feature::WEB_PAGE_CONTEXT, GURL(url)).is_available(); 633 ->IsAvailable(api_name, NULL, Feature::WEB_PAGE_CONTEXT,
634 Feature::SESSION_TYPE_UNSPECIFIED, GURL(url))
635 .is_available();
589 } 636 }
590 637
591 TEST(ExtensionAPITest, URLMatching) { 638 TEST(ExtensionAPITest, URLMatching) {
592 std::unique_ptr<ExtensionAPI> api( 639 std::unique_ptr<ExtensionAPI> api(
593 ExtensionAPI::CreateWithDefaultConfiguration()); 640 ExtensionAPI::CreateWithDefaultConfiguration());
594 641
595 // "app" API is available to all URLs that content scripts can be injected. 642 // "app" API is available to all URLs that content scripts can be injected.
596 EXPECT_TRUE(MatchesURL(api.get(), "app", "http://example.com/example.html")); 643 EXPECT_TRUE(MatchesURL(api.get(), "app", "http://example.com/example.html"));
597 EXPECT_TRUE(MatchesURL(api.get(), "app", "https://blah.net")); 644 EXPECT_TRUE(MatchesURL(api.get(), "app", "https://blah.net"));
598 EXPECT_TRUE(MatchesURL(api.get(), "app", "file://somefile.html")); 645 EXPECT_TRUE(MatchesURL(api.get(), "app", "file://somefile.html"));
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after
803 { "runtime.connectNative", false }, 850 { "runtime.connectNative", false },
804 }; 851 };
805 852
806 std::unique_ptr<ExtensionAPI> extension_api( 853 std::unique_ptr<ExtensionAPI> extension_api(
807 ExtensionAPI::CreateWithDefaultConfiguration()); 854 ExtensionAPI::CreateWithDefaultConfiguration());
808 scoped_refptr<Extension> extension = 855 scoped_refptr<Extension> extension =
809 BuildExtension(ExtensionBuilder()).Build(); 856 BuildExtension(ExtensionBuilder()).Build();
810 857
811 for (size_t i = 0; i < arraysize(kTests); ++i) { 858 for (size_t i = 0; i < arraysize(kTests); ++i) {
812 EXPECT_EQ(kTests[i].expect_success, 859 EXPECT_EQ(kTests[i].expect_success,
813 extension_api->IsAvailable(kTests[i].permission_name, 860 extension_api
814 extension.get(), 861 ->IsAvailable(kTests[i].permission_name, extension.get(),
815 Feature::BLESSED_EXTENSION_CONTEXT, 862 Feature::BLESSED_EXTENSION_CONTEXT,
816 GURL()).is_available()) 863 Feature::SESSION_TYPE_UNSPECIFIED, GURL())
864 .is_available())
817 << "Permission being tested: " << kTests[i].permission_name; 865 << "Permission being tested: " << kTests[i].permission_name;
818 } 866 }
819 } 867 }
820 868
821 // Tests that permissions that require manifest keys are available when those 869 // Tests that permissions that require manifest keys are available when those
822 // keys are present. 870 // keys are present.
823 TEST(ExtensionAPITest, ManifestKeys) { 871 TEST(ExtensionAPITest, ManifestKeys) {
824 std::unique_ptr<ExtensionAPI> extension_api( 872 std::unique_ptr<ExtensionAPI> extension_api(
825 ExtensionAPI::CreateWithDefaultConfiguration()); 873 ExtensionAPI::CreateWithDefaultConfiguration());
826 874
827 scoped_refptr<Extension> extension = 875 scoped_refptr<Extension> extension =
828 BuildExtension(ExtensionBuilder()) 876 BuildExtension(ExtensionBuilder())
829 .MergeManifest(DictionaryBuilder() 877 .MergeManifest(DictionaryBuilder()
830 .Set("browser_action", DictionaryBuilder().Build()) 878 .Set("browser_action", DictionaryBuilder().Build())
831 .Build()) 879 .Build())
832 .Build(); 880 .Build();
833 881
834 EXPECT_TRUE(extension_api->IsAvailable("browserAction", 882 EXPECT_TRUE(extension_api
835 extension.get(), 883 ->IsAvailable("browserAction", extension.get(),
836 Feature::BLESSED_EXTENSION_CONTEXT, 884 Feature::BLESSED_EXTENSION_CONTEXT,
837 GURL()).is_available()); 885 Feature::SESSION_TYPE_UNSPECIFIED, GURL())
838 EXPECT_FALSE(extension_api->IsAvailable("pageAction", 886 .is_available());
839 extension.get(), 887 EXPECT_FALSE(extension_api
840 Feature::BLESSED_EXTENSION_CONTEXT, 888 ->IsAvailable("pageAction", extension.get(),
841 GURL()).is_available()); 889 Feature::BLESSED_EXTENSION_CONTEXT,
890 Feature::SESSION_TYPE_UNSPECIFIED, GURL())
891 .is_available());
842 } 892 }
843 893
844 } // namespace extensions 894 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698