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/browser/extensions/extension_service_unittest.h" | 5 #include "chrome/browser/extensions/extension_service_unittest.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <set> | 8 #include <set> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
42 #include "chrome/browser/extensions/external_provider_impl.h" | 42 #include "chrome/browser/extensions/external_provider_impl.h" |
43 #include "chrome/browser/extensions/external_provider_interface.h" | 43 #include "chrome/browser/extensions/external_provider_interface.h" |
44 #include "chrome/browser/extensions/installed_loader.h" | 44 #include "chrome/browser/extensions/installed_loader.h" |
45 #include "chrome/browser/extensions/pack_extension_job.h" | 45 #include "chrome/browser/extensions/pack_extension_job.h" |
46 #include "chrome/browser/extensions/pending_extension_info.h" | 46 #include "chrome/browser/extensions/pending_extension_info.h" |
47 #include "chrome/browser/extensions/pending_extension_manager.h" | 47 #include "chrome/browser/extensions/pending_extension_manager.h" |
48 #include "chrome/browser/extensions/test_extension_system.h" | 48 #include "chrome/browser/extensions/test_extension_system.h" |
49 #include "chrome/browser/extensions/test_management_policy.h" | 49 #include "chrome/browser/extensions/test_management_policy.h" |
50 #include "chrome/browser/extensions/unpacked_installer.h" | 50 #include "chrome/browser/extensions/unpacked_installer.h" |
51 #include "chrome/browser/extensions/updater/extension_updater.h" | 51 #include "chrome/browser/extensions/updater/extension_updater.h" |
| 52 #include "chrome/browser/plugin_prefs_factory.h" |
52 #include "chrome/browser/prefs/browser_prefs.h" | 53 #include "chrome/browser/prefs/browser_prefs.h" |
53 #include "chrome/browser/prefs/pref_service_mock_builder.h" | 54 #include "chrome/browser/prefs/pref_service_mock_builder.h" |
54 #include "chrome/browser/prefs/scoped_user_pref_update.h" | 55 #include "chrome/browser/prefs/scoped_user_pref_update.h" |
55 #include "chrome/common/chrome_constants.h" | 56 #include "chrome/common/chrome_constants.h" |
56 #include "chrome/common/chrome_notification_types.h" | 57 #include "chrome/common/chrome_notification_types.h" |
57 #include "chrome/common/chrome_paths.h" | 58 #include "chrome/common/chrome_paths.h" |
58 #include "chrome/common/chrome_switches.h" | 59 #include "chrome/common/chrome_switches.h" |
59 #include "chrome/common/extensions/extension.h" | 60 #include "chrome/common/extensions/extension.h" |
60 #include "chrome/common/extensions/extension_l10n_util.h" | 61 #include "chrome/common/extensions/extension_l10n_util.h" |
61 #include "chrome/common/extensions/extension_manifest_constants.h" | 62 #include "chrome/common/extensions/extension_manifest_constants.h" |
62 #include "chrome/common/extensions/extension_resource.h" | 63 #include "chrome/common/extensions/extension_resource.h" |
63 #include "chrome/common/extensions/permissions/permission_set.h" | 64 #include "chrome/common/extensions/permissions/permission_set.h" |
64 #include "chrome/common/extensions/url_pattern.h" | 65 #include "chrome/common/extensions/url_pattern.h" |
65 #include "chrome/common/pref_names.h" | 66 #include "chrome/common/pref_names.h" |
66 #include "chrome/common/url_constants.h" | 67 #include "chrome/common/url_constants.h" |
67 #include "chrome/test/base/testing_profile.h" | 68 #include "chrome/test/base/testing_profile.h" |
68 #include "content/public/browser/dom_storage_context.h" | 69 #include "content/public/browser/dom_storage_context.h" |
| 70 #include "content/public/browser/gpu_data_manager.h" |
69 #include "content/public/browser/indexed_db_context.h" | 71 #include "content/public/browser/indexed_db_context.h" |
70 #include "content/public/browser/notification_registrar.h" | 72 #include "content/public/browser/notification_registrar.h" |
71 #include "content/public/browser/notification_service.h" | 73 #include "content/public/browser/notification_service.h" |
72 #include "content/public/browser/plugin_service.h" | 74 #include "content/public/browser/plugin_service.h" |
73 #include "content/public/browser/storage_partition.h" | 75 #include "content/public/browser/storage_partition.h" |
74 #include "content/public/common/content_constants.h" | 76 #include "content/public/common/content_constants.h" |
75 #include "content/public/test/test_browser_thread.h" | 77 #include "content/public/test/test_browser_thread.h" |
76 #include "googleurl/src/gurl.h" | 78 #include "googleurl/src/gurl.h" |
77 #include "grit/browser_resources.h" | 79 #include "grit/browser_resources.h" |
78 #include "net/cookies/canonical_cookie.h" | 80 #include "net/cookies/canonical_cookie.h" |
(...skipping 631 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
710 } | 712 } |
711 | 713 |
712 enum UpdateState { | 714 enum UpdateState { |
713 FAILED_SILENTLY, | 715 FAILED_SILENTLY, |
714 FAILED, | 716 FAILED, |
715 UPDATED, | 717 UPDATED, |
716 INSTALLED, | 718 INSTALLED, |
717 ENABLED | 719 ENABLED |
718 }; | 720 }; |
719 | 721 |
| 722 void BlackListWebGL() { |
| 723 static const std::string json_blacklist = |
| 724 "{\n" |
| 725 " \"name\": \"gpu blacklist\",\n" |
| 726 " \"version\": \"1.0\",\n" |
| 727 " \"entries\": [\n" |
| 728 " {\n" |
| 729 " \"id\": 1,\n" |
| 730 " \"blacklist\": [\"webgl\"]\n" |
| 731 " }\n" |
| 732 " ]\n" |
| 733 "}"; |
| 734 content::GpuDataManager::GetInstance()->Initialize("0", json_blacklist); |
| 735 } |
| 736 |
720 void UpdateExtension(const std::string& id, const FilePath& in_path, | 737 void UpdateExtension(const std::string& id, const FilePath& in_path, |
721 UpdateState expected_state) { | 738 UpdateState expected_state) { |
722 ASSERT_TRUE(file_util::PathExists(in_path)); | 739 ASSERT_TRUE(file_util::PathExists(in_path)); |
723 | 740 |
724 // We need to copy this to a temporary location because Update() will delete | 741 // We need to copy this to a temporary location because Update() will delete |
725 // it. | 742 // it. |
726 FilePath path = temp_dir_.path(); | 743 FilePath path = temp_dir_.path(); |
727 path = path.Append(in_path.BaseName()); | 744 path = path.Append(in_path.BaseName()); |
728 ASSERT_TRUE(file_util::CopyFile(in_path, path)); | 745 ASSERT_TRUE(file_util::CopyFile(in_path, path)); |
729 | 746 |
(...skipping 1659 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2389 ASSERT_EQ(good_crx, good->id()); | 2406 ASSERT_EQ(good_crx, good->id()); |
2390 | 2407 |
2391 // Disable it and allow it to run in incognito. These settings should carry | 2408 // Disable it and allow it to run in incognito. These settings should carry |
2392 // over to the updated version. | 2409 // over to the updated version. |
2393 service_->DisableExtension(good->id(), Extension::DISABLE_USER_ACTION); | 2410 service_->DisableExtension(good->id(), Extension::DISABLE_USER_ACTION); |
2394 service_->SetIsIncognitoEnabled(good->id(), true); | 2411 service_->SetIsIncognitoEnabled(good->id(), true); |
2395 service_->extension_prefs()->SetDidExtensionEscalatePermissions(good, true); | 2412 service_->extension_prefs()->SetDidExtensionEscalatePermissions(good, true); |
2396 | 2413 |
2397 path = data_dir_.AppendASCII("good2.crx"); | 2414 path = data_dir_.AppendASCII("good2.crx"); |
2398 UpdateExtension(good_crx, path, INSTALLED); | 2415 UpdateExtension(good_crx, path, INSTALLED); |
2399 ASSERT_EQ(1u, service_->disabled_extensions()->size()); | 2416 ASSERT_EQ(1u, service_->disabled_extensions()->size());\ |
2400 const Extension* good2 = service_->GetExtensionById(good_crx, true); | 2417 const Extension* good2 = service_->GetExtensionById(good_crx, true); |
2401 ASSERT_EQ("1.0.0.1", good2->version()->GetString()); | 2418 ASSERT_EQ("1.0.0.1", good2->version()->GetString()); |
2402 EXPECT_TRUE(service_->IsIncognitoEnabled(good2->id())); | 2419 EXPECT_TRUE(service_->IsIncognitoEnabled(good2->id())); |
2403 EXPECT_TRUE(service_->extension_prefs()->DidExtensionEscalatePermissions( | 2420 EXPECT_TRUE(service_->extension_prefs()->DidExtensionEscalatePermissions( |
2404 good2->id())); | 2421 good2->id())); |
2405 } | 2422 } |
2406 | 2423 |
2407 // Tests that updating preserves extension location. | 2424 // Tests that updating preserves extension location. |
2408 TEST_F(ExtensionServiceTest, UpdateExtensionPreservesLocation) { | 2425 TEST_F(ExtensionServiceTest, UpdateExtensionPreservesLocation) { |
2409 InitializeEmptyExtensionService(); | 2426 InitializeEmptyExtensionService(); |
(...skipping 1015 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3425 UninstallExtension(good_crx, true); | 3442 UninstallExtension(good_crx, true); |
3426 } | 3443 } |
3427 | 3444 |
3428 TEST_F(ExtensionServiceTest, UninstallExtensionHelperTerminated) { | 3445 TEST_F(ExtensionServiceTest, UninstallExtensionHelperTerminated) { |
3429 InitializeEmptyExtensionService(); | 3446 InitializeEmptyExtensionService(); |
3430 InstallCRX(data_dir_.AppendASCII("good.crx"), INSTALL_NEW); | 3447 InstallCRX(data_dir_.AppendASCII("good.crx"), INSTALL_NEW); |
3431 TerminateExtension(good_crx); | 3448 TerminateExtension(good_crx); |
3432 UninstallExtension(good_crx, true); | 3449 UninstallExtension(good_crx, true); |
3433 } | 3450 } |
3434 | 3451 |
| 3452 // An extension disabled because of unsupported requirements should re-enabled |
| 3453 // if updated to a version with supported requirements as long as there are no |
| 3454 // other disable reasons. |
| 3455 TEST_F(ExtensionServiceTest, UpgradingRequirementsEnabled) { |
| 3456 InitializeEmptyExtensionService(); |
| 3457 BlackListWebGL(); |
| 3458 |
| 3459 FilePath path = data_dir_.AppendASCII("requirements"); |
| 3460 FilePath pem_path = data_dir_.AppendASCII("requirements") |
| 3461 .AppendASCII("v1_good.pem"); |
| 3462 const Extension* extension_v1 = PackAndInstallCRX(path.AppendASCII("v1_good"), |
| 3463 pem_path, |
| 3464 INSTALL_NEW); |
| 3465 std::string id = extension_v1->id(); |
| 3466 EXPECT_TRUE(service_->IsExtensionEnabled(id)); |
| 3467 |
| 3468 PackCRX(path.AppendASCII("v2_bad_requirements"), pem_path, |
| 3469 path.AppendASCII("v2_bad_requirements.crx")); |
| 3470 UpdateExtension(id, path.AppendASCII("v2_bad_requirements.crx"), INSTALLED); |
| 3471 EXPECT_FALSE(service_->IsExtensionEnabled(id)); |
| 3472 |
| 3473 PackCRX(path.AppendASCII("v3_good"), pem_path, |
| 3474 path.AppendASCII("v3_good.crx")); |
| 3475 UpdateExtension(id, path.AppendASCII("v3_good.crx"), ENABLED); |
| 3476 EXPECT_TRUE(service_->IsExtensionEnabled(id)); |
| 3477 } |
| 3478 |
| 3479 // Extensions disabled through user action should stay disabled. |
| 3480 TEST_F(ExtensionServiceTest, UpgradingRequirementsDisabled) { |
| 3481 InitializeEmptyExtensionService(); |
| 3482 BlackListWebGL(); |
| 3483 |
| 3484 FilePath path = data_dir_.AppendASCII("requirements"); |
| 3485 FilePath pem_path = data_dir_.AppendASCII("requirements") |
| 3486 .AppendASCII("v1_good.pem"); |
| 3487 const Extension* extension_v1 = PackAndInstallCRX(path.AppendASCII("v1_good"), |
| 3488 pem_path, |
| 3489 INSTALL_NEW); |
| 3490 std::string id = extension_v1->id(); |
| 3491 service_->DisableExtension(id, Extension::DISABLE_USER_ACTION); |
| 3492 EXPECT_FALSE(service_->IsExtensionEnabled(id)); |
| 3493 |
| 3494 PackCRX(path.AppendASCII("v2_bad_requirements"), pem_path, |
| 3495 path.AppendASCII("v2_bad_requirements.crx")); |
| 3496 UpdateExtension(id, path.AppendASCII("v2_bad_requirements.crx"), INSTALLED); |
| 3497 EXPECT_FALSE(service_->IsExtensionEnabled(id)); |
| 3498 |
| 3499 PackCRX(path.AppendASCII("v3_good"), pem_path, |
| 3500 path.AppendASCII("v3_good.crx")); |
| 3501 UpdateExtension(id, path.AppendASCII("v3_good.crx"), INSTALLED); |
| 3502 EXPECT_FALSE(service_->IsExtensionEnabled(id)); |
| 3503 } |
| 3504 |
| 3505 // The extension should not re-enabled because it was disabled from a |
| 3506 // permission increase. |
| 3507 TEST_F(ExtensionServiceTest, UpgradingRequirementsPermissions) { |
| 3508 InitializeEmptyExtensionService(); |
| 3509 BlackListWebGL(); |
| 3510 |
| 3511 FilePath path = data_dir_.AppendASCII("requirements"); |
| 3512 FilePath pem_path = data_dir_.AppendASCII("requirements") |
| 3513 .AppendASCII("v1_good.pem"); |
| 3514 const Extension* extension_v1 = PackAndInstallCRX(path.AppendASCII("v1_good"), |
| 3515 pem_path, |
| 3516 INSTALL_NEW); |
| 3517 std::string id = extension_v1->id(); |
| 3518 EXPECT_TRUE(service_->IsExtensionEnabled(id)); |
| 3519 |
| 3520 PackCRX(path.AppendASCII("v2_bad_requirements_and_permissions"), pem_path, |
| 3521 path.AppendASCII("v2_bad_requirements_and_permissions.crx")); |
| 3522 UpdateExtension( |
| 3523 id, |
| 3524 path.AppendASCII("v2_bad_requirements_and_permissions.crx"), INSTALLED); |
| 3525 EXPECT_FALSE(service_->IsExtensionEnabled(id)); |
| 3526 |
| 3527 PackCRX(path.AppendASCII("v3_bad_permissions"), pem_path, |
| 3528 path.AppendASCII("v3_bad_permissions.crx")); |
| 3529 UpdateExtension(id, path.AppendASCII("v3_bad_permissions.crx"), INSTALLED); |
| 3530 EXPECT_FALSE(service_->IsExtensionEnabled(id)); |
| 3531 } |
| 3532 |
| 3533 // Unpacked extensions are not allowed to be installed if they have unsupported |
| 3534 // requirements. |
| 3535 TEST_F(ExtensionServiceTest, UnpackedRequirements) { |
| 3536 InitializeEmptyExtensionService(); |
| 3537 BlackListWebGL(); |
| 3538 |
| 3539 FilePath path = data_dir_.AppendASCII("requirements") |
| 3540 .AppendASCII("v2_bad_requirements"); |
| 3541 extensions::UnpackedInstaller::Create(service_)->Load(path); |
| 3542 loop_.RunAllPending(); |
| 3543 EXPECT_EQ(1u, GetErrors().size()); |
| 3544 EXPECT_EQ(0u, service_->extensions()->size()); |
| 3545 } |
| 3546 |
3435 class ExtensionCookieCallback { | 3547 class ExtensionCookieCallback { |
3436 public: | 3548 public: |
3437 ExtensionCookieCallback() | 3549 ExtensionCookieCallback() |
3438 : result_(false), | 3550 : result_(false), |
3439 weak_factory_(MessageLoop::current()) {} | 3551 weak_factory_(MessageLoop::current()) {} |
3440 | 3552 |
3441 void SetCookieCallback(bool result) { | 3553 void SetCookieCallback(bool result) { |
3442 MessageLoop::current()->PostTask( | 3554 MessageLoop::current()->PostTask( |
3443 FROM_HERE, base::Bind(&MessageLoop::Quit, weak_factory_.GetWeakPtr())); | 3555 FROM_HERE, base::Bind(&MessageLoop::Quit, weak_factory_.GetWeakPtr())); |
3444 result_ = result; | 3556 result_ = result; |
(...skipping 1973 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5418 // This should NOT trigger an alert. | 5530 // This should NOT trigger an alert. |
5419 provider->UpdateOrAddExtension(hosted_app, "1.0.0.0", | 5531 provider->UpdateOrAddExtension(hosted_app, "1.0.0.0", |
5420 data_dir_.AppendASCII("hosted_app.crx")); | 5532 data_dir_.AppendASCII("hosted_app.crx")); |
5421 | 5533 |
5422 service_->CheckForExternalUpdates(); | 5534 service_->CheckForExternalUpdates(); |
5423 loop_.RunAllPending(); | 5535 loop_.RunAllPending(); |
5424 | 5536 |
5425 ASSERT_TRUE(service_->PopulateExtensionErrorUI(extension_error_ui.get())); | 5537 ASSERT_TRUE(service_->PopulateExtensionErrorUI(extension_error_ui.get())); |
5426 ASSERT_EQ(1u, extension_error_ui->get_external_extension_ids()->size()); | 5538 ASSERT_EQ(1u, extension_error_ui->get_external_extension_ids()->size()); |
5427 } | 5539 } |
OLD | NEW |