| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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/extension_unittest.h" | |
| 6 | |
| 7 #include "base/command_line.h" | 5 #include "base/command_line.h" |
| 8 #include "base/file_util.h" | 6 #include "base/file_util.h" |
| 9 #include "base/format_macros.h" | 7 #include "base/format_macros.h" |
| 10 #include "base/path_service.h" | 8 #include "base/path_service.h" |
| 11 #include "base/stringprintf.h" | 9 #include "base/stringprintf.h" |
| 12 #include "base/strings/string_number_conversions.h" | 10 #include "base/strings/string_number_conversions.h" |
| 13 #include "base/utf_string_conversions.h" | 11 #include "base/utf_string_conversions.h" |
| 14 #include "chrome/common/chrome_paths.h" | 12 #include "chrome/common/chrome_paths.h" |
| 15 #include "chrome/common/chrome_switches.h" | 13 #include "chrome/common/chrome_switches.h" |
| 16 #include "chrome/common/extensions/api/plugins/plugins_handler.h" | |
| 17 #include "chrome/common/extensions/background_info.h" | |
| 18 #include "chrome/common/extensions/command.h" | 14 #include "chrome/common/extensions/command.h" |
| 19 #include "chrome/common/extensions/extension.h" | 15 #include "chrome/common/extensions/extension.h" |
| 20 #include "chrome/common/extensions/extension_file_util.h" | 16 #include "chrome/common/extensions/extension_file_util.h" |
| 21 #include "chrome/common/extensions/extension_manifest_constants.h" | 17 #include "chrome/common/extensions/extension_manifest_constants.h" |
| 22 #include "chrome/common/extensions/extension_test_util.h" | 18 #include "chrome/common/extensions/extension_test_util.h" |
| 23 #include "chrome/common/extensions/features/feature.h" | 19 #include "chrome/common/extensions/features/feature.h" |
| 24 #include "chrome/common/extensions/incognito_handler.h" | |
| 25 #include "chrome/common/extensions/manifest.h" | 20 #include "chrome/common/extensions/manifest.h" |
| 26 #include "chrome/common/extensions/manifest_handler.h" | |
| 27 #include "chrome/common/extensions/manifest_handlers/content_scripts_handler.h" | 21 #include "chrome/common/extensions/manifest_handlers/content_scripts_handler.h" |
| 28 #include "chrome/common/extensions/permissions/api_permission.h" | 22 #include "chrome/common/extensions/permissions/api_permission.h" |
| 29 #include "chrome/common/extensions/permissions/chrome_api_permissions.h" | |
| 30 #include "chrome/common/extensions/permissions/permission_set.h" | 23 #include "chrome/common/extensions/permissions/permission_set.h" |
| 31 #include "chrome/common/extensions/permissions/scoped_testing_permissions_info.h
" | |
| 32 #include "chrome/common/extensions/permissions/socket_permission.h" | 24 #include "chrome/common/extensions/permissions/socket_permission.h" |
| 33 #include "chrome/common/extensions/permissions/usb_device_permission.h" | 25 #include "chrome/common/extensions/permissions/usb_device_permission.h" |
| 34 #include "chrome/common/url_constants.h" | 26 #include "chrome/common/url_constants.h" |
| 35 #include "extensions/common/error_utils.h" | 27 #include "extensions/common/error_utils.h" |
| 36 #include "extensions/common/extension_resource.h" | 28 #include "extensions/common/extension_resource.h" |
| 37 #include "extensions/common/id_util.h" | 29 #include "extensions/common/id_util.h" |
| 38 #include "googleurl/src/gurl.h" | 30 #include "googleurl/src/gurl.h" |
| 39 #include "net/base/mime_sniffer.h" | 31 #include "net/base/mime_sniffer.h" |
| 40 #include "net/dns/mock_host_resolver.h" | 32 #include "net/dns/mock_host_resolver.h" |
| 41 #include "skia/ext/image_operations.h" | 33 #include "skia/ext/image_operations.h" |
| 42 #include "testing/gtest/include/gtest/gtest.h" | 34 #include "testing/gtest/include/gtest/gtest.h" |
| 43 #include "third_party/skia/include/core/SkBitmap.h" | 35 #include "third_party/skia/include/core/SkBitmap.h" |
| 44 #include "ui/gfx/codec/png_codec.h" | 36 #include "ui/gfx/codec/png_codec.h" |
| 45 | 37 |
| 46 using content::SocketPermissionRequest; | 38 using content::SocketPermissionRequest; |
| 47 using extension_test_util::LoadManifest; | 39 using extension_test_util::LoadManifest; |
| 48 using extension_test_util::LoadManifestUnchecked; | 40 using extension_test_util::LoadManifestUnchecked; |
| 49 using extension_test_util::LoadManifestStrict; | 41 using extension_test_util::LoadManifestStrict; |
| 50 | 42 |
| 51 namespace keys = extension_manifest_keys; | 43 namespace keys = extension_manifest_keys; |
| 52 namespace values = extension_manifest_values; | 44 namespace values = extension_manifest_values; |
| 53 namespace errors = extension_manifest_errors; | 45 namespace errors = extension_manifest_errors; |
| 54 | 46 |
| 55 namespace extensions { | 47 namespace extensions { |
| 56 | 48 |
| 57 ExtensionTest::ExtensionTest() : permissions_info_(ChromeAPIPermissions()) {} | |
| 58 | |
| 59 void ExtensionTest::SetUp() { | |
| 60 testing::Test::SetUp(); | |
| 61 (new BackgroundManifestHandler)->Register(); | |
| 62 // We need the IncognitoHandler registered for all tests, since | |
| 63 // Extension uses it in Extension::CheckPlatformAppFeatures() as part of the | |
| 64 // creation process. | |
| 65 (new IncognitoHandler)->Register(); | |
| 66 } | |
| 67 | |
| 68 void ExtensionTest::TearDown() { | |
| 69 ManifestHandler::ClearRegistryForTesting(); | |
| 70 testing::Test::TearDown(); | |
| 71 } | |
| 72 | |
| 73 // We persist location values in the preferences, so this is a sanity test that | 49 // We persist location values in the preferences, so this is a sanity test that |
| 74 // someone doesn't accidentally change them. | 50 // someone doesn't accidentally change them. |
| 75 TEST_F(ExtensionTest, LocationValuesTest) { | 51 TEST(ExtensionTest, LocationValuesTest) { |
| 76 ASSERT_EQ(0, Manifest::INVALID_LOCATION); | 52 ASSERT_EQ(0, Manifest::INVALID_LOCATION); |
| 77 ASSERT_EQ(1, Manifest::INTERNAL); | 53 ASSERT_EQ(1, Manifest::INTERNAL); |
| 78 ASSERT_EQ(2, Manifest::EXTERNAL_PREF); | 54 ASSERT_EQ(2, Manifest::EXTERNAL_PREF); |
| 79 ASSERT_EQ(3, Manifest::EXTERNAL_REGISTRY); | 55 ASSERT_EQ(3, Manifest::EXTERNAL_REGISTRY); |
| 80 ASSERT_EQ(4, Manifest::UNPACKED); | 56 ASSERT_EQ(4, Manifest::UNPACKED); |
| 81 ASSERT_EQ(5, Manifest::COMPONENT); | 57 ASSERT_EQ(5, Manifest::COMPONENT); |
| 82 ASSERT_EQ(6, Manifest::EXTERNAL_PREF_DOWNLOAD); | 58 ASSERT_EQ(6, Manifest::EXTERNAL_PREF_DOWNLOAD); |
| 83 ASSERT_EQ(7, Manifest::EXTERNAL_POLICY_DOWNLOAD); | 59 ASSERT_EQ(7, Manifest::EXTERNAL_POLICY_DOWNLOAD); |
| 84 ASSERT_EQ(8, Manifest::COMMAND_LINE); | 60 ASSERT_EQ(8, Manifest::COMMAND_LINE); |
| 85 } | 61 } |
| 86 | 62 |
| 87 TEST_F(ExtensionTest, LocationPriorityTest) { | 63 TEST(ExtensionTest, LocationPriorityTest) { |
| 88 for (int i = 0; i < Manifest::NUM_LOCATIONS; i++) { | 64 for (int i = 0; i < Manifest::NUM_LOCATIONS; i++) { |
| 89 Manifest::Location loc = static_cast<Manifest::Location>(i); | 65 Manifest::Location loc = static_cast<Manifest::Location>(i); |
| 90 | 66 |
| 91 // INVALID is not a valid location. | 67 // INVALID is not a valid location. |
| 92 if (loc == Manifest::INVALID_LOCATION) | 68 if (loc == Manifest::INVALID_LOCATION) |
| 93 continue; | 69 continue; |
| 94 | 70 |
| 95 // Comparing a location that has no rank will hit a CHECK. Do a | 71 // Comparing a location that has no rank will hit a CHECK. Do a |
| 96 // compare with every valid location, to be sure each one is covered. | 72 // compare with every valid location, to be sure each one is covered. |
| 97 | 73 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 114 Manifest::GetHigherPriorityLocation( | 90 Manifest::GetHigherPriorityLocation( |
| 115 Manifest::EXTERNAL_POLICY_DOWNLOAD, | 91 Manifest::EXTERNAL_POLICY_DOWNLOAD, |
| 116 Manifest::EXTERNAL_PREF)); | 92 Manifest::EXTERNAL_PREF)); |
| 117 | 93 |
| 118 ASSERT_EQ(Manifest::EXTERNAL_PREF, | 94 ASSERT_EQ(Manifest::EXTERNAL_PREF, |
| 119 Manifest::GetHigherPriorityLocation( | 95 Manifest::GetHigherPriorityLocation( |
| 120 Manifest::INTERNAL, | 96 Manifest::INTERNAL, |
| 121 Manifest::EXTERNAL_PREF)); | 97 Manifest::EXTERNAL_PREF)); |
| 122 } | 98 } |
| 123 | 99 |
| 124 TEST_F(ExtensionTest, GetResourceURLAndPath) { | 100 TEST(ExtensionTest, GetResourceURLAndPath) { |
| 125 scoped_refptr<Extension> extension = LoadManifestStrict("empty_manifest", | 101 scoped_refptr<Extension> extension = LoadManifestStrict("empty_manifest", |
| 126 "empty.json"); | 102 "empty.json"); |
| 127 EXPECT_TRUE(extension.get()); | 103 EXPECT_TRUE(extension.get()); |
| 128 | 104 |
| 129 EXPECT_EQ(extension->url().spec() + "bar/baz.js", | 105 EXPECT_EQ(extension->url().spec() + "bar/baz.js", |
| 130 Extension::GetResourceURL(extension->url(), "bar/baz.js").spec()); | 106 Extension::GetResourceURL(extension->url(), "bar/baz.js").spec()); |
| 131 EXPECT_EQ(extension->url().spec() + "baz.js", | 107 EXPECT_EQ(extension->url().spec() + "baz.js", |
| 132 Extension::GetResourceURL(extension->url(), | 108 Extension::GetResourceURL(extension->url(), |
| 133 "bar/../baz.js").spec()); | 109 "bar/../baz.js").spec()); |
| 134 EXPECT_EQ(extension->url().spec() + "baz.js", | 110 EXPECT_EQ(extension->url().spec() + "baz.js", |
| 135 Extension::GetResourceURL(extension->url(), "../baz.js").spec()); | 111 Extension::GetResourceURL(extension->url(), "../baz.js").spec()); |
| 136 | 112 |
| 137 // Test that absolute-looking paths ("/"-prefixed) are pasted correctly. | 113 // Test that absolute-looking paths ("/"-prefixed) are pasted correctly. |
| 138 EXPECT_EQ(extension->url().spec() + "test.html", | 114 EXPECT_EQ(extension->url().spec() + "test.html", |
| 139 extension->GetResourceURL("/test.html").spec()); | 115 extension->GetResourceURL("/test.html").spec()); |
| 140 } | 116 } |
| 141 | 117 |
| 142 TEST_F(ExtensionTest, GetAbsolutePathNoError) { | 118 TEST(ExtensionTest, GetAbsolutePathNoError) { |
| 143 scoped_refptr<Extension> extension = LoadManifestStrict("absolute_path", | 119 scoped_refptr<Extension> extension = LoadManifestStrict("absolute_path", |
| 144 "absolute.json"); | 120 "absolute.json"); |
| 145 EXPECT_TRUE(extension.get()); | 121 EXPECT_TRUE(extension.get()); |
| 146 std::string err; | 122 std::string err; |
| 147 std::vector<InstallWarning> warnings; | 123 std::vector<InstallWarning> warnings; |
| 148 EXPECT_TRUE(extension_file_util::ValidateExtension(extension.get(), | 124 EXPECT_TRUE(extension_file_util::ValidateExtension(extension.get(), |
| 149 &err, &warnings)); | 125 &err, &warnings)); |
| 150 EXPECT_EQ(0U, warnings.size()); | 126 EXPECT_EQ(0U, warnings.size()); |
| 151 | 127 |
| 152 EXPECT_EQ(extension->path().AppendASCII("test.html").value(), | 128 EXPECT_EQ(extension->path().AppendASCII("test.html").value(), |
| 153 extension->GetResource("test.html").GetFilePath().value()); | 129 extension->GetResource("test.html").GetFilePath().value()); |
| 154 EXPECT_EQ(extension->path().AppendASCII("test.js").value(), | 130 EXPECT_EQ(extension->path().AppendASCII("test.js").value(), |
| 155 extension->GetResource("test.js").GetFilePath().value()); | 131 extension->GetResource("test.js").GetFilePath().value()); |
| 156 } | 132 } |
| 157 | 133 |
| 158 | 134 |
| 159 TEST_F(ExtensionTest, IdIsValid) { | 135 TEST(ExtensionTest, IdIsValid) { |
| 160 EXPECT_TRUE(Extension::IdIsValid("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")); | 136 EXPECT_TRUE(Extension::IdIsValid("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")); |
| 161 EXPECT_TRUE(Extension::IdIsValid("pppppppppppppppppppppppppppppppp")); | 137 EXPECT_TRUE(Extension::IdIsValid("pppppppppppppppppppppppppppppppp")); |
| 162 EXPECT_TRUE(Extension::IdIsValid("abcdefghijklmnopabcdefghijklmnop")); | 138 EXPECT_TRUE(Extension::IdIsValid("abcdefghijklmnopabcdefghijklmnop")); |
| 163 EXPECT_TRUE(Extension::IdIsValid("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")); | 139 EXPECT_TRUE(Extension::IdIsValid("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")); |
| 164 EXPECT_FALSE(Extension::IdIsValid("abcdefghijklmnopabcdefghijklmno")); | 140 EXPECT_FALSE(Extension::IdIsValid("abcdefghijklmnopabcdefghijklmno")); |
| 165 EXPECT_FALSE(Extension::IdIsValid("abcdefghijklmnopabcdefghijklmnopa")); | 141 EXPECT_FALSE(Extension::IdIsValid("abcdefghijklmnopabcdefghijklmnopa")); |
| 166 EXPECT_FALSE(Extension::IdIsValid("0123456789abcdef0123456789abcdef")); | 142 EXPECT_FALSE(Extension::IdIsValid("0123456789abcdef0123456789abcdef")); |
| 167 EXPECT_FALSE(Extension::IdIsValid("abcdefghijklmnopabcdefghijklmnoq")); | 143 EXPECT_FALSE(Extension::IdIsValid("abcdefghijklmnopabcdefghijklmnoq")); |
| 168 EXPECT_FALSE(Extension::IdIsValid("abcdefghijklmnopabcdefghijklmno0")); | 144 EXPECT_FALSE(Extension::IdIsValid("abcdefghijklmnopabcdefghijklmno0")); |
| 169 } | 145 } |
| 170 | 146 |
| 171 | 147 |
| 172 // This test ensures that the mimetype sniffing code stays in sync with the | 148 // This test ensures that the mimetype sniffing code stays in sync with the |
| 173 // actual crx files that we test other parts of the system with. | 149 // actual crx files that we test other parts of the system with. |
| 174 TEST_F(ExtensionTest, MimeTypeSniffing) { | 150 TEST(ExtensionTest, MimeTypeSniffing) { |
| 175 base::FilePath path; | 151 base::FilePath path; |
| 176 ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &path)); | 152 ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &path)); |
| 177 path = path.AppendASCII("extensions").AppendASCII("good.crx"); | 153 path = path.AppendASCII("extensions").AppendASCII("good.crx"); |
| 178 | 154 |
| 179 std::string data; | 155 std::string data; |
| 180 ASSERT_TRUE(file_util::ReadFileToString(path, &data)); | 156 ASSERT_TRUE(file_util::ReadFileToString(path, &data)); |
| 181 | 157 |
| 182 std::string result; | 158 std::string result; |
| 183 EXPECT_TRUE(net::SniffMimeType(data.c_str(), | 159 EXPECT_TRUE(net::SniffMimeType(data.c_str(), |
| 184 data.size(), | 160 data.size(), |
| 185 GURL("http://www.example.com/foo.crx"), | 161 GURL("http://www.example.com/foo.crx"), |
| 186 std::string(), | 162 std::string(), |
| 187 &result)); | 163 &result)); |
| 188 EXPECT_EQ(std::string(Extension::kMimeType), result); | 164 EXPECT_EQ(std::string(Extension::kMimeType), result); |
| 189 | 165 |
| 190 data.clear(); | 166 data.clear(); |
| 191 result.clear(); | 167 result.clear(); |
| 192 path = path.DirName().AppendASCII("bad_magic.crx"); | 168 path = path.DirName().AppendASCII("bad_magic.crx"); |
| 193 ASSERT_TRUE(file_util::ReadFileToString(path, &data)); | 169 ASSERT_TRUE(file_util::ReadFileToString(path, &data)); |
| 194 EXPECT_TRUE(net::SniffMimeType(data.c_str(), | 170 EXPECT_TRUE(net::SniffMimeType(data.c_str(), |
| 195 data.size(), | 171 data.size(), |
| 196 GURL("http://www.example.com/foo.crx"), | 172 GURL("http://www.example.com/foo.crx"), |
| 197 std::string(), | 173 std::string(), |
| 198 &result)); | 174 &result)); |
| 199 EXPECT_EQ("application/octet-stream", result); | 175 EXPECT_EQ("application/octet-stream", result); |
| 200 } | 176 } |
| 201 | 177 |
| 202 TEST_F(ExtensionTest, EffectiveHostPermissions) { | 178 TEST(ExtensionTest, EffectiveHostPermissions) { |
| 203 (new ContentScriptsHandler)->Register(); | |
| 204 scoped_refptr<Extension> extension; | 179 scoped_refptr<Extension> extension; |
| 205 URLPatternSet hosts; | 180 URLPatternSet hosts; |
| 206 | 181 |
| 207 extension = LoadManifest("effective_host_permissions", "empty.json"); | 182 extension = LoadManifest("effective_host_permissions", "empty.json"); |
| 208 EXPECT_EQ(0u, extension->GetEffectiveHostPermissions().patterns().size()); | 183 EXPECT_EQ(0u, extension->GetEffectiveHostPermissions().patterns().size()); |
| 209 EXPECT_FALSE(hosts.MatchesURL(GURL("http://www.google.com"))); | 184 EXPECT_FALSE(hosts.MatchesURL(GURL("http://www.google.com"))); |
| 210 EXPECT_FALSE(extension->HasEffectiveAccessToAllHosts()); | 185 EXPECT_FALSE(extension->HasEffectiveAccessToAllHosts()); |
| 211 | 186 |
| 212 extension = LoadManifest("effective_host_permissions", "one_host.json"); | 187 extension = LoadManifest("effective_host_permissions", "one_host.json"); |
| 213 hosts = extension->GetEffectiveHostPermissions(); | 188 hosts = extension->GetEffectiveHostPermissions(); |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 270 | 245 |
| 271 static bool CheckSocketPermission(scoped_refptr<Extension> extension, | 246 static bool CheckSocketPermission(scoped_refptr<Extension> extension, |
| 272 SocketPermissionRequest::OperationType type, | 247 SocketPermissionRequest::OperationType type, |
| 273 const char* host, | 248 const char* host, |
| 274 int port) { | 249 int port) { |
| 275 SocketPermission::CheckParam param(type, host, port); | 250 SocketPermission::CheckParam param(type, host, port); |
| 276 return extension->CheckAPIPermissionWithParam( | 251 return extension->CheckAPIPermissionWithParam( |
| 277 APIPermission::kSocket, ¶m); | 252 APIPermission::kSocket, ¶m); |
| 278 } | 253 } |
| 279 | 254 |
| 280 TEST_F(ExtensionTest, SocketPermissions) { | 255 TEST(ExtensionTest, SocketPermissions) { |
| 281 // Set feature current channel to appropriate value. | 256 // Set feature current channel to appropriate value. |
| 282 Feature::ScopedCurrentChannel scoped_channel( | 257 Feature::ScopedCurrentChannel scoped_channel( |
| 283 chrome::VersionInfo::CHANNEL_DEV); | 258 chrome::VersionInfo::CHANNEL_DEV); |
| 284 scoped_refptr<Extension> extension; | 259 scoped_refptr<Extension> extension; |
| 285 std::string error; | 260 std::string error; |
| 286 | 261 |
| 287 extension = LoadManifest("socket_permissions", "empty.json"); | 262 extension = LoadManifest("socket_permissions", "empty.json"); |
| 288 EXPECT_FALSE(CheckSocketPermission(extension, | 263 EXPECT_FALSE(CheckSocketPermission(extension, |
| 289 SocketPermissionRequest::TCP_CONNECT, "www.example.com", 80)); | 264 SocketPermissionRequest::TCP_CONNECT, "www.example.com", 80)); |
| 290 | 265 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 307 EXPECT_FALSE(CheckSocketPermission( | 282 EXPECT_FALSE(CheckSocketPermission( |
| 308 extension, SocketPermissionRequest::UDP_SEND_TO, "example.com", 1900)); | 283 extension, SocketPermissionRequest::UDP_SEND_TO, "example.com", 1900)); |
| 309 EXPECT_TRUE(CheckSocketPermission( | 284 EXPECT_TRUE(CheckSocketPermission( |
| 310 extension, | 285 extension, |
| 311 SocketPermissionRequest::UDP_SEND_TO, | 286 SocketPermissionRequest::UDP_SEND_TO, |
| 312 "239.255.255.250", 1900)); | 287 "239.255.255.250", 1900)); |
| 313 } | 288 } |
| 314 | 289 |
| 315 // This tests the API permissions with an empty manifest (one that just | 290 // This tests the API permissions with an empty manifest (one that just |
| 316 // specifies a name and a version and nothing else). | 291 // specifies a name and a version and nothing else). |
| 317 TEST_F(ExtensionTest, ApiPermissions) { | 292 TEST(ExtensionTest, ApiPermissions) { |
| 318 const struct { | 293 const struct { |
| 319 const char* permission_name; | 294 const char* permission_name; |
| 320 bool expect_success; | 295 bool expect_success; |
| 321 } kTests[] = { | 296 } kTests[] = { |
| 322 // Negative test. | 297 // Negative test. |
| 323 { "non_existing_permission", false }, | 298 { "non_existing_permission", false }, |
| 324 // Test default module/package permission. | 299 // Test default module/package permission. |
| 325 { "browserAction", true }, | 300 { "browserAction", true }, |
| 326 { "devtools", true }, | 301 { "devtools", true }, |
| 327 { "extension", true }, | 302 { "extension", true }, |
| (...skipping 24 matching lines...) Expand all Loading... |
| 352 scoped_refptr<Extension> extension; | 327 scoped_refptr<Extension> extension; |
| 353 extension = LoadManifest("empty_manifest", "empty.json"); | 328 extension = LoadManifest("empty_manifest", "empty.json"); |
| 354 | 329 |
| 355 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTests); ++i) { | 330 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTests); ++i) { |
| 356 EXPECT_EQ(kTests[i].expect_success, | 331 EXPECT_EQ(kTests[i].expect_success, |
| 357 extension->HasAPIPermission(kTests[i].permission_name)) | 332 extension->HasAPIPermission(kTests[i].permission_name)) |
| 358 << "Permission being tested: " << kTests[i].permission_name; | 333 << "Permission being tested: " << kTests[i].permission_name; |
| 359 } | 334 } |
| 360 } | 335 } |
| 361 | 336 |
| 362 TEST_F(ExtensionTest, GetPermissionMessages_ManyApiPermissions) { | 337 TEST(ExtensionTest, GetPermissionMessages_ManyApiPermissions) { |
| 363 scoped_refptr<Extension> extension; | 338 scoped_refptr<Extension> extension; |
| 364 extension = LoadManifest("permissions", "many-apis.json"); | 339 extension = LoadManifest("permissions", "many-apis.json"); |
| 365 std::vector<string16> warnings = extension->GetPermissionMessageStrings(); | 340 std::vector<string16> warnings = extension->GetPermissionMessageStrings(); |
| 366 ASSERT_EQ(6u, warnings.size()); | 341 ASSERT_EQ(6u, warnings.size()); |
| 367 EXPECT_EQ("Access your data on api.flickr.com", | 342 EXPECT_EQ("Access your data on api.flickr.com", |
| 368 UTF16ToUTF8(warnings[0])); | 343 UTF16ToUTF8(warnings[0])); |
| 369 EXPECT_EQ("Read and modify your bookmarks", UTF16ToUTF8(warnings[1])); | 344 EXPECT_EQ("Read and modify your bookmarks", UTF16ToUTF8(warnings[1])); |
| 370 EXPECT_EQ("Detect your physical location", UTF16ToUTF8(warnings[2])); | 345 EXPECT_EQ("Detect your physical location", UTF16ToUTF8(warnings[2])); |
| 371 EXPECT_EQ("Read and modify your browsing history", UTF16ToUTF8(warnings[3])); | 346 EXPECT_EQ("Read and modify your browsing history", UTF16ToUTF8(warnings[3])); |
| 372 EXPECT_EQ("Access your tabs and browsing activity", UTF16ToUTF8(warnings[4])); | 347 EXPECT_EQ("Access your tabs and browsing activity", UTF16ToUTF8(warnings[4])); |
| 373 EXPECT_EQ("Manage your apps, extensions, and themes", | 348 EXPECT_EQ("Manage your apps, extensions, and themes", |
| 374 UTF16ToUTF8(warnings[5])); | 349 UTF16ToUTF8(warnings[5])); |
| 375 } | 350 } |
| 376 | 351 |
| 377 TEST_F(ExtensionTest, GetPermissionMessages_LocationApiPermission) { | 352 TEST(ExtensionTest, GetPermissionMessages_LocationApiPermission) { |
| 378 scoped_refptr<Extension> extension; | 353 scoped_refptr<Extension> extension; |
| 379 extension = LoadManifest("permissions", | 354 extension = LoadManifest("permissions", |
| 380 "location-api.json", | 355 "location-api.json", |
| 381 Manifest::COMPONENT, | 356 Manifest::COMPONENT, |
| 382 Extension::NO_FLAGS); | 357 Extension::NO_FLAGS); |
| 383 std::vector<string16> warnings = extension->GetPermissionMessageStrings(); | 358 std::vector<string16> warnings = extension->GetPermissionMessageStrings(); |
| 384 ASSERT_EQ(1u, warnings.size()); | 359 ASSERT_EQ(1u, warnings.size()); |
| 385 EXPECT_EQ("Detect your physical location", UTF16ToUTF8(warnings[0])); | 360 EXPECT_EQ("Detect your physical location", UTF16ToUTF8(warnings[0])); |
| 386 } | 361 } |
| 387 | 362 |
| 388 TEST_F(ExtensionTest, GetPermissionMessages_ManyHosts) { | 363 TEST(ExtensionTest, GetPermissionMessages_ManyHosts) { |
| 389 (new ContentScriptsHandler)->Register(); | |
| 390 scoped_refptr<Extension> extension; | 364 scoped_refptr<Extension> extension; |
| 391 extension = LoadManifest("permissions", "many-hosts.json"); | 365 extension = LoadManifest("permissions", "many-hosts.json"); |
| 392 std::vector<string16> warnings = extension->GetPermissionMessageStrings(); | 366 std::vector<string16> warnings = extension->GetPermissionMessageStrings(); |
| 393 ASSERT_EQ(1u, warnings.size()); | 367 ASSERT_EQ(1u, warnings.size()); |
| 394 EXPECT_EQ("Access your data on encrypted.google.com and www.google.com", | 368 EXPECT_EQ("Access your data on encrypted.google.com and www.google.com", |
| 395 UTF16ToUTF8(warnings[0])); | 369 UTF16ToUTF8(warnings[0])); |
| 396 } | 370 } |
| 397 | 371 |
| 398 TEST_F(ExtensionTest, GetPermissionMessages_Plugins) { | 372 TEST(ExtensionTest, GetPermissionMessages_Plugins) { |
| 399 (new PluginsHandler)->Register(); | |
| 400 scoped_refptr<Extension> extension; | 373 scoped_refptr<Extension> extension; |
| 401 extension = LoadManifest("permissions", "plugins.json"); | 374 extension = LoadManifest("permissions", "plugins.json"); |
| 402 std::vector<string16> warnings = extension->GetPermissionMessageStrings(); | 375 std::vector<string16> warnings = extension->GetPermissionMessageStrings(); |
| 403 // We don't parse the plugins key on Chrome OS, so it should not ask for any | 376 // We don't parse the plugins key on Chrome OS, so it should not ask for any |
| 404 // permissions. | 377 // permissions. |
| 405 #if defined(OS_CHROMEOS) | 378 #if defined(OS_CHROMEOS) |
| 406 ASSERT_EQ(0u, warnings.size()); | 379 ASSERT_EQ(0u, warnings.size()); |
| 407 #else | 380 #else |
| 408 ASSERT_EQ(1u, warnings.size()); | 381 ASSERT_EQ(1u, warnings.size()); |
| 409 EXPECT_EQ("Access all data on your computer and the websites you visit", | 382 EXPECT_EQ("Access all data on your computer and the websites you visit", |
| 410 UTF16ToUTF8(warnings[0])); | 383 UTF16ToUTF8(warnings[0])); |
| 411 #endif | 384 #endif |
| 412 } | 385 } |
| 413 | 386 |
| 414 TEST_F(ExtensionTest, WantsFileAccess) { | 387 TEST(ExtensionTest, WantsFileAccess) { |
| 415 (new ContentScriptsHandler)->Register(); | |
| 416 scoped_refptr<Extension> extension; | 388 scoped_refptr<Extension> extension; |
| 417 GURL file_url("file:///etc/passwd"); | 389 GURL file_url("file:///etc/passwd"); |
| 418 | 390 |
| 419 // <all_urls> permission | 391 // <all_urls> permission |
| 420 extension = LoadManifest("permissions", "permissions_all_urls.json"); | 392 extension = LoadManifest("permissions", "permissions_all_urls.json"); |
| 421 EXPECT_TRUE(extension->wants_file_access()); | 393 EXPECT_TRUE(extension->wants_file_access()); |
| 422 EXPECT_FALSE(extension->CanExecuteScriptOnPage( | 394 EXPECT_FALSE(extension->CanExecuteScriptOnPage( |
| 423 file_url, file_url, -1, NULL, NULL)); | 395 file_url, file_url, -1, NULL, NULL)); |
| 424 extension = LoadManifest( | 396 extension = LoadManifest( |
| 425 "permissions", "permissions_all_urls.json", Extension::ALLOW_FILE_ACCESS); | 397 "permissions", "permissions_all_urls.json", Extension::ALLOW_FILE_ACCESS); |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 500 Extension::ALLOW_FILE_ACCESS); | 472 Extension::ALLOW_FILE_ACCESS); |
| 501 EXPECT_FALSE(extension->wants_file_access()); | 473 EXPECT_FALSE(extension->wants_file_access()); |
| 502 EXPECT_FALSE(extension->CanExecuteScriptOnPage( | 474 EXPECT_FALSE(extension->CanExecuteScriptOnPage( |
| 503 file_url, | 475 file_url, |
| 504 file_url, | 476 file_url, |
| 505 -1, | 477 -1, |
| 506 &ContentScriptsInfo::GetContentScripts(extension)[0], | 478 &ContentScriptsInfo::GetContentScripts(extension)[0], |
| 507 NULL)); | 479 NULL)); |
| 508 } | 480 } |
| 509 | 481 |
| 510 TEST_F(ExtensionTest, ExtraFlags) { | 482 TEST(ExtensionTest, ExtraFlags) { |
| 511 scoped_refptr<Extension> extension; | 483 scoped_refptr<Extension> extension; |
| 512 extension = LoadManifest("app", "manifest.json", Extension::FROM_WEBSTORE); | 484 extension = LoadManifest("app", "manifest.json", Extension::FROM_WEBSTORE); |
| 513 EXPECT_TRUE(extension->from_webstore()); | 485 EXPECT_TRUE(extension->from_webstore()); |
| 514 | 486 |
| 515 extension = LoadManifest("app", "manifest.json", Extension::FROM_BOOKMARK); | 487 extension = LoadManifest("app", "manifest.json", Extension::FROM_BOOKMARK); |
| 516 EXPECT_TRUE(extension->from_bookmark()); | 488 EXPECT_TRUE(extension->from_bookmark()); |
| 517 | 489 |
| 518 extension = LoadManifest("app", "manifest.json", Extension::NO_FLAGS); | 490 extension = LoadManifest("app", "manifest.json", Extension::NO_FLAGS); |
| 519 EXPECT_FALSE(extension->from_bookmark()); | 491 EXPECT_FALSE(extension->from_bookmark()); |
| 520 EXPECT_FALSE(extension->from_webstore()); | 492 EXPECT_FALSE(extension->from_webstore()); |
| (...skipping 358 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 879 EXPECT_TRUE(AllowedExclusivelyOnTab(extension, no_urls, 2)); | 851 EXPECT_TRUE(AllowedExclusivelyOnTab(extension, no_urls, 2)); |
| 880 | 852 |
| 881 extension->ClearTabSpecificPermissions(1); | 853 extension->ClearTabSpecificPermissions(1); |
| 882 EXPECT_FALSE(extension->GetTabSpecificPermissions(1).get()); | 854 EXPECT_FALSE(extension->GetTabSpecificPermissions(1).get()); |
| 883 | 855 |
| 884 EXPECT_TRUE(AllowedExclusivelyOnTab(extension, no_urls, 0)); | 856 EXPECT_TRUE(AllowedExclusivelyOnTab(extension, no_urls, 0)); |
| 885 EXPECT_TRUE(AllowedExclusivelyOnTab(extension, no_urls, 1)); | 857 EXPECT_TRUE(AllowedExclusivelyOnTab(extension, no_urls, 1)); |
| 886 EXPECT_TRUE(AllowedExclusivelyOnTab(extension, no_urls, 2)); | 858 EXPECT_TRUE(AllowedExclusivelyOnTab(extension, no_urls, 2)); |
| 887 } | 859 } |
| 888 | 860 |
| 889 TEST_F(ExtensionTest, OptionalOnlyPermission) { | 861 TEST(ExtensionTest, OptionalOnlyPermission) { |
| 890 // Set feature current channel to dev because the only permission that must | 862 // Set feature current channel to dev because the only permission that must |
| 891 // be optional (usbDevices) is only available on dev channel. | 863 // be optional (usbDevices) is only available on dev channel. |
| 892 Feature::ScopedCurrentChannel scoped_channel( | 864 Feature::ScopedCurrentChannel scoped_channel( |
| 893 chrome::VersionInfo::CHANNEL_DEV); | 865 chrome::VersionInfo::CHANNEL_DEV); |
| 894 | 866 |
| 895 scoped_refptr<Extension> extension; | 867 scoped_refptr<Extension> extension; |
| 896 std::string error; | 868 std::string error; |
| 897 extension = LoadManifestUnchecked("optional_only_permission", | 869 extension = LoadManifestUnchecked("optional_only_permission", |
| 898 "manifest1.json", | 870 "manifest1.json", |
| 899 Manifest::INTERNAL, Extension::NO_FLAGS, | 871 Manifest::INTERNAL, Extension::NO_FLAGS, |
| 900 &error); | 872 &error); |
| 901 EXPECT_TRUE(extension == NULL); | 873 EXPECT_TRUE(extension == NULL); |
| 902 ASSERT_EQ(ErrorUtils::FormatErrorMessage( | 874 ASSERT_EQ(ErrorUtils::FormatErrorMessage( |
| 903 errors::kPermissionMustBeOptional, "usbDevices"), error); | 875 errors::kPermissionMustBeOptional, "usbDevices"), error); |
| 904 | 876 |
| 905 error.clear(); | 877 error.clear(); |
| 906 extension = LoadManifestUnchecked("optional_only_permission", | 878 extension = LoadManifestUnchecked("optional_only_permission", |
| 907 "manifest2.json", | 879 "manifest2.json", |
| 908 Manifest::INTERNAL, Extension::NO_FLAGS, | 880 Manifest::INTERNAL, Extension::NO_FLAGS, |
| 909 &error); | 881 &error); |
| 910 EXPECT_TRUE(extension != NULL); | 882 EXPECT_TRUE(extension != NULL); |
| 911 EXPECT_TRUE(error.empty()); | 883 EXPECT_TRUE(error.empty()); |
| 912 } | 884 } |
| 913 | 885 |
| 914 } // namespace extensions | 886 } // namespace extensions |
| OLD | NEW |