| // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "base/memory/scoped_ptr.h" |
| #include "base/message_loop/message_loop.h" |
| #include "base/prefs/pref_service.h" |
| #include "chrome/browser/extensions/default_apps.h" |
| #include "chrome/browser/extensions/external_pref_loader.h" |
| #include "chrome/common/chrome_paths.h" |
| #include "chrome/common/pref_names.h" |
| #include "chrome/test/base/testing_profile.h" |
| #include "content/public/test/test_browser_thread.h" |
| #include "extensions/common/extension.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| using default_apps::Provider; |
| |
| namespace extensions { |
| |
| class MockExternalLoader : public ExternalLoader { |
| public: |
| MockExternalLoader() {} |
| |
| void StartLoading() override {} |
| |
| private: |
| ~MockExternalLoader() override {} |
| }; |
| |
| class DefaultAppsTest : public testing::Test { |
| public: |
| DefaultAppsTest() : ui_thread_(content::BrowserThread::UI, &loop_) {} |
| ~DefaultAppsTest() override {} |
| |
| private: |
| base::MessageLoopForIO loop_; |
| content::TestBrowserThread ui_thread_; |
| }; |
| |
| #if !defined(OS_CHROMEOS) |
| // Chrome OS has different way of installing default apps. |
| // Android does not currently support installing apps via Chrome. |
| TEST_F(DefaultAppsTest, Install) { |
| scoped_ptr<TestingProfile> profile(new TestingProfile()); |
| ExternalLoader* loader = new MockExternalLoader(); |
| |
| Provider provider(profile.get(), NULL, loader, Manifest::INTERNAL, |
| Manifest::INTERNAL, Extension::NO_FLAGS); |
| |
| // The default apps should be installed if kDefaultAppsInstallState |
| // is unknown. |
| EXPECT_TRUE(provider.ShouldInstallInProfile()); |
| int state = profile->GetPrefs()->GetInteger(prefs::kDefaultAppsInstallState); |
| EXPECT_TRUE(state == default_apps::kAlreadyInstalledDefaultApps); |
| |
| // The default apps should only be installed once. |
| EXPECT_FALSE(provider.ShouldInstallInProfile()); |
| state = profile->GetPrefs()->GetInteger(prefs::kDefaultAppsInstallState); |
| EXPECT_TRUE(state == default_apps::kAlreadyInstalledDefaultApps); |
| |
| // The default apps should not be installed if the state is |
| // kNeverProvideDefaultApps |
| profile->GetPrefs()->SetInteger(prefs::kDefaultAppsInstallState, |
| default_apps::kNeverInstallDefaultApps); |
| EXPECT_FALSE(provider.ShouldInstallInProfile()); |
| state = profile->GetPrefs()->GetInteger(prefs::kDefaultAppsInstallState); |
| EXPECT_TRUE(state == default_apps::kNeverInstallDefaultApps); |
| |
| // The old default apps with kAlwaysInstallDefaultAppss should be migrated. |
| profile->GetPrefs()->SetInteger(prefs::kDefaultAppsInstallState, |
| default_apps::kProvideLegacyDefaultApps); |
| EXPECT_TRUE(provider.ShouldInstallInProfile()); |
| state = profile->GetPrefs()->GetInteger(prefs::kDefaultAppsInstallState); |
| EXPECT_TRUE(state == default_apps::kAlreadyInstalledDefaultApps); |
| |
| class DefaultTestingProfile : public TestingProfile { |
| bool WasCreatedByVersionOrLater(const std::string& version) override { |
| return false; |
| } |
| }; |
| profile.reset(new DefaultTestingProfile); |
| Provider provider2(profile.get(), NULL, loader, Manifest::INTERNAL, |
| Manifest::INTERNAL, Extension::NO_FLAGS); |
| // The old default apps with kProvideLegacyDefaultApps should be migrated |
| // even if the profile version is older than Chrome version. |
| profile->GetPrefs()->SetInteger(prefs::kDefaultAppsInstallState, |
| default_apps::kProvideLegacyDefaultApps); |
| EXPECT_TRUE(provider2.ShouldInstallInProfile()); |
| state = profile->GetPrefs()->GetInteger(prefs::kDefaultAppsInstallState); |
| EXPECT_TRUE(state == default_apps::kAlreadyInstalledDefaultApps); |
| } |
| #endif |
| |
| } // namespace extensions |