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

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

Issue 14494013: Allow API functions and events to have entries in _api_features.json (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix bug in searching for unprivileged Created 7 years, 7 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 | Annotate | Revision Log
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 "chrome/common/extensions/api/extension_api.h" 5 #include "chrome/common/extensions/api/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"
11 #include "base/files/file_path.h" 11 #include "base/files/file_path.h"
12 #include "base/json/json_reader.h" 12 #include "base/json/json_reader.h"
13 #include "base/json/json_writer.h" 13 #include "base/json/json_writer.h"
14 #include "base/memory/ref_counted.h" 14 #include "base/memory/ref_counted.h"
15 #include "base/memory/scoped_ptr.h" 15 #include "base/memory/scoped_ptr.h"
16 #include "base/path_service.h" 16 #include "base/path_service.h"
17 #include "base/stringprintf.h" 17 #include "base/stringprintf.h"
18 #include "base/values.h" 18 #include "base/values.h"
19 #include "chrome/common/chrome_paths.h" 19 #include "chrome/common/chrome_paths.h"
20 #include "chrome/common/extensions/extension.h" 20 #include "chrome/common/extensions/extension.h"
21 #include "chrome/common/extensions/extension_manifest_constants.h"
21 #include "chrome/common/extensions/features/api_feature.h" 22 #include "chrome/common/extensions/features/api_feature.h"
22 #include "chrome/common/extensions/features/base_feature_provider.h" 23 #include "chrome/common/extensions/features/base_feature_provider.h"
23 #include "chrome/common/extensions/features/simple_feature.h" 24 #include "chrome/common/extensions/features/simple_feature.h"
24 #include "chrome/common/extensions/manifest.h" 25 #include "chrome/common/extensions/manifest.h"
25 #include "testing/gtest/include/gtest/gtest.h" 26 #include "testing/gtest/include/gtest/gtest.h"
26 27
27 namespace extensions { 28 namespace extensions {
28 namespace { 29 namespace {
29 30
30 SimpleFeature* CreateAPIFeature() { 31 SimpleFeature* CreateAPIFeature() {
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
81 EXPECT_EQ(test_data[i].expected_feature_name, feature_name) << i; 82 EXPECT_EQ(test_data[i].expected_feature_name, feature_name) << i;
82 } 83 }
83 } 84 }
84 85
85 TEST(ExtensionAPITest, IsPrivileged) { 86 TEST(ExtensionAPITest, IsPrivileged) {
86 scoped_ptr<ExtensionAPI> extension_api( 87 scoped_ptr<ExtensionAPI> extension_api(
87 ExtensionAPI::CreateWithDefaultConfiguration()); 88 ExtensionAPI::CreateWithDefaultConfiguration());
88 89
89 EXPECT_FALSE(extension_api->IsPrivileged("runtime.connect")); 90 EXPECT_FALSE(extension_api->IsPrivileged("runtime.connect"));
90 EXPECT_FALSE(extension_api->IsPrivileged("runtime.onConnect")); 91 EXPECT_FALSE(extension_api->IsPrivileged("runtime.onConnect"));
91 92 EXPECT_FALSE(extension_api->IsPrivileged("runtime.lastError"));
92 // Properties are not supported yet.
93 EXPECT_TRUE(extension_api->IsPrivileged("runtime.lastError"));
94 93
95 // Default unknown names to privileged for paranoia's sake. 94 // Default unknown names to privileged for paranoia's sake.
96 EXPECT_TRUE(extension_api->IsPrivileged(std::string())); 95 EXPECT_TRUE(extension_api->IsPrivileged(std::string()));
97 EXPECT_TRUE(extension_api->IsPrivileged("<unknown-namespace>")); 96 EXPECT_TRUE(extension_api->IsPrivileged("<unknown-namespace>"));
98 EXPECT_TRUE(extension_api->IsPrivileged("extension.<unknown-member>")); 97 EXPECT_TRUE(extension_api->IsPrivileged("extension.<unknown-member>"));
99 98
100 // Exists, but privileged. 99 // Exists, but privileged.
101 EXPECT_TRUE(extension_api->IsPrivileged("extension.getViews")); 100 EXPECT_TRUE(extension_api->IsPrivileged("extension.getViews"));
102 EXPECT_TRUE(extension_api->IsPrivileged("history.search")); 101 EXPECT_TRUE(extension_api->IsPrivileged("history.search"));
103 102
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
214 } 213 }
215 214
216 EXPECT_EQ(test_data[i].expect_is_available, 215 EXPECT_EQ(test_data[i].expect_is_available,
217 api.IsAvailable(test_data[i].api_full_name, 216 api.IsAvailable(test_data[i].api_full_name,
218 NULL, 217 NULL,
219 test_data[i].context, 218 test_data[i].context,
220 test_data[i].url).is_available()) << i; 219 test_data[i].url).is_available()) << i;
221 } 220 }
222 } 221 }
223 222
223 TEST(ExtensionAPI, IsAnyFeatureAvailableToContext) {
224 struct {
225 std::string api_full_name;
226 bool expect_is_available;
227 Feature::Context context;
228 GURL url;
229 } test_data[] = {
230 { "test1", false, Feature::WEB_PAGE_CONTEXT, GURL() },
231 { "test1", true, Feature::UNBLESSED_EXTENSION_CONTEXT, GURL() },
232 { "test2", true, Feature::CONTENT_SCRIPT_CONTEXT, GURL() },
233 { "test2", true, Feature::WEB_PAGE_CONTEXT, GURL("http://google.com") },
234 { "test2.foo", false, Feature::WEB_PAGE_CONTEXT,
235 GURL("http://google.com") },
236 { "test3", true, Feature::CONTENT_SCRIPT_CONTEXT, GURL() },
237 { "test3", true, Feature::WEB_PAGE_CONTEXT, GURL("http://foo.com") },
238 { "test4.foo", true, Feature::CONTENT_SCRIPT_CONTEXT, GURL() },
239 { "test7", false, Feature::WEB_PAGE_CONTEXT, GURL("http://google.com") },
240 { "test7", true, Feature::WEB_PAGE_CONTEXT, GURL("http://foo.com") },
241 { "test7", false, Feature::WEB_PAGE_CONTEXT, GURL("http://bar.com") }
242 };
243
244 base::FilePath api_features_path;
245 PathService::Get(chrome::DIR_TEST_DATA, &api_features_path);
246 api_features_path = api_features_path.AppendASCII("extensions")
247 .AppendASCII("extension_api_unittest")
248 .AppendASCII("api_features.json");
249
250 std::string api_features_str;
251 ASSERT_TRUE(file_util::ReadFileToString(
252 api_features_path, &api_features_str)) << "api_features.json";
253
254 scoped_ptr<base::DictionaryValue> value(static_cast<DictionaryValue*>(
255 base::JSONReader::Read(api_features_str)));
256 BaseFeatureProvider api_feature_provider(*value, CreateAPIFeature);
257
258 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_data); ++i) {
259 ExtensionAPI api;
260 api.RegisterDependencyProvider("api", &api_feature_provider);
261 for (base::DictionaryValue::Iterator iter(*value); !iter.IsAtEnd();
262 iter.Advance()) {
263 if (iter.key().find(".") == std::string::npos)
264 api.RegisterSchema(iter.key(), "");
265 }
266
267 EXPECT_EQ(test_data[i].expect_is_available,
268 api.IsAnyFeatureAvailableToContext(test_data[i].api_full_name,
269 test_data[i].context,
270 test_data[i].url)) << i;
271 }
272 }
273
224 TEST(ExtensionAPITest, LazyGetSchema) { 274 TEST(ExtensionAPITest, LazyGetSchema) {
225 scoped_ptr<ExtensionAPI> apis(ExtensionAPI::CreateWithDefaultConfiguration()); 275 scoped_ptr<ExtensionAPI> apis(ExtensionAPI::CreateWithDefaultConfiguration());
226 276
227 EXPECT_EQ(NULL, apis->GetSchema(std::string())); 277 EXPECT_EQ(NULL, apis->GetSchema(std::string()));
228 EXPECT_EQ(NULL, apis->GetSchema(std::string())); 278 EXPECT_EQ(NULL, apis->GetSchema(std::string()));
229 EXPECT_EQ(NULL, apis->GetSchema("experimental")); 279 EXPECT_EQ(NULL, apis->GetSchema("experimental"));
230 EXPECT_EQ(NULL, apis->GetSchema("experimental")); 280 EXPECT_EQ(NULL, apis->GetSchema("experimental"));
231 EXPECT_EQ(NULL, apis->GetSchema("foo")); 281 EXPECT_EQ(NULL, apis->GetSchema("foo"));
232 EXPECT_EQ(NULL, apis->GetSchema("foo")); 282 EXPECT_EQ(NULL, apis->GetSchema("foo"));
233 283
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
280 { 330 {
281 std::set<std::string> permissions; 331 std::set<std::string> permissions;
282 permissions.insert("storage"); 332 permissions.insert("storage");
283 permissions.insert("history"); 333 permissions.insert("history");
284 extension = CreateExtensionWithPermissions(permissions); 334 extension = CreateExtensionWithPermissions(permissions);
285 } 335 }
286 336
287 scoped_ptr<ExtensionAPI> extension_api( 337 scoped_ptr<ExtensionAPI> extension_api(
288 ExtensionAPI::CreateWithDefaultConfiguration()); 338 ExtensionAPI::CreateWithDefaultConfiguration());
289 339
340 // "runtime" has privileged parts that should not be accessed by content
341 // scripts.
342 EXPECT_FALSE(extension_api->IsAvailable("runtime",
343 extension.get(),
344 Feature::CONTENT_SCRIPT_CONTEXT,
345 GURL()).is_available());
346 EXPECT_FALSE(extension_api->IsAvailable("runtime.sendNativeMessage",
347 extension.get(),
348 Feature::CONTENT_SCRIPT_CONTEXT,
349 GURL()).is_available());
350 // "runtime" also has unprivileged parts.
351 EXPECT_TRUE(extension_api->IsAvailable("runtime.sendMessage",
352 extension.get(),
353 Feature::CONTENT_SCRIPT_CONTEXT,
354 GURL()).is_available());
355 EXPECT_TRUE(extension_api->IsAvailable("runtime.id",
356 extension.get(),
357 Feature::CONTENT_SCRIPT_CONTEXT,
358 GURL()).is_available());
359
290 // "storage" is completely unprivileged. 360 // "storage" is completely unprivileged.
291 EXPECT_TRUE(extension_api->IsAvailable("storage", 361 EXPECT_TRUE(extension_api->IsAvailable("storage",
292 extension.get(), 362 extension.get(),
293 Feature::BLESSED_EXTENSION_CONTEXT, 363 Feature::BLESSED_EXTENSION_CONTEXT,
294 GURL()).is_available()); 364 GURL()).is_available());
295 EXPECT_TRUE(extension_api->IsAvailable("storage", 365 EXPECT_TRUE(extension_api->IsAvailable("storage",
296 extension.get(), 366 extension.get(),
297 Feature::UNBLESSED_EXTENSION_CONTEXT, 367 Feature::UNBLESSED_EXTENSION_CONTEXT,
298 GURL()).is_available()); 368 GURL()).is_available());
299 EXPECT_TRUE(extension_api->IsAvailable("storage", 369 EXPECT_TRUE(extension_api->IsAvailable("storage",
(...skipping 23 matching lines...) Expand all
323 EXPECT_FALSE(extension_api->IsAvailable("history", 393 EXPECT_FALSE(extension_api->IsAvailable("history",
324 extension.get(), 394 extension.get(),
325 Feature::UNBLESSED_EXTENSION_CONTEXT, 395 Feature::UNBLESSED_EXTENSION_CONTEXT,
326 GURL()).is_available()); 396 GURL()).is_available());
327 EXPECT_FALSE(extension_api->IsAvailable("history", 397 EXPECT_FALSE(extension_api->IsAvailable("history",
328 extension.get(), 398 extension.get(),
329 Feature::CONTENT_SCRIPT_CONTEXT, 399 Feature::CONTENT_SCRIPT_CONTEXT,
330 GURL()).is_available()); 400 GURL()).is_available());
331 } 401 }
332 402
403 scoped_refptr<Extension> CreateHostedApp() {
404 base::DictionaryValue values;
405 values.SetString(extension_manifest_keys::kName, "test");
406 values.SetString(extension_manifest_keys::kVersion, "0.1");
407 values.Set(extension_manifest_keys::kWebURLs, new base::ListValue());
408 values.SetString(extension_manifest_keys::kLaunchWebURL,
409 "http://www.example.com");
410
411 std::string error;
412 scoped_refptr<Extension> extension(Extension::Create(
413 base::FilePath(), Manifest::INTERNAL, values, Extension::NO_FLAGS,
414 &error));
415 CHECK(extension.get());
416 return extension;
417 }
418
419 TEST(ExtensionAPITest, HostedAppPermissions) {
420 scoped_refptr<Extension> extension = CreateHostedApp();
421
422 scoped_ptr<ExtensionAPI> extension_api(
423 ExtensionAPI::CreateWithDefaultConfiguration());
424
425 // "runtime" should not be available in hosted apps.
426 EXPECT_FALSE(extension_api->IsAvailable("runtime",
427 extension.get(),
428 Feature::BLESSED_EXTENSION_CONTEXT,
429 GURL()).is_available());
430 EXPECT_FALSE(extension_api->IsAvailable("runtime.id",
431 extension.get(),
432 Feature::BLESSED_EXTENSION_CONTEXT,
433 GURL()).is_available());
434 EXPECT_FALSE(extension_api->IsAvailable("runtime.sendMessage",
435 extension.get(),
436 Feature::BLESSED_EXTENSION_CONTEXT,
437 GURL()).is_available());
438 EXPECT_FALSE(extension_api->IsAvailable("runtime.sendNativeMessage",
439 extension.get(),
440 Feature::BLESSED_EXTENSION_CONTEXT,
441 GURL()).is_available());
442 }
443
333 TEST(ExtensionAPITest, ExtensionWithDependencies) { 444 TEST(ExtensionAPITest, ExtensionWithDependencies) {
334 // Extension with the "ttsEngine" permission but not the "tts" permission; it 445 // Extension with the "ttsEngine" permission but not the "tts" permission; it
335 // should not automatically get "tts" permission. 446 // should not automatically get "tts" permission.
336 { 447 {
337 scoped_refptr<Extension> extension = 448 scoped_refptr<Extension> extension =
338 CreateExtensionWithPermission("ttsEngine"); 449 CreateExtensionWithPermission("ttsEngine");
339 scoped_ptr<ExtensionAPI> api( 450 scoped_ptr<ExtensionAPI> api(
340 ExtensionAPI::CreateWithDefaultConfiguration()); 451 ExtensionAPI::CreateWithDefaultConfiguration());
341 EXPECT_TRUE(api->IsAvailable("ttsEngine", 452 EXPECT_TRUE(api->IsAvailable("ttsEngine",
342 extension.get(), 453 extension.get(),
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after
553 GetDictionaryFromList(dict, "parameters", 0, &sub_dict); 664 GetDictionaryFromList(dict, "parameters", 0, &sub_dict);
554 EXPECT_TRUE(sub_dict->GetString("$ref", &type)); 665 EXPECT_TRUE(sub_dict->GetString("$ref", &type));
555 EXPECT_EQ("test.foo.TestType", type); 666 EXPECT_EQ("test.foo.TestType", type);
556 GetDictionaryFromList(dict, "parameters", 1, &sub_dict); 667 GetDictionaryFromList(dict, "parameters", 1, &sub_dict);
557 EXPECT_TRUE(sub_dict->GetString("$ref", &type)); 668 EXPECT_TRUE(sub_dict->GetString("$ref", &type));
558 EXPECT_EQ("fully.qualified.Type", type); 669 EXPECT_EQ("fully.qualified.Type", type);
559 } 670 }
560 671
561 } // namespace 672 } // namespace
562 } // namespace extensions 673 } // namespace extensions
OLDNEW
« no previous file with comments | « chrome/common/extensions/api/extension_api.cc ('k') | chrome/common/extensions/api/runtime.json » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698