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/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 |
11 #include "base/at_exit.h" | 11 #include "base/at_exit.h" |
12 #include "base/basictypes.h" | 12 #include "base/basictypes.h" |
13 #include "base/bind.h" | 13 #include "base/bind.h" |
14 #include "base/command_line.h" | 14 #include "base/command_line.h" |
| 15 #include "base/debug/trace_event_impl.h" |
15 #include "base/file_util.h" | 16 #include "base/file_util.h" |
16 #include "base/files/file_enumerator.h" | 17 #include "base/files/file_enumerator.h" |
17 #include "base/files/scoped_temp_dir.h" | 18 #include "base/files/scoped_temp_dir.h" |
18 #include "base/json/json_file_value_serializer.h" | 19 #include "base/json/json_file_value_serializer.h" |
19 #include "base/json/json_reader.h" | 20 #include "base/json/json_reader.h" |
20 #include "base/json/json_string_value_serializer.h" | 21 #include "base/json/json_string_value_serializer.h" |
21 #include "base/memory/scoped_ptr.h" | 22 #include "base/memory/scoped_ptr.h" |
22 #include "base/memory/weak_ptr.h" | 23 #include "base/memory/weak_ptr.h" |
23 #include "base/message_loop.h" | 24 #include "base/message_loop.h" |
24 #include "base/path_service.h" | 25 #include "base/path_service.h" |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
75 #include "chrome/common/pref_names.h" | 76 #include "chrome/common/pref_names.h" |
76 #include "chrome/common/url_constants.h" | 77 #include "chrome/common/url_constants.h" |
77 #include "chrome/test/base/testing_profile.h" | 78 #include "chrome/test/base/testing_profile.h" |
78 #include "components/user_prefs/pref_registry_syncable.h" | 79 #include "components/user_prefs/pref_registry_syncable.h" |
79 #include "content/public/browser/dom_storage_context.h" | 80 #include "content/public/browser/dom_storage_context.h" |
80 #include "content/public/browser/gpu_data_manager.h" | 81 #include "content/public/browser/gpu_data_manager.h" |
81 #include "content/public/browser/indexed_db_context.h" | 82 #include "content/public/browser/indexed_db_context.h" |
82 #include "content/public/browser/notification_registrar.h" | 83 #include "content/public/browser/notification_registrar.h" |
83 #include "content/public/browser/notification_service.h" | 84 #include "content/public/browser/notification_service.h" |
84 #include "content/public/browser/plugin_service.h" | 85 #include "content/public/browser/plugin_service.h" |
| 86 #include "content/public/browser/render_process_host.h" |
85 #include "content/public/browser/storage_partition.h" | 87 #include "content/public/browser/storage_partition.h" |
86 #include "content/public/common/content_constants.h" | 88 #include "content/public/common/content_constants.h" |
87 #include "content/public/test/test_browser_thread.h" | 89 #include "content/public/test/test_browser_thread.h" |
| 90 #include "content/public/test/test_utils.h" |
88 #include "extensions/common/constants.h" | 91 #include "extensions/common/constants.h" |
89 #include "extensions/common/extension_resource.h" | 92 #include "extensions/common/extension_resource.h" |
90 #include "extensions/common/url_pattern.h" | 93 #include "extensions/common/url_pattern.h" |
91 #include "googleurl/src/gurl.h" | 94 #include "googleurl/src/gurl.h" |
92 #include "gpu/config/gpu_info.h" | 95 #include "gpu/config/gpu_info.h" |
93 #include "grit/browser_resources.h" | 96 #include "grit/browser_resources.h" |
94 #include "net/cookies/canonical_cookie.h" | 97 #include "net/cookies/canonical_cookie.h" |
95 #include "net/cookies/cookie_monster.h" | 98 #include "net/cookies/cookie_monster.h" |
96 #include "net/cookies/cookie_options.h" | 99 #include "net/cookies/cookie_options.h" |
97 #include "net/url_request/url_request_context.h" | 100 #include "net/url_request/url_request_context.h" |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
188 int schemes = URLPattern::SCHEME_ALL; | 191 int schemes = URLPattern::SCHEME_ALL; |
189 extent->AddPattern(URLPattern(schemes, pattern)); | 192 extent->AddPattern(URLPattern(schemes, pattern)); |
190 } | 193 } |
191 | 194 |
192 base::FilePath GetTemporaryFile() { | 195 base::FilePath GetTemporaryFile() { |
193 base::FilePath temp_file; | 196 base::FilePath temp_file; |
194 CHECK(file_util::CreateTemporaryFile(&temp_file)); | 197 CHECK(file_util::CreateTemporaryFile(&temp_file)); |
195 return temp_file; | 198 return temp_file; |
196 } | 199 } |
197 | 200 |
| 201 |
| 202 bool WaitForCountNotificationsCallback(int *count) { |
| 203 return --(*count) == 0; |
| 204 } |
| 205 |
198 } // namespace | 206 } // namespace |
199 | 207 |
200 class MockExtensionProvider : public extensions::ExternalProviderInterface { | 208 class MockExtensionProvider : public extensions::ExternalProviderInterface { |
201 public: | 209 public: |
202 MockExtensionProvider( | 210 MockExtensionProvider( |
203 VisitorInterface* visitor, | 211 VisitorInterface* visitor, |
204 Manifest::Location location) | 212 Manifest::Location location) |
205 : location_(location), visitor_(visitor), visit_count_(0) { | 213 : location_(location), visitor_(visitor), visit_count_(0) { |
206 } | 214 } |
207 | 215 |
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
421 }; | 429 }; |
422 | 430 |
423 ExtensionServiceTestBase::ExtensionServiceInitParams:: | 431 ExtensionServiceTestBase::ExtensionServiceInitParams:: |
424 ExtensionServiceInitParams() | 432 ExtensionServiceInitParams() |
425 : autoupdate_enabled(false), is_first_run(true) { | 433 : autoupdate_enabled(false), is_first_run(true) { |
426 } | 434 } |
427 | 435 |
428 // Our message loop may be used in tests which require it to be an IO loop. | 436 // Our message loop may be used in tests which require it to be an IO loop. |
429 ExtensionServiceTestBase::ExtensionServiceTestBase() | 437 ExtensionServiceTestBase::ExtensionServiceTestBase() |
430 : loop_(base::MessageLoop::TYPE_IO), | 438 : loop_(base::MessageLoop::TYPE_IO), |
| 439 at_exit_manager_(new base::ShadowingAtExitManager), |
431 service_(NULL), | 440 service_(NULL), |
432 management_policy_(NULL), | 441 management_policy_(NULL), |
433 expected_extensions_count_(0), | 442 expected_extensions_count_(0), |
434 ui_thread_(BrowserThread::UI, &loop_), | 443 ui_thread_(BrowserThread::UI, &loop_), |
435 db_thread_(BrowserThread::DB, &loop_), | 444 db_thread_(BrowserThread::DB, &loop_), |
436 webkit_thread_(BrowserThread::WEBKIT_DEPRECATED, &loop_), | 445 webkit_thread_(BrowserThread::WEBKIT_DEPRECATED, &loop_), |
437 file_thread_(BrowserThread::FILE, &loop_), | 446 file_thread_(BrowserThread::FILE, &loop_), |
438 file_user_blocking_thread_(BrowserThread::FILE_USER_BLOCKING, &loop_), | 447 file_user_blocking_thread_(BrowserThread::FILE_USER_BLOCKING, &loop_), |
439 io_thread_(BrowserThread::IO, &loop_) { | 448 io_thread_(BrowserThread::IO, &loop_) { |
440 base::FilePath test_data_dir; | 449 base::FilePath test_data_dir; |
441 if (!PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir)) { | 450 if (!PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir)) { |
442 ADD_FAILURE(); | 451 ADD_FAILURE(); |
443 return; | 452 return; |
444 } | 453 } |
445 data_dir_ = test_data_dir.AppendASCII("extensions"); | 454 data_dir_ = test_data_dir.AppendASCII("extensions"); |
446 } | 455 } |
447 | 456 |
448 ExtensionServiceTestBase::~ExtensionServiceTestBase() { | 457 ExtensionServiceTestBase::~ExtensionServiceTestBase() { |
449 // Drop our reference to ExtensionService and TestingProfile, so that they | 458 // Drop our reference to ExtensionService and TestingProfile, so that they |
450 // can be destroyed while BrowserThreads and MessageLoop are still around | 459 // can be destroyed while BrowserThreads and MessageLoop are still around |
451 // (they are used in the destruction process). | 460 // (they are used in the destruction process). |
452 service_ = NULL; | 461 service_ = NULL; |
453 base::MessageLoop::current()->RunUntilIdle(); | 462 base::MessageLoop::current()->RunUntilIdle(); |
454 profile_.reset(NULL); | 463 profile_.reset(NULL); |
455 base::MessageLoop::current()->RunUntilIdle(); | 464 base::MessageLoop::current()->RunUntilIdle(); |
| 465 at_exit_manager_.reset(); |
| 466 |
| 467 // This is needed because otherwise the next unit test which creates an |
| 468 // in-process utility thread won't be able to create a TraceLog instance. |
| 469 base::debug::TraceLog::Resurrect(); |
456 } | 470 } |
457 | 471 |
458 void ExtensionServiceTestBase::InitializeExtensionService( | 472 void ExtensionServiceTestBase::InitializeExtensionService( |
459 const ExtensionServiceTestBase::ExtensionServiceInitParams& params) { | 473 const ExtensionServiceTestBase::ExtensionServiceInitParams& params) { |
460 TestingProfile::Builder profile_builder; | 474 TestingProfile::Builder profile_builder; |
461 // Create a PrefService that only contains user defined preference values. | 475 // Create a PrefService that only contains user defined preference values. |
462 PrefServiceMockBuilder builder; | 476 PrefServiceMockBuilder builder; |
463 builder.WithUserFilePrefs(params.pref_file, loop_.message_loop_proxy().get()); | 477 builder.WithUserFilePrefs(params.pref_file, loop_.message_loop_proxy().get()); |
464 scoped_refptr<user_prefs::PrefRegistrySyncable> registry( | 478 scoped_refptr<user_prefs::PrefRegistrySyncable> registry( |
465 new user_prefs::PrefRegistrySyncable); | 479 new user_prefs::PrefRegistrySyncable); |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
570 profile->CreateRequestContext(); | 584 profile->CreateRequestContext(); |
571 } | 585 } |
572 | 586 |
573 // static | 587 // static |
574 void ExtensionServiceTestBase::SetUpTestCase() { | 588 void ExtensionServiceTestBase::SetUpTestCase() { |
575 ExtensionErrorReporter::Init(false); // no noisy errors | 589 ExtensionErrorReporter::Init(false); // no noisy errors |
576 } | 590 } |
577 | 591 |
578 void ExtensionServiceTestBase::SetUp() { | 592 void ExtensionServiceTestBase::SetUp() { |
579 ExtensionErrorReporter::GetInstance()->ClearErrors(); | 593 ExtensionErrorReporter::GetInstance()->ClearErrors(); |
| 594 content::RenderProcessHost::SetRunRendererInProcess(true); |
| 595 } |
| 596 |
| 597 void ExtensionServiceTestBase::TearDown() { |
| 598 content::RenderProcessHost::SetRunRendererInProcess(false); |
580 } | 599 } |
581 | 600 |
582 class ExtensionServiceTest | 601 class ExtensionServiceTest |
583 : public ExtensionServiceTestBase, public content::NotificationObserver { | 602 : public ExtensionServiceTestBase, public content::NotificationObserver { |
584 public: | 603 public: |
585 ExtensionServiceTest() | 604 ExtensionServiceTest() |
586 : installed_(NULL), | 605 : installed_(NULL), |
587 was_update_(false), | 606 was_update_(false), |
588 override_external_install_prompt_( | 607 override_external_install_prompt_( |
589 FeatureSwitch::prompt_for_external_extensions(), false) { | 608 FeatureSwitch::prompt_for_external_extensions(), false) { |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
674 // to happen, use loop_.RunUntilIdle();. Most tests will not use this | 693 // to happen, use loop_.RunUntilIdle();. Most tests will not use this |
675 // method directly. Instead, use InstallCrx(), which waits for | 694 // method directly. Instead, use InstallCrx(), which waits for |
676 // the crx to be installed and does extra error checking. | 695 // the crx to be installed and does extra error checking. |
677 void StartCRXInstall(const base::FilePath& crx_path) { | 696 void StartCRXInstall(const base::FilePath& crx_path) { |
678 StartCRXInstall(crx_path, Extension::NO_FLAGS); | 697 StartCRXInstall(crx_path, Extension::NO_FLAGS); |
679 } | 698 } |
680 | 699 |
681 void StartCRXInstall(const base::FilePath& crx_path, int creation_flags) { | 700 void StartCRXInstall(const base::FilePath& crx_path, int creation_flags) { |
682 ASSERT_TRUE(file_util::PathExists(crx_path)) | 701 ASSERT_TRUE(file_util::PathExists(crx_path)) |
683 << "Path does not exist: "<< crx_path.value().c_str(); | 702 << "Path does not exist: "<< crx_path.value().c_str(); |
| 703 |
684 scoped_refptr<CrxInstaller> installer(CrxInstaller::Create(service_, NULL)); | 704 scoped_refptr<CrxInstaller> installer(CrxInstaller::Create(service_, NULL)); |
685 installer->set_creation_flags(creation_flags); | 705 installer->set_creation_flags(creation_flags); |
686 if (!(creation_flags & Extension::WAS_INSTALLED_BY_DEFAULT)) { | 706 if (!(creation_flags & Extension::WAS_INSTALLED_BY_DEFAULT)) { |
687 installer->set_allow_silent_install(true); | 707 installer->set_allow_silent_install(true); |
688 } | 708 } |
| 709 |
| 710 content::WindowedNotificationObserver windowed_observer( |
| 711 chrome::NOTIFICATION_CRX_INSTALLER_DONE, |
| 712 content::Source<extensions::CrxInstaller>(installer)); |
| 713 |
689 installer->InstallCrx(crx_path); | 714 installer->InstallCrx(crx_path); |
690 } | 715 } |
691 | 716 |
692 enum InstallState { | 717 enum InstallState { |
693 INSTALL_FAILED, | 718 INSTALL_FAILED, |
694 INSTALL_UPDATED, | 719 INSTALL_UPDATED, |
695 INSTALL_NEW, | 720 INSTALL_NEW, |
696 INSTALL_WITHOUT_LOAD, | 721 INSTALL_WITHOUT_LOAD, |
697 }; | 722 }; |
698 | 723 |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
779 | 804 |
780 // Wait for a CrxInstaller to finish. Used by InstallCRX. Set the | 805 // Wait for a CrxInstaller to finish. Used by InstallCRX. Set the |
781 // |install_state| to INSTALL_FAILED if the installation is expected to fail. | 806 // |install_state| to INSTALL_FAILED if the installation is expected to fail. |
782 // If |install_state| is INSTALL_UPDATED, and |expected_old_name| is | 807 // If |install_state| is INSTALL_UPDATED, and |expected_old_name| is |
783 // non-empty, expects that the existing extension's title was | 808 // non-empty, expects that the existing extension's title was |
784 // |expected_old_name|. | 809 // |expected_old_name|. |
785 // Returns an Extension pointer if the install succeeded, NULL otherwise. | 810 // Returns an Extension pointer if the install succeeded, NULL otherwise. |
786 const Extension* WaitForCrxInstall(const base::FilePath& path, | 811 const Extension* WaitForCrxInstall(const base::FilePath& path, |
787 InstallState install_state, | 812 InstallState install_state, |
788 const std::string& expected_old_name) { | 813 const std::string& expected_old_name) { |
789 loop_.RunUntilIdle(); | 814 content::WindowedNotificationObserver( |
| 815 chrome::NOTIFICATION_CRX_INSTALLER_DONE, |
| 816 content::NotificationService::AllSources()).Wait(); |
| 817 |
790 std::vector<string16> errors = GetErrors(); | 818 std::vector<string16> errors = GetErrors(); |
791 const Extension* extension = NULL; | 819 const Extension* extension = NULL; |
792 if (install_state != INSTALL_FAILED) { | 820 if (install_state != INSTALL_FAILED) { |
793 if (install_state == INSTALL_NEW) | 821 if (install_state == INSTALL_NEW) |
794 ++expected_extensions_count_; | 822 ++expected_extensions_count_; |
795 | 823 |
796 EXPECT_TRUE(installed_) << path.value(); | 824 EXPECT_TRUE(installed_) << path.value(); |
797 // If and only if INSTALL_UPDATED, it should have the is_update flag. | 825 // If and only if INSTALL_UPDATED, it should have the is_update flag. |
798 EXPECT_EQ(install_state == INSTALL_UPDATED, was_update_) | 826 EXPECT_EQ(install_state == INSTALL_UPDATED, was_update_) |
799 << path.value(); | 827 << path.value(); |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
865 base::FilePath path = temp_dir_.path(); | 893 base::FilePath path = temp_dir_.path(); |
866 path = path.Append(in_path.BaseName()); | 894 path = path.Append(in_path.BaseName()); |
867 ASSERT_TRUE(file_util::CopyFile(in_path, path)); | 895 ASSERT_TRUE(file_util::CopyFile(in_path, path)); |
868 | 896 |
869 int previous_enabled_extension_count = | 897 int previous_enabled_extension_count = |
870 service_->extensions()->size(); | 898 service_->extensions()->size(); |
871 int previous_installed_extension_count = | 899 int previous_installed_extension_count = |
872 previous_enabled_extension_count + | 900 previous_enabled_extension_count + |
873 service_->disabled_extensions()->size(); | 901 service_->disabled_extensions()->size(); |
874 | 902 |
875 service_->UpdateExtension(id, path, GURL(), NULL); | 903 extensions::CrxInstaller* installer = NULL; |
876 loop_.RunUntilIdle(); | 904 service_->UpdateExtension(id, path, GURL(), &installer); |
| 905 |
| 906 if (installer) { |
| 907 content::WindowedNotificationObserver( |
| 908 chrome::NOTIFICATION_CRX_INSTALLER_DONE, |
| 909 content::Source<extensions::CrxInstaller>(installer)).Wait(); |
| 910 } else { |
| 911 loop_.RunUntilIdle(); |
| 912 } |
877 | 913 |
878 std::vector<string16> errors = GetErrors(); | 914 std::vector<string16> errors = GetErrors(); |
879 int error_count = errors.size(); | 915 int error_count = errors.size(); |
880 int enabled_extension_count = | 916 int enabled_extension_count = |
881 service_->extensions()->size(); | 917 service_->extensions()->size(); |
882 int installed_extension_count = | 918 int installed_extension_count = |
883 enabled_extension_count + service_->disabled_extensions()->size(); | 919 enabled_extension_count + service_->disabled_extensions()->size(); |
884 | 920 |
885 int expected_error_count = (expected_state == FAILED) ? 1 : 0; | 921 int expected_error_count = (expected_state == FAILED) ? 1 : 0; |
886 EXPECT_EQ(expected_error_count, error_count) << path.value(); | 922 EXPECT_EQ(expected_error_count, error_count) << path.value(); |
(...skipping 690 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1577 TEST_F(ExtensionServiceTest, InstallingExternalExtensionWithFlags) { | 1613 TEST_F(ExtensionServiceTest, InstallingExternalExtensionWithFlags) { |
1578 const char kPrefFromBookmark[] = "from_bookmark"; | 1614 const char kPrefFromBookmark[] = "from_bookmark"; |
1579 | 1615 |
1580 InitializeEmptyExtensionService(); | 1616 InitializeEmptyExtensionService(); |
1581 | 1617 |
1582 base::FilePath path = data_dir_.AppendASCII("good.crx"); | 1618 base::FilePath path = data_dir_.AppendASCII("good.crx"); |
1583 set_extensions_enabled(true); | 1619 set_extensions_enabled(true); |
1584 | 1620 |
1585 // Register and install an external extension. | 1621 // Register and install an external extension. |
1586 Version version("1.0.0.0"); | 1622 Version version("1.0.0.0"); |
1587 service_->OnExternalExtensionFileFound( | 1623 if (service_->OnExternalExtensionFileFound( |
1588 good_crx, | 1624 good_crx, |
1589 &version, | 1625 &version, |
1590 path, | 1626 path, |
1591 Manifest::EXTERNAL_PREF, | 1627 Manifest::EXTERNAL_PREF, |
1592 Extension::FROM_BOOKMARK, | 1628 Extension::FROM_BOOKMARK, |
1593 false /* mark_acknowledged */); | 1629 false /* mark_acknowledged */)) { |
1594 loop_.RunUntilIdle(); | 1630 content::WindowedNotificationObserver( |
| 1631 chrome::NOTIFICATION_CRX_INSTALLER_DONE, |
| 1632 content::NotificationService::AllSources()).Wait(); |
| 1633 } |
1595 | 1634 |
1596 const Extension* extension = service_->GetExtensionById(good_crx, false); | 1635 const Extension* extension = service_->GetExtensionById(good_crx, false); |
1597 ASSERT_TRUE(extension); | 1636 ASSERT_TRUE(extension); |
1598 ASSERT_TRUE(extension->from_bookmark()); | 1637 ASSERT_TRUE(extension->from_bookmark()); |
1599 ValidateBooleanPref(good_crx, kPrefFromBookmark, true); | 1638 ValidateBooleanPref(good_crx, kPrefFromBookmark, true); |
1600 | 1639 |
1601 // Upgrade to version 2.0, the flag should be preserved. | 1640 // Upgrade to version 2.0, the flag should be preserved. |
1602 path = data_dir_.AppendASCII("good2.crx"); | 1641 path = data_dir_.AppendASCII("good2.crx"); |
1603 UpdateExtension(good_crx, path, ENABLED); | 1642 UpdateExtension(good_crx, path, ENABLED); |
| 1643 |
1604 ValidateBooleanPref(good_crx, kPrefFromBookmark, true); | 1644 ValidateBooleanPref(good_crx, kPrefFromBookmark, true); |
1605 extension = service_->GetExtensionById(good_crx, false); | 1645 extension = service_->GetExtensionById(good_crx, false); |
1606 ASSERT_TRUE(extension); | 1646 ASSERT_TRUE(extension); |
1607 ASSERT_TRUE(extension->from_bookmark()); | 1647 ASSERT_TRUE(extension->from_bookmark()); |
1608 } | 1648 } |
1609 | 1649 |
1610 // Test the handling of Extension::EXTERNAL_EXTENSION_UNINSTALLED | 1650 // Test the handling of Extension::EXTERNAL_EXTENSION_UNINSTALLED |
1611 TEST_F(ExtensionServiceTest, UninstallingExternalExtensions) { | 1651 TEST_F(ExtensionServiceTest, UninstallingExternalExtensions) { |
1612 InitializeEmptyExtensionService(); | 1652 InitializeEmptyExtensionService(); |
1613 | 1653 |
1614 base::FilePath path = data_dir_.AppendASCII("good.crx"); | 1654 base::FilePath path = data_dir_.AppendASCII("good.crx"); |
1615 set_extensions_enabled(true); | 1655 set_extensions_enabled(true); |
1616 | 1656 |
1617 Version version("1.0.0.0"); | 1657 Version version("1.0.0.0"); |
1618 // Install an external extension. | 1658 // Install an external extension. |
1619 service_->OnExternalExtensionFileFound(good_crx, &version, | 1659 if (service_->OnExternalExtensionFileFound(good_crx, &version, |
1620 path, Manifest::EXTERNAL_PREF, | 1660 path, Manifest::EXTERNAL_PREF, |
1621 Extension::NO_FLAGS, false); | 1661 Extension::NO_FLAGS, false)) { |
1622 loop_.RunUntilIdle(); | 1662 content::WindowedNotificationObserver( |
| 1663 chrome::NOTIFICATION_CRX_INSTALLER_DONE, |
| 1664 content::NotificationService::AllSources()).Wait(); |
| 1665 } |
| 1666 |
1623 ASSERT_TRUE(service_->GetExtensionById(good_crx, false)); | 1667 ASSERT_TRUE(service_->GetExtensionById(good_crx, false)); |
1624 | 1668 |
1625 // Uninstall it and check that its killbit gets set. | 1669 // Uninstall it and check that its killbit gets set. |
1626 UninstallExtension(good_crx, false); | 1670 UninstallExtension(good_crx, false); |
1627 ValidateIntegerPref(good_crx, "location", | 1671 ValidateIntegerPref(good_crx, "location", |
1628 Extension::EXTERNAL_EXTENSION_UNINSTALLED); | 1672 Extension::EXTERNAL_EXTENSION_UNINSTALLED); |
1629 | 1673 |
1630 // Try to re-install it externally. This should fail because of the killbit. | 1674 // Try to re-install it externally. This should fail because of the killbit. |
1631 service_->OnExternalExtensionFileFound(good_crx, &version, | 1675 service_->OnExternalExtensionFileFound(good_crx, &version, |
1632 path, Manifest::EXTERNAL_PREF, | 1676 path, Manifest::EXTERNAL_PREF, |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1695 const std::string wrong_id = all_zero; | 1739 const std::string wrong_id = all_zero; |
1696 const std::string correct_id = good_crx; | 1740 const std::string correct_id = good_crx; |
1697 ASSERT_NE(correct_id, wrong_id); | 1741 ASSERT_NE(correct_id, wrong_id); |
1698 | 1742 |
1699 // Install an external extension with an ID from the external | 1743 // Install an external extension with an ID from the external |
1700 // source that is not equal to the ID in the extension manifest. | 1744 // source that is not equal to the ID in the extension manifest. |
1701 service_->OnExternalExtensionFileFound( | 1745 service_->OnExternalExtensionFileFound( |
1702 wrong_id, &version, path, Manifest::EXTERNAL_PREF, | 1746 wrong_id, &version, path, Manifest::EXTERNAL_PREF, |
1703 Extension::NO_FLAGS, false); | 1747 Extension::NO_FLAGS, false); |
1704 | 1748 |
1705 loop_.RunUntilIdle(); | 1749 content::WindowedNotificationObserver( |
| 1750 chrome::NOTIFICATION_CRX_INSTALLER_DONE, |
| 1751 content::NotificationService::AllSources()).Wait(); |
1706 ASSERT_FALSE(service_->GetExtensionById(good_crx, false)); | 1752 ASSERT_FALSE(service_->GetExtensionById(good_crx, false)); |
1707 | 1753 |
1708 // Try again with the right ID. Expect success. | 1754 // Try again with the right ID. Expect success. |
1709 service_->OnExternalExtensionFileFound( | 1755 if (service_->OnExternalExtensionFileFound( |
1710 correct_id, &version, path, Manifest::EXTERNAL_PREF, | 1756 correct_id, &version, path, Manifest::EXTERNAL_PREF, |
1711 Extension::NO_FLAGS, false); | 1757 Extension::NO_FLAGS, false)) { |
1712 loop_.RunUntilIdle(); | 1758 content::WindowedNotificationObserver( |
| 1759 chrome::NOTIFICATION_CRX_INSTALLER_DONE, |
| 1760 content::NotificationService::AllSources()).Wait(); |
| 1761 } |
1713 ASSERT_TRUE(service_->GetExtensionById(good_crx, false)); | 1762 ASSERT_TRUE(service_->GetExtensionById(good_crx, false)); |
1714 } | 1763 } |
1715 | 1764 |
1716 // Test that external extensions with incorrect versions are not installed. | 1765 // Test that external extensions with incorrect versions are not installed. |
1717 TEST_F(ExtensionServiceTest, FailOnWrongVersion) { | 1766 TEST_F(ExtensionServiceTest, FailOnWrongVersion) { |
1718 InitializeEmptyExtensionService(); | 1767 InitializeEmptyExtensionService(); |
1719 base::FilePath path = data_dir_.AppendASCII("good.crx"); | 1768 base::FilePath path = data_dir_.AppendASCII("good.crx"); |
1720 set_extensions_enabled(true); | 1769 set_extensions_enabled(true); |
1721 | 1770 |
1722 // Install an external extension with a version from the external | 1771 // Install an external extension with a version from the external |
1723 // source that is not equal to the version in the extension manifest. | 1772 // source that is not equal to the version in the extension manifest. |
1724 Version wrong_version("1.2.3.4"); | 1773 Version wrong_version("1.2.3.4"); |
1725 service_->OnExternalExtensionFileFound( | 1774 service_->OnExternalExtensionFileFound( |
1726 good_crx, &wrong_version, path, Manifest::EXTERNAL_PREF, | 1775 good_crx, &wrong_version, path, Manifest::EXTERNAL_PREF, |
1727 Extension::NO_FLAGS, false); | 1776 Extension::NO_FLAGS, false); |
1728 | 1777 |
1729 loop_.RunUntilIdle(); | 1778 content::WindowedNotificationObserver( |
| 1779 chrome::NOTIFICATION_CRX_INSTALLER_DONE, |
| 1780 content::NotificationService::AllSources()).Wait(); |
1730 ASSERT_FALSE(service_->GetExtensionById(good_crx, false)); | 1781 ASSERT_FALSE(service_->GetExtensionById(good_crx, false)); |
1731 | 1782 |
1732 // Try again with the right version. Expect success. | 1783 // Try again with the right version. Expect success. |
1733 service_->pending_extension_manager()->Remove(good_crx); | 1784 service_->pending_extension_manager()->Remove(good_crx); |
1734 Version correct_version("1.0.0.0"); | 1785 Version correct_version("1.0.0.0"); |
1735 service_->OnExternalExtensionFileFound( | 1786 if (service_->OnExternalExtensionFileFound( |
1736 good_crx, &correct_version, path, Manifest::EXTERNAL_PREF, | 1787 good_crx, &correct_version, path, Manifest::EXTERNAL_PREF, |
1737 Extension::NO_FLAGS, false); | 1788 Extension::NO_FLAGS, false)) { |
1738 loop_.RunUntilIdle(); | 1789 content::WindowedNotificationObserver( |
| 1790 chrome::NOTIFICATION_CRX_INSTALLER_DONE, |
| 1791 content::NotificationService::AllSources()).Wait(); |
| 1792 } |
1739 ASSERT_TRUE(service_->GetExtensionById(good_crx, false)); | 1793 ASSERT_TRUE(service_->GetExtensionById(good_crx, false)); |
1740 } | 1794 } |
1741 | 1795 |
1742 // Install a user script (they get converted automatically to an extension) | 1796 // Install a user script (they get converted automatically to an extension) |
1743 TEST_F(ExtensionServiceTest, InstallUserScript) { | 1797 TEST_F(ExtensionServiceTest, InstallUserScript) { |
1744 // The details of script conversion are tested elsewhere, this just tests | 1798 // The details of script conversion are tested elsewhere, this just tests |
1745 // integration with ExtensionService. | 1799 // integration with ExtensionService. |
1746 InitializeEmptyExtensionService(); | 1800 InitializeEmptyExtensionService(); |
1747 | 1801 |
1748 base::FilePath path = data_dir_ | 1802 base::FilePath path = data_dir_ |
(...skipping 1654 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3403 MockExtensionProvider* provider = | 3457 MockExtensionProvider* provider = |
3404 new MockExtensionProvider(service_, | 3458 new MockExtensionProvider(service_, |
3405 Manifest::EXTERNAL_POLICY_DOWNLOAD); | 3459 Manifest::EXTERNAL_POLICY_DOWNLOAD); |
3406 AddMockExternalProvider(provider); | 3460 AddMockExternalProvider(provider); |
3407 provider->UpdateOrAddExtension(good_crx, "1.0.0.0", | 3461 provider->UpdateOrAddExtension(good_crx, "1.0.0.0", |
3408 data_dir_.AppendASCII("good.crx")); | 3462 data_dir_.AppendASCII("good.crx")); |
3409 | 3463 |
3410 // Reloading extensions should find our externally registered extension | 3464 // Reloading extensions should find our externally registered extension |
3411 // and install it. | 3465 // and install it. |
3412 service_->CheckForExternalUpdates(); | 3466 service_->CheckForExternalUpdates(); |
3413 loop_.RunUntilIdle(); | 3467 content::WindowedNotificationObserver( |
| 3468 chrome::NOTIFICATION_CRX_INSTALLER_DONE, |
| 3469 content::NotificationService::AllSources()).Wait(); |
3414 | 3470 |
3415 // Extension should be installed despite blacklist. | 3471 // Extension should be installed despite blacklist. |
3416 ASSERT_EQ(1u, service_->extensions()->size()); | 3472 ASSERT_EQ(1u, service_->extensions()->size()); |
3417 EXPECT_TRUE(service_->GetExtensionById(good_crx, false)); | 3473 EXPECT_TRUE(service_->GetExtensionById(good_crx, false)); |
3418 | 3474 |
3419 // Blacklist update should not uninstall the extension. | 3475 // Blacklist update should not uninstall the extension. |
3420 { | 3476 { |
3421 ListPrefUpdate update(profile_->GetPrefs(), | 3477 ListPrefUpdate update(profile_->GetPrefs(), |
3422 prefs::kExtensionInstallDenyList); | 3478 prefs::kExtensionInstallDenyList); |
3423 ListValue* blacklist = update.Get(); | 3479 ListValue* blacklist = update.Get(); |
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3581 MockExtensionProvider* provider = | 3637 MockExtensionProvider* provider = |
3582 new MockExtensionProvider(service_, | 3638 new MockExtensionProvider(service_, |
3583 Manifest::EXTERNAL_POLICY_DOWNLOAD); | 3639 Manifest::EXTERNAL_POLICY_DOWNLOAD); |
3584 AddMockExternalProvider(provider); | 3640 AddMockExternalProvider(provider); |
3585 provider->UpdateOrAddExtension(page_action, "1.0.0.0", | 3641 provider->UpdateOrAddExtension(page_action, "1.0.0.0", |
3586 data_dir_.AppendASCII("page_action.crx")); | 3642 data_dir_.AppendASCII("page_action.crx")); |
3587 } | 3643 } |
3588 | 3644 |
3589 // Providers are set up. Let them run. | 3645 // Providers are set up. Let them run. |
3590 service_->CheckForExternalUpdates(); | 3646 service_->CheckForExternalUpdates(); |
3591 loop_.RunUntilIdle(); | 3647 |
| 3648 int count = 2; |
| 3649 content::WindowedNotificationObserver( |
| 3650 chrome::NOTIFICATION_CRX_INSTALLER_DONE, |
| 3651 base::Bind(&WaitForCountNotificationsCallback, &count)).Wait(); |
3592 | 3652 |
3593 ASSERT_EQ(2u, service_->extensions()->size()); | 3653 ASSERT_EQ(2u, service_->extensions()->size()); |
3594 EXPECT_TRUE(service_->GetExtensionById(good_crx, false)); | 3654 EXPECT_TRUE(service_->GetExtensionById(good_crx, false)); |
3595 EXPECT_TRUE(service_->GetExtensionById(page_action, false)); | 3655 EXPECT_TRUE(service_->GetExtensionById(page_action, false)); |
3596 ExtensionPrefs* prefs = service_->extension_prefs(); | 3656 ExtensionPrefs* prefs = service_->extension_prefs(); |
3597 ASSERT_TRUE(!prefs->IsExternalExtensionAcknowledged(good_crx)); | 3657 ASSERT_TRUE(!prefs->IsExternalExtensionAcknowledged(good_crx)); |
3598 ASSERT_TRUE(prefs->IsExternalExtensionAcknowledged(page_action)); | 3658 ASSERT_TRUE(prefs->IsExternalExtensionAcknowledged(page_action)); |
3599 } | 3659 } |
3600 | 3660 |
3601 #if !defined(OS_CHROMEOS) | 3661 #if !defined(OS_CHROMEOS) |
(...skipping 19 matching lines...) Expand all Loading... |
3621 new extensions::ExternalTestingLoader(json_data, data_dir_), | 3681 new extensions::ExternalTestingLoader(json_data, data_dir_), |
3622 Manifest::INTERNAL, | 3682 Manifest::INTERNAL, |
3623 Manifest::INVALID_LOCATION, | 3683 Manifest::INVALID_LOCATION, |
3624 Extension::FROM_WEBSTORE | Extension::WAS_INSTALLED_BY_DEFAULT); | 3684 Extension::FROM_WEBSTORE | Extension::WAS_INSTALLED_BY_DEFAULT); |
3625 | 3685 |
3626 AddMockExternalProvider(provider); | 3686 AddMockExternalProvider(provider); |
3627 } | 3687 } |
3628 | 3688 |
3629 ASSERT_EQ(0u, service_->extensions()->size()); | 3689 ASSERT_EQ(0u, service_->extensions()->size()); |
3630 service_->CheckForExternalUpdates(); | 3690 service_->CheckForExternalUpdates(); |
3631 loop_.RunUntilIdle(); | 3691 content::WindowedNotificationObserver( |
| 3692 chrome::NOTIFICATION_CRX_INSTALLER_DONE, |
| 3693 content::NotificationService::AllSources()).Wait(); |
3632 | 3694 |
3633 ASSERT_EQ(1u, service_->extensions()->size()); | 3695 ASSERT_EQ(1u, service_->extensions()->size()); |
3634 EXPECT_TRUE(service_->GetExtensionById(good_crx, false)); | 3696 EXPECT_TRUE(service_->GetExtensionById(good_crx, false)); |
3635 const Extension* extension = service_->GetExtensionById(good_crx, false); | 3697 const Extension* extension = service_->GetExtensionById(good_crx, false); |
3636 EXPECT_TRUE(extension->from_webstore()); | 3698 EXPECT_TRUE(extension->from_webstore()); |
3637 EXPECT_TRUE(extension->was_installed_by_default()); | 3699 EXPECT_TRUE(extension->was_installed_by_default()); |
3638 | |
3639 } | 3700 } |
3640 #endif | 3701 #endif |
3641 | 3702 |
3642 // Tests disabling extensions | 3703 // Tests disabling extensions |
3643 TEST_F(ExtensionServiceTest, DisableExtension) { | 3704 TEST_F(ExtensionServiceTest, DisableExtension) { |
3644 InitializeEmptyExtensionService(); | 3705 InitializeEmptyExtensionService(); |
3645 | 3706 |
3646 InstallCRX(data_dir_.AppendASCII("good.crx"), INSTALL_NEW); | 3707 InstallCRX(data_dir_.AppendASCII("good.crx"), INSTALL_NEW); |
3647 EXPECT_FALSE(service_->extensions()->is_empty()); | 3708 EXPECT_FALSE(service_->extensions()->is_empty()); |
3648 EXPECT_TRUE(service_->GetExtensionById(good_crx, true)); | 3709 EXPECT_TRUE(service_->GetExtensionById(good_crx, true)); |
(...skipping 597 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4246 | 4307 |
4247 // Register a test extension externally using the mock registry provider. | 4308 // Register a test extension externally using the mock registry provider. |
4248 base::FilePath source_path = data_dir_.AppendASCII("good.crx"); | 4309 base::FilePath source_path = data_dir_.AppendASCII("good.crx"); |
4249 | 4310 |
4250 // Add the extension. | 4311 // Add the extension. |
4251 provider->UpdateOrAddExtension(good_crx, "1.0.0.0", source_path); | 4312 provider->UpdateOrAddExtension(good_crx, "1.0.0.0", source_path); |
4252 | 4313 |
4253 // Reloading extensions should find our externally registered extension | 4314 // Reloading extensions should find our externally registered extension |
4254 // and install it. | 4315 // and install it. |
4255 service_->CheckForExternalUpdates(); | 4316 service_->CheckForExternalUpdates(); |
4256 loop_.RunUntilIdle(); | 4317 content::WindowedNotificationObserver( |
| 4318 chrome::NOTIFICATION_CRX_INSTALLER_DONE, |
| 4319 content::NotificationService::AllSources()).Wait(); |
4257 | 4320 |
4258 ASSERT_EQ(0u, GetErrors().size()); | 4321 ASSERT_EQ(0u, GetErrors().size()); |
4259 ASSERT_EQ(1u, loaded_.size()); | 4322 ASSERT_EQ(1u, loaded_.size()); |
4260 ASSERT_EQ(location, loaded_[0]->location()); | 4323 ASSERT_EQ(location, loaded_[0]->location()); |
4261 ASSERT_EQ("1.0.0.0", loaded_[0]->version()->GetString()); | 4324 ASSERT_EQ("1.0.0.0", loaded_[0]->version()->GetString()); |
4262 ValidatePrefKeyCount(1); | 4325 ValidatePrefKeyCount(1); |
4263 ValidateIntegerPref(good_crx, "state", Extension::ENABLED); | 4326 ValidateIntegerPref(good_crx, "state", Extension::ENABLED); |
4264 ValidateIntegerPref(good_crx, "location", location); | 4327 ValidateIntegerPref(good_crx, "location", location); |
4265 | 4328 |
4266 // Reload extensions without changing anything. The extension should be | 4329 // Reload extensions without changing anything. The extension should be |
4267 // loaded again. | 4330 // loaded again. |
4268 loaded_.clear(); | 4331 loaded_.clear(); |
4269 service_->ReloadExtensions(); | 4332 service_->ReloadExtensions(); |
4270 loop_.RunUntilIdle(); | 4333 loop_.RunUntilIdle(); |
4271 ASSERT_EQ(0u, GetErrors().size()); | 4334 ASSERT_EQ(0u, GetErrors().size()); |
4272 ASSERT_EQ(1u, loaded_.size()); | 4335 ASSERT_EQ(1u, loaded_.size()); |
4273 ValidatePrefKeyCount(1); | 4336 ValidatePrefKeyCount(1); |
4274 ValidateIntegerPref(good_crx, "state", Extension::ENABLED); | 4337 ValidateIntegerPref(good_crx, "state", Extension::ENABLED); |
4275 ValidateIntegerPref(good_crx, "location", location); | 4338 ValidateIntegerPref(good_crx, "location", location); |
4276 | 4339 |
4277 // Now update the extension with a new version. We should get upgraded. | 4340 // Now update the extension with a new version. We should get upgraded. |
4278 source_path = source_path.DirName().AppendASCII("good2.crx"); | 4341 source_path = source_path.DirName().AppendASCII("good2.crx"); |
4279 provider->UpdateOrAddExtension(good_crx, "1.0.0.1", source_path); | 4342 provider->UpdateOrAddExtension(good_crx, "1.0.0.1", source_path); |
4280 | 4343 |
4281 loaded_.clear(); | 4344 loaded_.clear(); |
4282 service_->CheckForExternalUpdates(); | 4345 service_->CheckForExternalUpdates(); |
4283 loop_.RunUntilIdle(); | 4346 content::WindowedNotificationObserver( |
| 4347 chrome::NOTIFICATION_CRX_INSTALLER_DONE, |
| 4348 content::NotificationService::AllSources()).Wait(); |
4284 ASSERT_EQ(0u, GetErrors().size()); | 4349 ASSERT_EQ(0u, GetErrors().size()); |
4285 ASSERT_EQ(1u, loaded_.size()); | 4350 ASSERT_EQ(1u, loaded_.size()); |
4286 ASSERT_EQ("1.0.0.1", loaded_[0]->version()->GetString()); | 4351 ASSERT_EQ("1.0.0.1", loaded_[0]->version()->GetString()); |
4287 ValidatePrefKeyCount(1); | 4352 ValidatePrefKeyCount(1); |
4288 ValidateIntegerPref(good_crx, "state", Extension::ENABLED); | 4353 ValidateIntegerPref(good_crx, "state", Extension::ENABLED); |
4289 ValidateIntegerPref(good_crx, "location", location); | 4354 ValidateIntegerPref(good_crx, "location", location); |
4290 | 4355 |
4291 // Uninstall the extension and reload. Nothing should happen because the | 4356 // Uninstall the extension and reload. Nothing should happen because the |
4292 // preference should prevent us from reinstalling. | 4357 // preference should prevent us from reinstalling. |
4293 std::string id = loaded_[0]->id(); | 4358 std::string id = loaded_[0]->id(); |
(...skipping 16 matching lines...) Expand all Loading... |
4310 ValidatePrefKeyCount(1); | 4375 ValidatePrefKeyCount(1); |
4311 ValidateIntegerPref(good_crx, "state", | 4376 ValidateIntegerPref(good_crx, "state", |
4312 Extension::EXTERNAL_EXTENSION_UNINSTALLED); | 4377 Extension::EXTERNAL_EXTENSION_UNINSTALLED); |
4313 ValidateIntegerPref(good_crx, "location", location); | 4378 ValidateIntegerPref(good_crx, "location", location); |
4314 | 4379 |
4315 // Now clear the preference and reinstall. | 4380 // Now clear the preference and reinstall. |
4316 SetPrefInteg(good_crx, "state", Extension::ENABLED); | 4381 SetPrefInteg(good_crx, "state", Extension::ENABLED); |
4317 | 4382 |
4318 loaded_.clear(); | 4383 loaded_.clear(); |
4319 service_->CheckForExternalUpdates(); | 4384 service_->CheckForExternalUpdates(); |
4320 loop_.RunUntilIdle(); | 4385 content::WindowedNotificationObserver( |
| 4386 chrome::NOTIFICATION_CRX_INSTALLER_DONE, |
| 4387 content::NotificationService::AllSources()).Wait(); |
4321 ASSERT_EQ(1u, loaded_.size()); | 4388 ASSERT_EQ(1u, loaded_.size()); |
4322 } | 4389 } |
4323 ValidatePrefKeyCount(1); | 4390 ValidatePrefKeyCount(1); |
4324 ValidateIntegerPref(good_crx, "state", Extension::ENABLED); | 4391 ValidateIntegerPref(good_crx, "state", Extension::ENABLED); |
4325 ValidateIntegerPref(good_crx, "location", location); | 4392 ValidateIntegerPref(good_crx, "location", location); |
4326 | 4393 |
4327 if (management_policy_->MustRemainEnabled(loaded_[0].get(), NULL)) { | 4394 if (management_policy_->MustRemainEnabled(loaded_[0].get(), NULL)) { |
4328 EXPECT_EQ(2, provider->visit_count()); | 4395 EXPECT_EQ(2, provider->visit_count()); |
4329 } else { | 4396 } else { |
4330 // Now test an externally triggered uninstall (deleting the registry key or | 4397 // Now test an externally triggered uninstall (deleting the registry key or |
4331 // the pref entry). | 4398 // the pref entry). |
4332 provider->RemoveExtension(good_crx); | 4399 provider->RemoveExtension(good_crx); |
4333 | 4400 |
4334 loaded_.clear(); | 4401 loaded_.clear(); |
4335 service_->OnExternalProviderReady(provider); | 4402 service_->OnExternalProviderReady(provider); |
4336 loop_.RunUntilIdle(); | 4403 loop_.RunUntilIdle(); |
4337 ASSERT_EQ(0u, loaded_.size()); | 4404 ASSERT_EQ(0u, loaded_.size()); |
4338 ValidatePrefKeyCount(0); | 4405 ValidatePrefKeyCount(0); |
4339 | 4406 |
4340 // The extension should also be gone from the install directory. | 4407 // The extension should also be gone from the install directory. |
4341 ASSERT_FALSE(file_util::PathExists(install_path)); | 4408 ASSERT_FALSE(file_util::PathExists(install_path)); |
4342 | 4409 |
4343 // Now test the case where user uninstalls and then the extension is removed | 4410 // Now test the case where user uninstalls and then the extension is removed |
4344 // from the external provider. | 4411 // from the external provider. |
4345 provider->UpdateOrAddExtension(good_crx, "1.0.0.1", source_path); | 4412 provider->UpdateOrAddExtension(good_crx, "1.0.0.1", source_path); |
4346 service_->CheckForExternalUpdates(); | 4413 service_->CheckForExternalUpdates(); |
4347 loop_.RunUntilIdle(); | 4414 content::WindowedNotificationObserver( |
| 4415 chrome::NOTIFICATION_CRX_INSTALLER_DONE, |
| 4416 content::NotificationService::AllSources()).Wait(); |
4348 | 4417 |
4349 ASSERT_EQ(1u, loaded_.size()); | 4418 ASSERT_EQ(1u, loaded_.size()); |
4350 ASSERT_EQ(0u, GetErrors().size()); | 4419 ASSERT_EQ(0u, GetErrors().size()); |
4351 | 4420 |
4352 // User uninstalls. | 4421 // User uninstalls. |
4353 loaded_.clear(); | 4422 loaded_.clear(); |
4354 service_->UninstallExtension(id, false, NULL); | 4423 service_->UninstallExtension(id, false, NULL); |
4355 loop_.RunUntilIdle(); | 4424 loop_.RunUntilIdle(); |
4356 ASSERT_EQ(0u, loaded_.size()); | 4425 ASSERT_EQ(0u, loaded_.size()); |
4357 | 4426 |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4488 | 4557 |
4489 // Register a test extension externally using the mock registry provider. | 4558 // Register a test extension externally using the mock registry provider. |
4490 base::FilePath source_path = data_dir_.AppendASCII("good.crx"); | 4559 base::FilePath source_path = data_dir_.AppendASCII("good.crx"); |
4491 provider->UpdateOrAddExtension(good_crx, "1.0.0.0", source_path); | 4560 provider->UpdateOrAddExtension(good_crx, "1.0.0.0", source_path); |
4492 | 4561 |
4493 // Two checks for external updates should find the extension, and install it | 4562 // Two checks for external updates should find the extension, and install it |
4494 // once. | 4563 // once. |
4495 provider->set_visit_count(0); | 4564 provider->set_visit_count(0); |
4496 service_->CheckForExternalUpdates(); | 4565 service_->CheckForExternalUpdates(); |
4497 service_->CheckForExternalUpdates(); | 4566 service_->CheckForExternalUpdates(); |
4498 loop_.RunUntilIdle(); | 4567 content::WindowedNotificationObserver( |
| 4568 chrome::NOTIFICATION_CRX_INSTALLER_DONE, |
| 4569 content::NotificationService::AllSources()).Wait(); |
4499 EXPECT_EQ(2, provider->visit_count()); | 4570 EXPECT_EQ(2, provider->visit_count()); |
4500 ASSERT_EQ(0u, GetErrors().size()); | 4571 ASSERT_EQ(0u, GetErrors().size()); |
4501 ASSERT_EQ(1u, loaded_.size()); | 4572 ASSERT_EQ(1u, loaded_.size()); |
4502 ASSERT_EQ(Manifest::EXTERNAL_PREF, loaded_[0]->location()); | 4573 ASSERT_EQ(Manifest::EXTERNAL_PREF, loaded_[0]->location()); |
4503 ASSERT_EQ("1.0.0.0", loaded_[0]->version()->GetString()); | 4574 ASSERT_EQ("1.0.0.0", loaded_[0]->version()->GetString()); |
4504 ValidatePrefKeyCount(1); | 4575 ValidatePrefKeyCount(1); |
4505 ValidateIntegerPref(good_crx, "state", Extension::ENABLED); | 4576 ValidateIntegerPref(good_crx, "state", Extension::ENABLED); |
4506 ValidateIntegerPref(good_crx, "location", Manifest::EXTERNAL_PREF); | 4577 ValidateIntegerPref(good_crx, "location", Manifest::EXTERNAL_PREF); |
4507 | 4578 |
4508 provider->RemoveExtension(good_crx); | 4579 provider->RemoveExtension(good_crx); |
(...skipping 1372 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5881 EXPECT_TRUE(AddPendingSyncInstall()); | 5952 EXPECT_TRUE(AddPendingSyncInstall()); |
5882 ASSERT_EQ(Manifest::INTERNAL, GetPendingLocation()); | 5953 ASSERT_EQ(Manifest::INTERNAL, GetPendingLocation()); |
5883 EXPECT_TRUE(GetPendingIsFromSync()); | 5954 EXPECT_TRUE(GetPendingIsFromSync()); |
5884 ASSERT_FALSE(IsCrxInstalled()); | 5955 ASSERT_FALSE(IsCrxInstalled()); |
5885 | 5956 |
5886 // Install pending as external prefs json would. | 5957 // Install pending as external prefs json would. |
5887 AddPendingExternalPrefFileInstall(); | 5958 AddPendingExternalPrefFileInstall(); |
5888 ASSERT_EQ(Manifest::EXTERNAL_PREF, GetPendingLocation()); | 5959 ASSERT_EQ(Manifest::EXTERNAL_PREF, GetPendingLocation()); |
5889 ASSERT_FALSE(IsCrxInstalled()); | 5960 ASSERT_FALSE(IsCrxInstalled()); |
5890 | 5961 |
5891 // Another request from sync should be ignorred. | 5962 // Another request from sync should be ignored. |
5892 EXPECT_FALSE(AddPendingSyncInstall()); | 5963 EXPECT_FALSE(AddPendingSyncInstall()); |
5893 ASSERT_EQ(Manifest::EXTERNAL_PREF, GetPendingLocation()); | 5964 ASSERT_EQ(Manifest::EXTERNAL_PREF, GetPendingLocation()); |
5894 ASSERT_FALSE(IsCrxInstalled()); | 5965 ASSERT_FALSE(IsCrxInstalled()); |
5895 | 5966 |
5896 WaitForCrxInstall(crx_path_, INSTALL_NEW); | 5967 WaitForCrxInstall(crx_path_, INSTALL_NEW); |
5897 ASSERT_TRUE(IsCrxInstalled()); | 5968 ASSERT_TRUE(IsCrxInstalled()); |
5898 } | 5969 } |
5899 | 5970 |
5900 // Test that an install of an external CRX from an update overrides | 5971 // Test that an install of an external CRX from an update overrides |
5901 // an install of the same extension from sync. | 5972 // an install of the same extension from sync. |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5968 service_->CheckForExternalUpdates(); | 6039 service_->CheckForExternalUpdates(); |
5969 loop_.RunUntilIdle(); | 6040 loop_.RunUntilIdle(); |
5970 EXPECT_FALSE(extensions::HasExternalInstallError(service_)); | 6041 EXPECT_FALSE(extensions::HasExternalInstallError(service_)); |
5971 | 6042 |
5972 // A hosted app, installed externally. | 6043 // A hosted app, installed externally. |
5973 // This should NOT trigger an alert. | 6044 // This should NOT trigger an alert. |
5974 provider->UpdateOrAddExtension(hosted_app, "1.0.0.0", | 6045 provider->UpdateOrAddExtension(hosted_app, "1.0.0.0", |
5975 data_dir_.AppendASCII("hosted_app.crx")); | 6046 data_dir_.AppendASCII("hosted_app.crx")); |
5976 | 6047 |
5977 service_->CheckForExternalUpdates(); | 6048 service_->CheckForExternalUpdates(); |
5978 loop_.RunUntilIdle(); | 6049 content::WindowedNotificationObserver( |
| 6050 chrome::NOTIFICATION_CRX_INSTALLER_DONE, |
| 6051 content::NotificationService::AllSources()).Wait(); |
5979 EXPECT_FALSE(extensions::HasExternalInstallError(service_)); | 6052 EXPECT_FALSE(extensions::HasExternalInstallError(service_)); |
5980 | 6053 |
5981 // Another normal extension, but installed externally. | 6054 // Another normal extension, but installed externally. |
5982 // This SHOULD trigger an alert. | 6055 // This SHOULD trigger an alert. |
5983 provider->UpdateOrAddExtension(page_action, "1.0.0.0", | 6056 provider->UpdateOrAddExtension(page_action, "1.0.0.0", |
5984 data_dir_.AppendASCII("page_action.crx")); | 6057 data_dir_.AppendASCII("page_action.crx")); |
5985 | 6058 |
5986 service_->CheckForExternalUpdates(); | 6059 service_->CheckForExternalUpdates(); |
5987 loop_.RunUntilIdle(); | 6060 content::WindowedNotificationObserver( |
| 6061 chrome::NOTIFICATION_CRX_INSTALLER_DONE, |
| 6062 content::NotificationService::AllSources()).Wait(); |
5988 EXPECT_TRUE(extensions::HasExternalInstallError(service_)); | 6063 EXPECT_TRUE(extensions::HasExternalInstallError(service_)); |
5989 } | 6064 } |
5990 | 6065 |
5991 // Test that external extensions are initially disabled, and that enabling | 6066 // Test that external extensions are initially disabled, and that enabling |
5992 // them clears the prompt. | 6067 // them clears the prompt. |
5993 TEST_F(ExtensionServiceTest, ExternalInstallInitiallyDisabled) { | 6068 TEST_F(ExtensionServiceTest, ExternalInstallInitiallyDisabled) { |
5994 FeatureSwitch::ScopedOverride prompt( | 6069 FeatureSwitch::ScopedOverride prompt( |
5995 FeatureSwitch::prompt_for_external_extensions(), true); | 6070 FeatureSwitch::prompt_for_external_extensions(), true); |
5996 | 6071 |
5997 InitializeEmptyExtensionService(); | 6072 InitializeEmptyExtensionService(); |
5998 MockExtensionProvider* provider = | 6073 MockExtensionProvider* provider = |
5999 new MockExtensionProvider(service_, Manifest::EXTERNAL_PREF); | 6074 new MockExtensionProvider(service_, Manifest::EXTERNAL_PREF); |
6000 AddMockExternalProvider(provider); | 6075 AddMockExternalProvider(provider); |
6001 | 6076 |
6002 provider->UpdateOrAddExtension(page_action, "1.0.0.0", | 6077 provider->UpdateOrAddExtension(page_action, "1.0.0.0", |
6003 data_dir_.AppendASCII("page_action.crx")); | 6078 data_dir_.AppendASCII("page_action.crx")); |
6004 | 6079 |
6005 service_->CheckForExternalUpdates(); | 6080 service_->CheckForExternalUpdates(); |
6006 loop_.RunUntilIdle(); | 6081 content::WindowedNotificationObserver( |
| 6082 chrome::NOTIFICATION_CRX_INSTALLER_DONE, |
| 6083 content::NotificationService::AllSources()).Wait(); |
6007 EXPECT_TRUE(extensions::HasExternalInstallError(service_)); | 6084 EXPECT_TRUE(extensions::HasExternalInstallError(service_)); |
6008 EXPECT_FALSE(service_->IsExtensionEnabled(page_action)); | 6085 EXPECT_FALSE(service_->IsExtensionEnabled(page_action)); |
6009 | 6086 |
6010 const Extension* extension = | 6087 const Extension* extension = |
6011 service_->disabled_extensions()->GetByID(page_action); | 6088 service_->disabled_extensions()->GetByID(page_action); |
6012 EXPECT_TRUE(extension); | 6089 EXPECT_TRUE(extension); |
6013 EXPECT_EQ(page_action, extension->id()); | 6090 EXPECT_EQ(page_action, extension->id()); |
6014 | 6091 |
6015 service_->EnableExtension(page_action); | 6092 service_->EnableExtension(page_action); |
6016 EXPECT_FALSE(extensions::HasExternalInstallError(service_)); | 6093 EXPECT_FALSE(extensions::HasExternalInstallError(service_)); |
(...skipping 11 matching lines...) Expand all Loading... |
6028 AddMockExternalProvider(provider); | 6105 AddMockExternalProvider(provider); |
6029 | 6106 |
6030 provider->UpdateOrAddExtension(page_action, "1.0.0.0", | 6107 provider->UpdateOrAddExtension(page_action, "1.0.0.0", |
6031 data_dir_.AppendASCII("page_action.crx")); | 6108 data_dir_.AppendASCII("page_action.crx")); |
6032 provider->UpdateOrAddExtension(good_crx, "1.0.0.0", | 6109 provider->UpdateOrAddExtension(good_crx, "1.0.0.0", |
6033 data_dir_.AppendASCII("good.crx")); | 6110 data_dir_.AppendASCII("good.crx")); |
6034 provider->UpdateOrAddExtension(theme_crx, "2.0", | 6111 provider->UpdateOrAddExtension(theme_crx, "2.0", |
6035 data_dir_.AppendASCII("theme.crx")); | 6112 data_dir_.AppendASCII("theme.crx")); |
6036 | 6113 |
6037 service_->CheckForExternalUpdates(); | 6114 service_->CheckForExternalUpdates(); |
6038 loop_.RunUntilIdle(); | 6115 int count = 3; |
| 6116 content::WindowedNotificationObserver( |
| 6117 chrome::NOTIFICATION_CRX_INSTALLER_DONE, |
| 6118 base::Bind(&WaitForCountNotificationsCallback, &count)).Wait(); |
6039 EXPECT_TRUE(extensions::HasExternalInstallError(service_)); | 6119 EXPECT_TRUE(extensions::HasExternalInstallError(service_)); |
6040 EXPECT_FALSE(service_->IsExtensionEnabled(page_action)); | 6120 EXPECT_FALSE(service_->IsExtensionEnabled(page_action)); |
6041 EXPECT_FALSE(service_->IsExtensionEnabled(good_crx)); | 6121 EXPECT_FALSE(service_->IsExtensionEnabled(good_crx)); |
6042 EXPECT_FALSE(service_->IsExtensionEnabled(theme_crx)); | 6122 EXPECT_FALSE(service_->IsExtensionEnabled(theme_crx)); |
6043 | 6123 |
6044 service_->EnableExtension(page_action); | 6124 service_->EnableExtension(page_action); |
6045 EXPECT_TRUE(extensions::HasExternalInstallError(service_)); | 6125 EXPECT_TRUE(extensions::HasExternalInstallError(service_)); |
6046 EXPECT_FALSE(extensions::HasExternalInstallBubble(service_)); | 6126 EXPECT_FALSE(extensions::HasExternalInstallBubble(service_)); |
6047 service_->EnableExtension(theme_crx); | 6127 service_->EnableExtension(theme_crx); |
6048 EXPECT_TRUE(extensions::HasExternalInstallError(service_)); | 6128 EXPECT_TRUE(extensions::HasExternalInstallError(service_)); |
(...skipping 17 matching lines...) Expand all Loading... |
6066 PackCRX(data_dir_.AppendASCII("update_from_webstore"), | 6146 PackCRX(data_dir_.AppendASCII("update_from_webstore"), |
6067 data_dir_.AppendASCII("update_from_webstore.pem"), | 6147 data_dir_.AppendASCII("update_from_webstore.pem"), |
6068 crx_path); | 6148 crx_path); |
6069 | 6149 |
6070 MockExtensionProvider* provider = | 6150 MockExtensionProvider* provider = |
6071 new MockExtensionProvider(service_, Manifest::EXTERNAL_PREF); | 6151 new MockExtensionProvider(service_, Manifest::EXTERNAL_PREF); |
6072 AddMockExternalProvider(provider); | 6152 AddMockExternalProvider(provider); |
6073 provider->UpdateOrAddExtension(updates_from_webstore, "1", crx_path); | 6153 provider->UpdateOrAddExtension(updates_from_webstore, "1", crx_path); |
6074 | 6154 |
6075 service_->CheckForExternalUpdates(); | 6155 service_->CheckForExternalUpdates(); |
6076 loop_.RunUntilIdle(); | 6156 content::WindowedNotificationObserver( |
| 6157 chrome::NOTIFICATION_CRX_INSTALLER_DONE, |
| 6158 content::NotificationService::AllSources()).Wait(); |
6077 EXPECT_TRUE(extensions::HasExternalInstallError(service_)); | 6159 EXPECT_TRUE(extensions::HasExternalInstallError(service_)); |
6078 EXPECT_TRUE(extensions::HasExternalInstallBubble(service_)); | 6160 EXPECT_TRUE(extensions::HasExternalInstallBubble(service_)); |
6079 EXPECT_FALSE(service_->IsExtensionEnabled(updates_from_webstore)); | 6161 EXPECT_FALSE(service_->IsExtensionEnabled(updates_from_webstore)); |
6080 } | 6162 } |
6081 | 6163 |
6082 // Test that there is no bubble for external extensions if the profile is new. | 6164 // Test that there is no bubble for external extensions if the profile is new. |
6083 TEST_F(ExtensionServiceTest, ExternalInstallUpdatesFromWebstoreNewProfile) { | 6165 TEST_F(ExtensionServiceTest, ExternalInstallUpdatesFromWebstoreNewProfile) { |
6084 FeatureSwitch::ScopedOverride prompt( | 6166 FeatureSwitch::ScopedOverride prompt( |
6085 FeatureSwitch::prompt_for_external_extensions(), true); | 6167 FeatureSwitch::prompt_for_external_extensions(), true); |
6086 | 6168 |
6087 InitializeEmptyExtensionService(); | 6169 InitializeEmptyExtensionService(); |
6088 | 6170 |
6089 base::FilePath crx_path = temp_dir_.path().AppendASCII("webstore.crx"); | 6171 base::FilePath crx_path = temp_dir_.path().AppendASCII("webstore.crx"); |
6090 PackCRX(data_dir_.AppendASCII("update_from_webstore"), | 6172 PackCRX(data_dir_.AppendASCII("update_from_webstore"), |
6091 data_dir_.AppendASCII("update_from_webstore.pem"), | 6173 data_dir_.AppendASCII("update_from_webstore.pem"), |
6092 crx_path); | 6174 crx_path); |
6093 | 6175 |
6094 MockExtensionProvider* provider = | 6176 MockExtensionProvider* provider = |
6095 new MockExtensionProvider(service_, Manifest::EXTERNAL_PREF); | 6177 new MockExtensionProvider(service_, Manifest::EXTERNAL_PREF); |
6096 AddMockExternalProvider(provider); | 6178 AddMockExternalProvider(provider); |
6097 provider->UpdateOrAddExtension(updates_from_webstore, "1", crx_path); | 6179 provider->UpdateOrAddExtension(updates_from_webstore, "1", crx_path); |
6098 | 6180 |
6099 service_->CheckForExternalUpdates(); | 6181 service_->CheckForExternalUpdates(); |
6100 loop_.RunUntilIdle(); | 6182 content::WindowedNotificationObserver( |
| 6183 chrome::NOTIFICATION_CRX_INSTALLER_DONE, |
| 6184 content::NotificationService::AllSources()).Wait(); |
6101 EXPECT_TRUE(extensions::HasExternalInstallError(service_)); | 6185 EXPECT_TRUE(extensions::HasExternalInstallError(service_)); |
6102 EXPECT_FALSE(extensions::HasExternalInstallBubble(service_)); | 6186 EXPECT_FALSE(extensions::HasExternalInstallBubble(service_)); |
6103 EXPECT_FALSE(service_->IsExtensionEnabled(updates_from_webstore)); | 6187 EXPECT_FALSE(service_->IsExtensionEnabled(updates_from_webstore)); |
6104 } | 6188 } |
OLD | NEW |