Home | History | Annotate | Download | only in app_list
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/browser/ui/app_list/app_list_service_impl.h"
      6 
      7 #include "base/prefs/pref_service.h"
      8 #include "chrome/browser/browser_process.h"
      9 #include "chrome/browser/profiles/profile_manager.h"
     10 #include "chrome/browser/ui/app_list/app_list_view_delegate.h"
     11 #include "chrome/browser/ui/app_list/test/chrome_app_list_test_support.h"
     12 #include "chrome/browser/ui/browser.h"
     13 #include "chrome/common/pref_names.h"
     14 #include "chrome/test/base/in_process_browser_test.h"
     15 
     16 namespace test {
     17 
     18 // Test API to access private members of AppListServiceImpl.
     19 class AppListServiceImplTestApi {
     20  public:
     21   explicit AppListServiceImplTestApi(AppListServiceImpl* impl) : impl_(impl) {}
     22 
     23   ProfileLoader* profile_loader() { return impl_->profile_loader_.get(); }
     24   AppListViewDelegate* view_delegate() { return impl_->view_delegate_.get(); }
     25 
     26  private:
     27   AppListServiceImpl* impl_;
     28 
     29   DISALLOW_COPY_AND_ASSIGN(AppListServiceImplTestApi);
     30 };
     31 
     32 }  // namespace test
     33 
     34 // Browser Test for AppListServiceImpl that runs on all platforms supporting
     35 // app_list.
     36 class AppListServiceImplBrowserTest : public InProcessBrowserTest {
     37  public:
     38   AppListServiceImplBrowserTest() {}
     39 
     40   // Overridden from InProcessBrowserTest:
     41   virtual void SetUpOnMainThread() OVERRIDE {
     42     service_ = test::GetAppListServiceImpl();
     43     test_api_.reset(new test::AppListServiceImplTestApi(service_));
     44   }
     45 
     46  protected:
     47   AppListServiceImpl* service_;
     48   scoped_ptr<test::AppListServiceImplTestApi> test_api_;
     49 
     50  private:
     51   DISALLOW_COPY_AND_ASSIGN(AppListServiceImplBrowserTest);
     52 };
     53 
     54 // Test that showing a loaded profile for the first time is lazy and
     55 // synchronous. Then tests that showing a second loaded profile without
     56 // dismissing correctly switches profiles.
     57 IN_PROC_BROWSER_TEST_F(AppListServiceImplBrowserTest, ShowLoadedProfiles) {
     58   PrefService* local_state = g_browser_process->local_state();
     59   EXPECT_FALSE(local_state->HasPrefPath(prefs::kAppListProfile));
     60 
     61   // When never shown, profile path should match the last used profile.
     62   base::FilePath user_data_dir =
     63       g_browser_process->profile_manager()->user_data_dir();
     64   EXPECT_EQ(service_->GetProfilePath(user_data_dir),
     65             browser()->profile()->GetPath());
     66 
     67   // Just requesting the profile path shouldn't set it.
     68   EXPECT_FALSE(local_state->HasPrefPath(prefs::kAppListProfile));
     69 
     70   // Loading the Profile* should be lazy, except on ChromeOS where it is bound
     71   // to ChromeLauncherController, which always has a profile.
     72 #if defined(OS_CHROMEOS)
     73   EXPECT_TRUE(service_->GetCurrentAppListProfile());
     74 #else
     75   EXPECT_FALSE(service_->GetCurrentAppListProfile());
     76 #endif
     77 
     78   // Showing the app list for an unspecified profile, uses the loaded profile.
     79   service_->Show();
     80 
     81   // Load should be synchronous.
     82   EXPECT_FALSE(test_api_->profile_loader()->IsAnyProfileLoading());
     83   EXPECT_EQ(service_->GetCurrentAppListProfile(), browser()->profile());
     84 
     85 #if defined(OS_CHROMEOS)
     86   // ChromeOS doesn't record the app list profile pref, and doesn't do profile
     87   // switching.
     88   EXPECT_FALSE(local_state->HasPrefPath(prefs::kAppListProfile));
     89 
     90 #else
     91   // Preference should be updated automatically.
     92   EXPECT_TRUE(local_state->HasPrefPath(prefs::kAppListProfile));
     93   EXPECT_EQ(local_state->GetString(prefs::kAppListProfile),
     94             browser()->profile()->GetPath().BaseName().MaybeAsASCII());
     95 
     96   // Show for a second, pre-loaded profile without dismissing. Don't try this on
     97   // ChromeOS because it does not support profile switching the app list.
     98   Profile* profile2 = test::CreateSecondProfileAsync();
     99   service_->ShowForProfile(profile2);
    100 
    101   // Current profile and saved path should update synchronously.
    102   EXPECT_FALSE(test_api_->profile_loader()->IsAnyProfileLoading());
    103   EXPECT_EQ(profile2->GetPath(), service_->GetProfilePath(user_data_dir));
    104   EXPECT_EQ(profile2, service_->GetCurrentAppListProfile());
    105 #endif
    106 }
    107 
    108 // Tests that the AppListViewDelegate is created lazily.
    109 IN_PROC_BROWSER_TEST_F(AppListServiceImplBrowserTest, CreatedLazily) {
    110   EXPECT_FALSE(test_api_->view_delegate());
    111   service_->ShowForProfile(browser()->profile());
    112   EXPECT_TRUE(test_api_->view_delegate());
    113 }
    114 
    115 // Tests that deleting a profile properly clears the app list view delegate, but
    116 // doesn't destroy it. Disabled on ChromeOS, since profiles can't be deleted
    117 // this way (the second profile isn't signed in, so the test fails when creating
    118 // UserCloudPolicyManagerChromeOS).
    119 #if defined(OS_CHROMEOS)
    120 #define MAYBE_DeletingProfileUpdatesViewDelegate \
    121     DISABLED_DeletingProfileUpdatesViewDelegate
    122 #else
    123 #define MAYBE_DeletingProfileUpdatesViewDelegate \
    124     DeletingProfileUpdatesViewDelegate
    125 #endif
    126 IN_PROC_BROWSER_TEST_F(AppListServiceImplBrowserTest,
    127                        MAYBE_DeletingProfileUpdatesViewDelegate) {
    128   Profile* second_profile = test::CreateSecondProfileAsync();
    129   service_->ShowForProfile(second_profile);
    130   AppListViewDelegate* view_delegate = test_api_->view_delegate();
    131 
    132   EXPECT_TRUE(view_delegate);
    133   EXPECT_EQ(view_delegate->profile(), second_profile);
    134 
    135   ProfileManager* profile_manager = g_browser_process->profile_manager();
    136 
    137   // Delete the profile being used by the app list.
    138   profile_manager->ScheduleProfileForDeletion(second_profile->GetPath(),
    139                                               ProfileManager::CreateCallback());
    140 
    141   // View delegate doesn't change when changing profiles.
    142   EXPECT_EQ(view_delegate, test_api_->view_delegate());
    143 
    144   // But the profile gets cleared until shown again.
    145   EXPECT_FALSE(view_delegate->profile());
    146   service_->ShowForProfile(browser()->profile());
    147 
    148   EXPECT_EQ(view_delegate, test_api_->view_delegate());
    149   EXPECT_EQ(view_delegate->profile(), browser()->profile());
    150 }
    151