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 "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_path.h" | 10 #include "base/file_path.h" |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
92 } | 92 } |
93 } | 93 } |
94 | 94 |
95 TEST(ExtensionAPI, IsPrivileged) { | 95 TEST(ExtensionAPI, IsPrivileged) { |
96 scoped_ptr<ExtensionAPI> extension_api( | 96 scoped_ptr<ExtensionAPI> extension_api( |
97 ExtensionAPI::CreateWithDefaultConfiguration()); | 97 ExtensionAPI::CreateWithDefaultConfiguration()); |
98 | 98 |
99 EXPECT_FALSE(extension_api->IsPrivileged("extension.connect")); | 99 EXPECT_FALSE(extension_api->IsPrivileged("extension.connect")); |
100 EXPECT_FALSE(extension_api->IsPrivileged("extension.onConnect")); | 100 EXPECT_FALSE(extension_api->IsPrivileged("extension.onConnect")); |
101 | 101 |
102 // Properties are not supported yet. | 102 // Properties are not supported yet, but the default for this module is |
103 EXPECT_TRUE(extension_api->IsPrivileged("extension.lastError")); | 103 // unprivileged, so that's what we see. |
| 104 EXPECT_FALSE(extension_api->IsPrivileged("extension.lastError")); |
104 | 105 |
105 // Default unknown names to privileged for paranoia's sake. | 106 // Default unknown modules to privileged for paranoia's sake. |
106 EXPECT_TRUE(extension_api->IsPrivileged("")); | 107 EXPECT_TRUE(extension_api->IsPrivileged("")); |
107 EXPECT_TRUE(extension_api->IsPrivileged("<unknown-namespace>")); | 108 EXPECT_TRUE(extension_api->IsPrivileged("<unknown-namespace>")); |
108 EXPECT_TRUE(extension_api->IsPrivileged("extension.<unknown-member>")); | 109 |
| 110 // Default unknown names within a module to the parent's value. |
| 111 EXPECT_FALSE(extension_api->IsPrivileged("extension.<unknown-member>")); |
109 | 112 |
110 // Exists, but privileged. | 113 // Exists, but privileged. |
111 EXPECT_TRUE(extension_api->IsPrivileged("extension.getViews")); | 114 EXPECT_TRUE(extension_api->IsPrivileged("extension.getViews")); |
112 EXPECT_TRUE(extension_api->IsPrivileged("history.search")); | 115 EXPECT_TRUE(extension_api->IsPrivileged("history.search")); |
113 | 116 |
114 // Whole APIs that are unprivileged. | 117 // Whole APIs that are unprivileged. |
115 EXPECT_FALSE(extension_api->IsPrivileged("app.getDetails")); | 118 EXPECT_FALSE(extension_api->IsPrivileged("app.getDetails")); |
116 EXPECT_FALSE(extension_api->IsPrivileged("app.isInstalled")); | 119 EXPECT_FALSE(extension_api->IsPrivileged("app.isInstalled")); |
117 EXPECT_FALSE(extension_api->IsPrivileged("storage.local")); | 120 EXPECT_FALSE(extension_api->IsPrivileged("storage.local")); |
118 EXPECT_FALSE(extension_api->IsPrivileged("storage.local.onChanged")); | 121 EXPECT_FALSE(extension_api->IsPrivileged("storage.local.onChanged")); |
119 EXPECT_FALSE(extension_api->IsPrivileged("storage.local.set")); | 122 EXPECT_FALSE(extension_api->IsPrivileged("storage.local.set")); |
120 EXPECT_FALSE(extension_api->IsPrivileged("storage.local.MAX_ITEMS")); | 123 EXPECT_FALSE(extension_api->IsPrivileged("storage.local.MAX_ITEMS")); |
121 EXPECT_FALSE(extension_api->IsPrivileged("storage.set")); | 124 EXPECT_FALSE(extension_api->IsPrivileged("storage.set")); |
122 } | 125 } |
123 | 126 |
124 TEST(ExtensionAPI, IsPrivilegedFeatures) { | 127 TEST(ExtensionAPI, IsPrivilegedFeatures) { |
125 struct { | 128 struct { |
126 std::string filename; | 129 std::string filename; |
127 std::string api_full_name; | 130 std::string api_full_name; |
128 bool expect_is_privilged; | 131 bool expect_is_privilged; |
129 Feature::Context test2_contexts; | 132 Feature::Context test2_contexts; |
130 } test_data[] = { | 133 } test_data[] = { |
131 { "is_privileged_features_1.json", "test", false, | 134 { "is_privileged_features_1.json", "test", false, |
132 Feature::UNSPECIFIED_CONTEXT }, | 135 Feature::UNSPECIFIED_CONTEXT }, |
133 { "is_privileged_features_2.json", "test", true, | 136 { "is_privileged_features_2.json", "test", true, |
134 Feature::UNSPECIFIED_CONTEXT }, | 137 Feature::UNSPECIFIED_CONTEXT }, |
135 { "is_privileged_features_3.json", "test", false, | 138 { "is_privileged_features_3.json", "test", false, |
136 Feature::UNSPECIFIED_CONTEXT }, | 139 Feature::UNSPECIFIED_CONTEXT }, |
137 { "is_privileged_features_4.json", "test.bar", false, | 140 { "is_privileged_features_5.json", "test.bar", true, |
| 141 Feature::BLESSED_EXTENSION_CONTEXT }, |
| 142 // These are privileged because a child always depends on its parent. So |
| 143 // even if the child is more permissive than its parent, it still ends up |
| 144 // having the same requirements. |
| 145 { "is_privileged_features_4.json", "test.bar", true, |
138 Feature::UNSPECIFIED_CONTEXT }, | 146 Feature::UNSPECIFIED_CONTEXT }, |
139 { "is_privileged_features_5.json", "test.bar", true, | 147 { "is_privileged_features_5.json", "test.bar", true, |
140 Feature::BLESSED_EXTENSION_CONTEXT }, | |
141 { "is_privileged_features_5.json", "test.bar", false, | |
142 Feature::UNBLESSED_EXTENSION_CONTEXT } | 148 Feature::UNBLESSED_EXTENSION_CONTEXT } |
143 }; | 149 }; |
144 | 150 |
145 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_data); ++i) { | 151 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_data); ++i) { |
146 FilePath manifest_path; | 152 FilePath manifest_path; |
147 PathService::Get(chrome::DIR_TEST_DATA, &manifest_path); | 153 PathService::Get(chrome::DIR_TEST_DATA, &manifest_path); |
148 manifest_path = manifest_path.AppendASCII("extensions") | 154 manifest_path = manifest_path.AppendASCII("extensions") |
149 .AppendASCII("extension_api_unittest") | 155 .AppendASCII("extension_api_unittest") |
150 .AppendASCII(test_data[i].filename); | 156 .AppendASCII(test_data[i].filename); |
151 | 157 |
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
343 scoped_ptr<ExtensionAPI> api(ExtensionAPI::CreateWithDefaultConfiguration()); | 349 scoped_ptr<ExtensionAPI> api(ExtensionAPI::CreateWithDefaultConfiguration()); |
344 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_data); ++i) { | 350 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_data); ++i) { |
345 std::string child_name; | 351 std::string child_name; |
346 std::string api_name = api->GetAPINameFromFullName(test_data[i].input, | 352 std::string api_name = api->GetAPINameFromFullName(test_data[i].input, |
347 &child_name); | 353 &child_name); |
348 EXPECT_EQ(test_data[i].api_name, api_name) << test_data[i].input; | 354 EXPECT_EQ(test_data[i].api_name, api_name) << test_data[i].input; |
349 EXPECT_EQ(test_data[i].child_name, child_name) << test_data[i].input; | 355 EXPECT_EQ(test_data[i].child_name, child_name) << test_data[i].input; |
350 } | 356 } |
351 } | 357 } |
352 | 358 |
353 TEST(ExtensionAPI, DefaultConfigurationFeatures) { | |
354 scoped_ptr<ExtensionAPI> api(ExtensionAPI::CreateWithDefaultConfiguration()); | |
355 | |
356 Feature* bookmarks = api->GetFeature("bookmarks"); | |
357 Feature* bookmarks_create = api->GetFeature("bookmarks.create"); | |
358 | |
359 struct { | |
360 Feature* feature; | |
361 // TODO(aa): More stuff to test over time. | |
362 } test_data[] = { | |
363 { bookmarks }, | |
364 { bookmarks_create } | |
365 }; | |
366 | |
367 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_data); ++i) { | |
368 Feature* feature = test_data[i].feature; | |
369 ASSERT_TRUE(feature) << i; | |
370 | |
371 EXPECT_TRUE(feature->whitelist()->empty()); | |
372 EXPECT_TRUE(feature->extension_types()->empty()); | |
373 | |
374 EXPECT_EQ(1u, feature->contexts()->size()); | |
375 EXPECT_TRUE(feature->contexts()->count( | |
376 Feature::BLESSED_EXTENSION_CONTEXT)); | |
377 | |
378 EXPECT_EQ(Feature::UNSPECIFIED_LOCATION, feature->location()); | |
379 EXPECT_EQ(Feature::UNSPECIFIED_PLATFORM, feature->platform()); | |
380 EXPECT_EQ(0, feature->min_manifest_version()); | |
381 EXPECT_EQ(0, feature->max_manifest_version()); | |
382 } | |
383 } | |
384 | |
385 TEST(ExtensionAPI, FeaturesRequireContexts) { | |
386 scoped_ptr<ListValue> schema1(new ListValue()); | |
387 DictionaryValue* feature_definition = new DictionaryValue(); | |
388 schema1->Append(feature_definition); | |
389 feature_definition->SetString("namespace", "test"); | |
390 feature_definition->SetBoolean("uses_feature_system", true); | |
391 | |
392 scoped_ptr<ListValue> schema2(schema1->DeepCopy()); | |
393 | |
394 ListValue* contexts = new ListValue(); | |
395 contexts->Append(Value::CreateStringValue("content_script")); | |
396 feature_definition->Set("contexts", contexts); | |
397 | |
398 struct { | |
399 ListValue* schema; | |
400 bool expect_success; | |
401 } test_data[] = { | |
402 { schema1.get(), true }, | |
403 { schema2.get(), false } | |
404 }; | |
405 | |
406 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_data); ++i) { | |
407 std::string schema_source; | |
408 base::JSONWriter::Write(test_data[i].schema, &schema_source); | |
409 | |
410 ExtensionAPI api; | |
411 api.RegisterSchema("test", base::StringPiece(schema_source)); | |
412 api.LoadAllSchemas(); | |
413 | |
414 Feature* feature = api.GetFeature("test"); | |
415 EXPECT_EQ(test_data[i].expect_success, feature != NULL) << i; | |
416 } | |
417 } | |
418 | |
419 } // namespace | 359 } // namespace |
420 } // namespace extensions | 360 } // namespace extensions |
OLD | NEW |