| 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 |