| 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/files/file_path.h" | 10 #include "base/files/file_path.h" |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 78 for (size_t i = 0; i < arraysize(test_data); ++i) { | 78 for (size_t i = 0; i < arraysize(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, IsAvailableInUntrustedContext) { | |
| 89 scoped_ptr<ExtensionAPI> extension_api( | |
| 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(); | |
| 99 | |
| 100 EXPECT_TRUE(extension_api->IsAvailableInUntrustedContext("runtime.connect", | |
| 101 extension.get())); | |
| 102 EXPECT_TRUE(extension_api->IsAvailableInUntrustedContext("runtime.onConnect", | |
| 103 extension.get())); | |
| 104 EXPECT_TRUE(extension_api->IsAvailableInUntrustedContext("runtime.lastError", | |
| 105 extension.get())); | |
| 106 | |
| 107 // Exists, but privileged. | |
| 108 EXPECT_FALSE(extension_api->IsAvailableInUntrustedContext( | |
| 109 "extension.getViews", extension.get())); | |
| 110 EXPECT_FALSE(extension_api->IsAvailableInUntrustedContext("history.search", | |
| 111 extension.get())); | |
| 112 | |
| 113 // Whole APIs that are unprivileged. | |
| 114 EXPECT_TRUE( | |
| 115 extension_api->IsAvailableInUntrustedContext("app", extension.get())); | |
| 116 EXPECT_TRUE(extension_api->IsAvailableInUntrustedContext("app.getDetails", | |
| 117 extension.get())); | |
| 118 // There is no feature "app.isInstalled" (it's "app.getIsInstalled") but | |
| 119 // this should be available nonetheless. | |
| 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())); | |
| 138 } | |
| 139 | |
| 140 TEST(ExtensionAPITest, IsAvailableInUntrustedContextFeatures) { | |
| 141 struct { | |
| 142 std::string api_full_name; | |
| 143 bool expect_is_available; | |
| 144 } test_data[] = {{"test1", true}, | |
| 145 {"test1.foo", false}, | |
| 146 {"test2", false}, | |
| 147 {"test2.foo", true}, | |
| 148 {"test2.bar", true}, | |
| 149 {"test2.baz", false}, | |
| 150 {"test2.qux", false}, | |
| 151 {"test3", true}, | |
| 152 {"test3.foo", false}, | |
| 153 {"test4", true}, | |
| 154 {"test5", true}}; | |
| 155 | |
| 156 base::FilePath api_features_path; | |
| 157 PathService::Get(chrome::DIR_TEST_DATA, &api_features_path); | |
| 158 api_features_path = api_features_path.AppendASCII("extensions") | |
| 159 .AppendASCII("extension_api_unittest") | |
| 160 .AppendASCII("privileged_api_features.json"); | |
| 161 | |
| 162 std::string api_features_str; | |
| 163 ASSERT_TRUE(base::ReadFileToString( | |
| 164 api_features_path, &api_features_str)) << "privileged_api_features.json"; | |
| 165 | |
| 166 scoped_ptr<base::DictionaryValue> value(static_cast<base::DictionaryValue*>( | |
| 167 base::JSONReader::Read(api_features_str))); | |
| 168 BaseFeatureProvider api_feature_provider(*value, CreateAPIFeature); | |
| 169 | |
| 170 scoped_refptr<Extension> extension = | |
| 171 BuildExtension(ExtensionBuilder().Pass()).Build(); | |
| 172 | |
| 173 for (size_t i = 0; i < arraysize(test_data); ++i) { | |
| 174 ExtensionAPI api; | |
| 175 api.RegisterDependencyProvider("api", &api_feature_provider); | |
| 176 EXPECT_EQ(test_data[i].expect_is_available, | |
| 177 api.IsAvailableInUntrustedContext(test_data[i].api_full_name, | |
| 178 extension.get())) | |
| 179 << i; | |
| 180 } | |
| 181 } | |
| 182 | |
| 183 TEST(ExtensionAPITest, APIFeatures) { | 88 TEST(ExtensionAPITest, APIFeatures) { |
| 184 struct { | 89 struct { |
| 185 std::string api_full_name; | 90 std::string api_full_name; |
| 186 bool expect_is_available; | 91 bool expect_is_available; |
| 187 Feature::Context context; | 92 Feature::Context context; |
| 188 GURL url; | 93 GURL url; |
| 189 } test_data[] = { | 94 } test_data[] = { |
| 190 { "test1", false, Feature::WEB_PAGE_CONTEXT, GURL() }, | 95 { "test1", false, Feature::WEB_PAGE_CONTEXT, GURL() }, |
| 191 { "test1", true, Feature::BLESSED_EXTENSION_CONTEXT, GURL() }, | 96 { "test1", true, Feature::BLESSED_EXTENSION_CONTEXT, GURL() }, |
| 192 { "test1", true, Feature::UNBLESSED_EXTENSION_CONTEXT, GURL() }, | 97 { "test1", true, Feature::UNBLESSED_EXTENSION_CONTEXT, GURL() }, |
| (...skipping 733 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 926 extension.get(), | 831 extension.get(), |
| 927 Feature::BLESSED_EXTENSION_CONTEXT, | 832 Feature::BLESSED_EXTENSION_CONTEXT, |
| 928 GURL()).is_available()); | 833 GURL()).is_available()); |
| 929 EXPECT_FALSE(extension_api->IsAvailable("pageAction", | 834 EXPECT_FALSE(extension_api->IsAvailable("pageAction", |
| 930 extension.get(), | 835 extension.get(), |
| 931 Feature::BLESSED_EXTENSION_CONTEXT, | 836 Feature::BLESSED_EXTENSION_CONTEXT, |
| 932 GURL()).is_available()); | 837 GURL()).is_available()); |
| 933 } | 838 } |
| 934 | 839 |
| 935 } // namespace extensions | 840 } // namespace extensions |
| OLD | NEW |