| OLD | NEW |
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 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 "base/file_path.h" | 5 #include "base/file_path.h" |
| 6 #include "base/file_util.h" | 6 #include "base/file_util.h" |
| 7 #include "base/string_util.h" | 7 #include "base/string_util.h" |
| 8 #include "base/path_service.h" | 8 #include "base/path_service.h" |
| 9 #include "chrome/common/chrome_paths.h" | 9 #include "chrome/common/chrome_paths.h" |
| 10 #include "chrome/common/extensions/extension.h" | 10 #include "chrome/common/extensions/extension.h" |
| (...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 220 EXPECT_FALSE(extension.InitFromValue(*input_value, true, &error)); | 220 EXPECT_FALSE(extension.InitFromValue(*input_value, true, &error)); |
| 221 EXPECT_TRUE(MatchPattern(error, errors::kInvalidPrivacyBlacklistsPath)); | 221 EXPECT_TRUE(MatchPattern(error, errors::kInvalidPrivacyBlacklistsPath)); |
| 222 } | 222 } |
| 223 | 223 |
| 224 TEST(ExtensionTest, InitFromValueValid) { | 224 TEST(ExtensionTest, InitFromValueValid) { |
| 225 #if defined(OS_WIN) | 225 #if defined(OS_WIN) |
| 226 FilePath path(FILE_PATH_LITERAL("C:\\foo")); | 226 FilePath path(FILE_PATH_LITERAL("C:\\foo")); |
| 227 #elif defined(OS_POSIX) | 227 #elif defined(OS_POSIX) |
| 228 FilePath path(FILE_PATH_LITERAL("/foo")); | 228 FilePath path(FILE_PATH_LITERAL("/foo")); |
| 229 #endif | 229 #endif |
| 230 Extension::ResetGeneratedIdCounter(); | |
| 231 | |
| 232 Extension extension(path); | 230 Extension extension(path); |
| 233 std::string error; | 231 std::string error; |
| 234 DictionaryValue input_value; | 232 DictionaryValue input_value; |
| 235 | 233 |
| 236 // Test minimal extension | 234 // Test minimal extension |
| 237 input_value.SetString(keys::kVersion, "1.0.0.0"); | 235 input_value.SetString(keys::kVersion, "1.0.0.0"); |
| 238 input_value.SetString(keys::kName, "my extension"); | 236 input_value.SetString(keys::kName, "my extension"); |
| 239 | 237 |
| 240 EXPECT_TRUE(extension.InitFromValue(input_value, false, &error)); | 238 EXPECT_TRUE(extension.InitFromValue(input_value, false, &error)); |
| 241 EXPECT_EQ("", error); | 239 EXPECT_EQ("", error); |
| 242 EXPECT_EQ("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", extension.id()); | 240 EXPECT_TRUE(Extension::IdIsValid(extension.id())); |
| 243 EXPECT_EQ("1.0.0.0", extension.VersionString()); | 241 EXPECT_EQ("1.0.0.0", extension.VersionString()); |
| 244 EXPECT_EQ("my extension", extension.name()); | 242 EXPECT_EQ("my extension", extension.name()); |
| 245 EXPECT_EQ("chrome-extension://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/", | 243 EXPECT_EQ(extension.id(), extension.url().host()); |
| 246 extension.url().spec()); | |
| 247 EXPECT_EQ(path.value(), extension.path().value()); | 244 EXPECT_EQ(path.value(), extension.path().value()); |
| 248 } | 245 } |
| 249 | 246 |
| 250 TEST(ExtensionTest, GetResourceURLAndPath) { | 247 TEST(ExtensionTest, GetResourceURLAndPath) { |
| 251 #if defined(OS_WIN) | 248 #if defined(OS_WIN) |
| 252 FilePath path(FILE_PATH_LITERAL("C:\\foo")); | 249 FilePath path(FILE_PATH_LITERAL("C:\\foo")); |
| 253 #elif defined(OS_POSIX) | 250 #elif defined(OS_POSIX) |
| 254 FilePath path(FILE_PATH_LITERAL("/foo")); | 251 FilePath path(FILE_PATH_LITERAL("/foo")); |
| 255 #endif | 252 #endif |
| 256 Extension extension(path); | 253 Extension extension(path); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 270 .Append(FILE_PATH_LITERAL("baz.js")).value(), | 267 .Append(FILE_PATH_LITERAL("baz.js")).value(), |
| 271 Extension::GetResourcePath(extension.path(), "bar/baz.js").value()); | 268 Extension::GetResourcePath(extension.path(), "bar/baz.js").value()); |
| 272 EXPECT_EQ(path.Append(FILE_PATH_LITERAL("baz.js")).value(), | 269 EXPECT_EQ(path.Append(FILE_PATH_LITERAL("baz.js")).value(), |
| 273 Extension::GetResourcePath(extension.path(), "bar/../baz.js") | 270 Extension::GetResourcePath(extension.path(), "bar/../baz.js") |
| 274 .value()); | 271 .value()); |
| 275 EXPECT_EQ(FilePath().value(), | 272 EXPECT_EQ(FilePath().value(), |
| 276 Extension::GetResourcePath(extension.path(), "../baz.js").value()); | 273 Extension::GetResourcePath(extension.path(), "../baz.js").value()); |
| 277 } | 274 } |
| 278 | 275 |
| 279 TEST(ExtensionTest, LoadPageActionHelper) { | 276 TEST(ExtensionTest, LoadPageActionHelper) { |
| 280 Extension extension; | 277 #if defined(OS_WIN) |
| 278 FilePath path(StringPrintf(L"c:\\extension")); |
| 279 #else |
| 280 FilePath path(StringPrintf("/extension")); |
| 281 #endif |
| 282 Extension extension(path); |
| 281 std::string error_msg; | 283 std::string error_msg; |
| 282 scoped_ptr<ExtensionAction> action; | 284 scoped_ptr<ExtensionAction> action; |
| 283 DictionaryValue input; | 285 DictionaryValue input; |
| 284 | 286 |
| 285 // First try with an empty dictionary. We should get nothing back. | 287 // First try with an empty dictionary. We should get nothing back. |
| 286 ASSERT_TRUE(extension.LoadExtensionActionHelper( | 288 ASSERT_TRUE(extension.LoadExtensionActionHelper( |
| 287 &input, 0, &error_msg, ExtensionAction::PAGE_ACTION) == NULL); | 289 &input, 0, &error_msg, ExtensionAction::PAGE_ACTION) == NULL); |
| 288 ASSERT_STRNE("", error_msg.c_str()); | 290 ASSERT_STRNE("", error_msg.c_str()); |
| 289 error_msg = ""; | 291 error_msg = ""; |
| 290 | 292 |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 417 EXPECT_TRUE(Extension::IdIsValid("pppppppppppppppppppppppppppppppp")); | 419 EXPECT_TRUE(Extension::IdIsValid("pppppppppppppppppppppppppppppppp")); |
| 418 EXPECT_TRUE(Extension::IdIsValid("abcdefghijklmnopabcdefghijklmnop")); | 420 EXPECT_TRUE(Extension::IdIsValid("abcdefghijklmnopabcdefghijklmnop")); |
| 419 EXPECT_TRUE(Extension::IdIsValid("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")); | 421 EXPECT_TRUE(Extension::IdIsValid("ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP")); |
| 420 EXPECT_FALSE(Extension::IdIsValid("abcdefghijklmnopabcdefghijklmno")); | 422 EXPECT_FALSE(Extension::IdIsValid("abcdefghijklmnopabcdefghijklmno")); |
| 421 EXPECT_FALSE(Extension::IdIsValid("abcdefghijklmnopabcdefghijklmnopa")); | 423 EXPECT_FALSE(Extension::IdIsValid("abcdefghijklmnopabcdefghijklmnopa")); |
| 422 EXPECT_FALSE(Extension::IdIsValid("0123456789abcdef0123456789abcdef")); | 424 EXPECT_FALSE(Extension::IdIsValid("0123456789abcdef0123456789abcdef")); |
| 423 EXPECT_FALSE(Extension::IdIsValid("abcdefghijklmnopabcdefghijklmnoq")); | 425 EXPECT_FALSE(Extension::IdIsValid("abcdefghijklmnopabcdefghijklmnoq")); |
| 424 EXPECT_FALSE(Extension::IdIsValid("abcdefghijklmnopabcdefghijklmno0")); | 426 EXPECT_FALSE(Extension::IdIsValid("abcdefghijklmnopabcdefghijklmno0")); |
| 425 } | 427 } |
| 426 | 428 |
| 427 TEST(ExtensionTest, GenerateIDFromPublicKey) { | 429 TEST(ExtensionTest, GenerateID) { |
| 428 const uint8 public_key_info[] = { | 430 const uint8 public_key_info[] = { |
| 429 0x30, 0x81, 0x9f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, | 431 0x30, 0x81, 0x9f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, |
| 430 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x81, 0x8d, 0x00, 0x30, 0x81, | 432 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x81, 0x8d, 0x00, 0x30, 0x81, |
| 431 0x89, 0x02, 0x81, 0x81, 0x00, 0xb8, 0x7f, 0x2b, 0x20, 0xdc, 0x7c, 0x9b, | 433 0x89, 0x02, 0x81, 0x81, 0x00, 0xb8, 0x7f, 0x2b, 0x20, 0xdc, 0x7c, 0x9b, |
| 432 0x0c, 0xdc, 0x51, 0x61, 0x99, 0x0d, 0x36, 0x0f, 0xd4, 0x66, 0x88, 0x08, | 434 0x0c, 0xdc, 0x51, 0x61, 0x99, 0x0d, 0x36, 0x0f, 0xd4, 0x66, 0x88, 0x08, |
| 433 0x55, 0x84, 0xd5, 0x3a, 0xbf, 0x2b, 0xa4, 0x64, 0x85, 0x7b, 0x0c, 0x04, | 435 0x55, 0x84, 0xd5, 0x3a, 0xbf, 0x2b, 0xa4, 0x64, 0x85, 0x7b, 0x0c, 0x04, |
| 434 0x13, 0x3f, 0x8d, 0xf4, 0xbc, 0x38, 0x0d, 0x49, 0xfe, 0x6b, 0xc4, 0x5a, | 436 0x13, 0x3f, 0x8d, 0xf4, 0xbc, 0x38, 0x0d, 0x49, 0xfe, 0x6b, 0xc4, 0x5a, |
| 435 0xb0, 0x40, 0x53, 0x3a, 0xd7, 0x66, 0x09, 0x0f, 0x9e, 0x36, 0x74, 0x30, | 437 0xb0, 0x40, 0x53, 0x3a, 0xd7, 0x66, 0x09, 0x0f, 0x9e, 0x36, 0x74, 0x30, |
| 436 0xda, 0x8a, 0x31, 0x4f, 0x1f, 0x14, 0x50, 0xd7, 0xc7, 0x20, 0x94, 0x17, | 438 0xda, 0x8a, 0x31, 0x4f, 0x1f, 0x14, 0x50, 0xd7, 0xc7, 0x20, 0x94, 0x17, |
| 437 0xde, 0x4e, 0xb9, 0x57, 0x5e, 0x7e, 0x0a, 0xe5, 0xb2, 0x65, 0x7a, 0x89, | 439 0xde, 0x4e, 0xb9, 0x57, 0x5e, 0x7e, 0x0a, 0xe5, 0xb2, 0x65, 0x7a, 0x89, |
| 438 0x4e, 0xb6, 0x47, 0xff, 0x1c, 0xbd, 0xb7, 0x38, 0x13, 0xaf, 0x47, 0x85, | 440 0x4e, 0xb6, 0x47, 0xff, 0x1c, 0xbd, 0xb7, 0x38, 0x13, 0xaf, 0x47, 0x85, |
| 439 0x84, 0x32, 0x33, 0xf3, 0x17, 0x49, 0xbf, 0xe9, 0x96, 0xd0, 0xd6, 0x14, | 441 0x84, 0x32, 0x33, 0xf3, 0x17, 0x49, 0xbf, 0xe9, 0x96, 0xd0, 0xd6, 0x14, |
| 440 0x6f, 0x13, 0x8d, 0xc5, 0xfc, 0x2c, 0x72, 0xba, 0xac, 0xea, 0x7e, 0x18, | 442 0x6f, 0x13, 0x8d, 0xc5, 0xfc, 0x2c, 0x72, 0xba, 0xac, 0xea, 0x7e, 0x18, |
| 441 0x53, 0x56, 0xa6, 0x83, 0xa2, 0xce, 0x93, 0x93, 0xe7, 0x1f, 0x0f, 0xe6, | 443 0x53, 0x56, 0xa6, 0x83, 0xa2, 0xce, 0x93, 0x93, 0xe7, 0x1f, 0x0f, 0xe6, |
| 442 0x0f, 0x02, 0x03, 0x01, 0x00, 0x01 | 444 0x0f, 0x02, 0x03, 0x01, 0x00, 0x01 |
| 443 }; | 445 }; |
| 444 | 446 |
| 445 std::string extension_id; | 447 std::string extension_id; |
| 446 EXPECT_TRUE( | 448 EXPECT_TRUE( |
| 447 Extension::GenerateIdFromPublicKey( | 449 Extension::GenerateId( |
| 448 std::string(reinterpret_cast<const char*>(&public_key_info[0]), | 450 std::string(reinterpret_cast<const char*>(&public_key_info[0]), |
| 449 arraysize(public_key_info)), | 451 arraysize(public_key_info)), |
| 450 &extension_id)); | 452 &extension_id)); |
| 451 EXPECT_EQ("melddjfinppjdikinhbgehiennejpfhp", extension_id); | 453 EXPECT_EQ("melddjfinppjdikinhbgehiennejpfhp", extension_id); |
| 452 } | 454 } |
| 453 | 455 |
| 454 TEST(ExtensionTest, UpdateUrls) { | 456 TEST(ExtensionTest, UpdateUrls) { |
| 455 // Test several valid update urls | 457 // Test several valid update urls |
| 456 std::vector<std::string> valid; | 458 std::vector<std::string> valid; |
| 457 valid.push_back("http://test.com"); | 459 valid.push_back("http://test.com"); |
| 458 valid.push_back("http://test.com/"); | 460 valid.push_back("http://test.com/"); |
| 459 valid.push_back("http://test.com/update"); | 461 valid.push_back("http://test.com/update"); |
| 460 valid.push_back("http://test.com/update?check=true"); | 462 valid.push_back("http://test.com/update?check=true"); |
| 461 for (size_t i = 0; i < valid.size(); i++) { | 463 for (size_t i = 0; i < valid.size(); i++) { |
| 462 GURL url(valid[i]); | 464 GURL url(valid[i]); |
| 463 EXPECT_TRUE(url.is_valid()); | 465 EXPECT_TRUE(url.is_valid()); |
| 464 | 466 |
| 465 DictionaryValue input_value; | 467 DictionaryValue input_value; |
| 466 Extension extension; | 468 #if defined(OS_WIN) |
| 469 FilePath path(StringPrintf(L"c:\\extension%i", i)); |
| 470 #else |
| 471 FilePath path(StringPrintf("/extension%i", i)); |
| 472 #endif |
| 473 Extension extension(path); |
| 467 std::string error; | 474 std::string error; |
| 468 | 475 |
| 469 input_value.SetString(keys::kVersion, "1.0"); | 476 input_value.SetString(keys::kVersion, "1.0"); |
| 470 input_value.SetString(keys::kName, "Test"); | 477 input_value.SetString(keys::kName, "Test"); |
| 471 input_value.SetString(keys::kUpdateURL, url.spec()); | 478 input_value.SetString(keys::kUpdateURL, url.spec()); |
| 472 | 479 |
| 473 EXPECT_TRUE(extension.InitFromValue(input_value, false, &error)); | 480 EXPECT_TRUE(extension.InitFromValue(input_value, false, &error)); |
| 474 } | 481 } |
| 475 | 482 |
| 476 // Test some invalid update urls | 483 // Test some invalid update urls |
| 477 std::vector<std::string> invalid; | 484 std::vector<std::string> invalid; |
| 478 invalid.push_back(""); | 485 invalid.push_back(""); |
| 479 invalid.push_back("test.com"); | 486 invalid.push_back("test.com"); |
| 480 valid.push_back("http://test.com/update#whatever"); | 487 valid.push_back("http://test.com/update#whatever"); |
| 481 for (size_t i = 0; i < invalid.size(); i++) { | 488 for (size_t i = 0; i < invalid.size(); i++) { |
| 482 DictionaryValue input_value; | 489 DictionaryValue input_value; |
| 483 Extension extension; | 490 #if defined(OS_WIN) |
| 491 FilePath path(StringPrintf(L"c:\\extension%i", i)); |
| 492 #else |
| 493 FilePath path(StringPrintf("/extension%i", i)); |
| 494 #endif |
| 495 Extension extension(path); |
| 484 std::string error; | 496 std::string error; |
| 485 input_value.SetString(keys::kVersion, "1.0"); | 497 input_value.SetString(keys::kVersion, "1.0"); |
| 486 input_value.SetString(keys::kName, "Test"); | 498 input_value.SetString(keys::kName, "Test"); |
| 487 input_value.SetString(keys::kUpdateURL, invalid[i]); | 499 input_value.SetString(keys::kUpdateURL, invalid[i]); |
| 488 | 500 |
| 489 EXPECT_FALSE(extension.InitFromValue(input_value, false, &error)); | 501 EXPECT_FALSE(extension.InitFromValue(input_value, false, &error)); |
| 490 EXPECT_TRUE(MatchPattern(error, errors::kInvalidUpdateURL)); | 502 EXPECT_TRUE(MatchPattern(error, errors::kInvalidUpdateURL)); |
| 491 } | 503 } |
| 492 } | 504 } |
| 493 | 505 |
| (...skipping 28 matching lines...) Expand all Loading... |
| 522 path = path.AppendASCII("extensions") | 534 path = path.AppendASCII("extensions") |
| 523 .AppendASCII(dir) | 535 .AppendASCII(dir) |
| 524 .AppendASCII(test_file); | 536 .AppendASCII(test_file); |
| 525 | 537 |
| 526 JSONFileValueSerializer serializer(path); | 538 JSONFileValueSerializer serializer(path); |
| 527 scoped_ptr<Value> result(serializer.Deserialize(NULL)); | 539 scoped_ptr<Value> result(serializer.Deserialize(NULL)); |
| 528 if (!result.get()) | 540 if (!result.get()) |
| 529 return NULL; | 541 return NULL; |
| 530 | 542 |
| 531 std::string error; | 543 std::string error; |
| 532 scoped_ptr<Extension> extension(new Extension); | 544 scoped_ptr<Extension> extension(new Extension(path.DirName())); |
| 533 extension->InitFromValue(*static_cast<DictionaryValue*>(result.get()), | 545 extension->InitFromValue(*static_cast<DictionaryValue*>(result.get()), |
| 534 false, &error); | 546 false, &error); |
| 535 | 547 |
| 536 return extension.release(); | 548 return extension.release(); |
| 537 } | 549 } |
| 538 | 550 |
| 539 TEST(ExtensionTest, EffectiveHostPermissions) { | 551 TEST(ExtensionTest, EffectiveHostPermissions) { |
| 540 scoped_ptr<Extension> extension; | 552 scoped_ptr<Extension> extension; |
| 541 std::set<std::string> hosts; | 553 std::set<std::string> hosts; |
| 542 | 554 |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 648 scoped_ptr<Extension> new_extension( | 660 scoped_ptr<Extension> new_extension( |
| 649 LoadManifest("allow_silent_upgrade", | 661 LoadManifest("allow_silent_upgrade", |
| 650 std::string(kTests[i].base_name) + "_new.json")); | 662 std::string(kTests[i].base_name) + "_new.json")); |
| 651 | 663 |
| 652 EXPECT_EQ(kTests[i].expect_success, | 664 EXPECT_EQ(kTests[i].expect_success, |
| 653 Extension::IsPrivilegeIncrease(old_extension.get(), | 665 Extension::IsPrivilegeIncrease(old_extension.get(), |
| 654 new_extension.get())) | 666 new_extension.get())) |
| 655 << kTests[i].base_name; | 667 << kTests[i].base_name; |
| 656 } | 668 } |
| 657 } | 669 } |
| OLD | NEW |