11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved. 21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be 31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file. 41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/ui/app_list/app_list_service_impl.h" 61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/prefs/pref_service.h" 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/browser_process.h" 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/profiles/profile_manager.h" 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/ui/app_list/app_list_view_delegate.h" 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/ui/app_list/test/chrome_app_list_test_support.h" 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/ui/browser.h" 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/common/pref_names.h" 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/test/base/in_process_browser_test.h" 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace test { 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Test API to access private members of AppListServiceImpl. 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass AppListServiceImplTestApi { 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci explicit AppListServiceImplTestApi(AppListServiceImpl* impl) : impl_(impl) {} 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ProfileLoader* profile_loader() { return impl_->profile_loader_.get(); } 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci AppListViewDelegate* view_delegate() { return impl_->view_delegate_.get(); } 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private: 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci AppListServiceImpl* impl_; 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DISALLOW_COPY_AND_ASSIGN(AppListServiceImplTestApi); 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} // namespace test 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Browser Test for AppListServiceImpl that runs on all platforms supporting 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// app_list. 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass AppListServiceImplBrowserTest : public InProcessBrowserTest { 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci AppListServiceImplBrowserTest() {} 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Overridden from InProcessBrowserTest: 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void SetUpOnMainThread() OVERRIDE { 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci service_ = test::GetAppListServiceImpl(); 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci test_api_.reset(new test::AppListServiceImplTestApi(service_)); 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci protected: 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci AppListServiceImpl* service_; 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<test::AppListServiceImplTestApi> test_api_; 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private: 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DISALLOW_COPY_AND_ASSIGN(AppListServiceImplBrowserTest); 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Test that showing a loaded profile for the first time is lazy and 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// synchronous. Then tests that showing a second loaded profile without 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// dismissing correctly switches profiles. 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciIN_PROC_BROWSER_TEST_F(AppListServiceImplBrowserTest, ShowLoadedProfiles) { 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PrefService* local_state = g_browser_process->local_state(); 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(local_state->HasPrefPath(prefs::kAppListProfile)); 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // When never shown, profile path should match the last used profile. 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::FilePath user_data_dir = 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci g_browser_process->profile_manager()->user_data_dir(); 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(service_->GetProfilePath(user_data_dir), 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci browser()->profile()->GetPath()); 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Just requesting the profile path shouldn't set it. 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(local_state->HasPrefPath(prefs::kAppListProfile)); 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Loading the Profile* should be lazy, except on ChromeOS where it is bound 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // to ChromeLauncherController, which always has a profile. 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_CHROMEOS) 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(service_->GetCurrentAppListProfile()); 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#else 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(service_->GetCurrentAppListProfile()); 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Showing the app list for an unspecified profile, uses the loaded profile. 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci service_->Show(); 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Load should be synchronous. 821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(test_api_->profile_loader()->IsAnyProfileLoading()); 831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(service_->GetCurrentAppListProfile(), browser()->profile()); 841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_CHROMEOS) 861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // ChromeOS doesn't record the app list profile pref, and doesn't do profile 871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // switching. 881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(local_state->HasPrefPath(prefs::kAppListProfile)); 891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#else 911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Preference should be updated automatically. 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(local_state->HasPrefPath(prefs::kAppListProfile)); 931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(local_state->GetString(prefs::kAppListProfile), 941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci browser()->profile()->GetPath().BaseName().MaybeAsASCII()); 951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Show for a second, pre-loaded profile without dismissing. Don't try this on 971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // ChromeOS because it does not support profile switching the app list. 981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Profile* profile2 = test::CreateSecondProfileAsync(); 991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci service_->ShowForProfile(profile2); 1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Current profile and saved path should update synchronously. 1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(test_api_->profile_loader()->IsAnyProfileLoading()); 1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(profile2->GetPath(), service_->GetProfilePath(user_data_dir)); 1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(profile2, service_->GetCurrentAppListProfile()); 1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Tests that the AppListViewDelegate is created lazily. 1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciIN_PROC_BROWSER_TEST_F(AppListServiceImplBrowserTest, CreatedLazily) { 1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(test_api_->view_delegate()); 1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci service_->ShowForProfile(browser()->profile()); 1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(test_api_->view_delegate()); 1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Tests that deleting a profile properly clears the app list view delegate, but 1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// doesn't destroy it. Disabled on ChromeOS, since profiles can't be deleted 1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// this way (the second profile isn't signed in, so the test fails when creating 1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// UserCloudPolicyManagerChromeOS). 1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_CHROMEOS) 1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define MAYBE_DeletingProfileUpdatesViewDelegate \ 1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DISABLED_DeletingProfileUpdatesViewDelegate 1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#else 1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define MAYBE_DeletingProfileUpdatesViewDelegate \ 1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DeletingProfileUpdatesViewDelegate 1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciIN_PROC_BROWSER_TEST_F(AppListServiceImplBrowserTest, 1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci MAYBE_DeletingProfileUpdatesViewDelegate) { 1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Profile* second_profile = test::CreateSecondProfileAsync(); 1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci service_->ShowForProfile(second_profile); 1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci AppListViewDelegate* view_delegate = test_api_->view_delegate(); 1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(view_delegate); 1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(view_delegate->profile(), second_profile); 1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ProfileManager* profile_manager = g_browser_process->profile_manager(); 1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Delete the profile being used by the app list. 1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci profile_manager->ScheduleProfileForDeletion(second_profile->GetPath(), 1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ProfileManager::CreateCallback()); 1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // View delegate doesn't change when changing profiles. 1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(view_delegate, test_api_->view_delegate()); 1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // But the profile gets cleared until shown again. 1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(view_delegate->profile()); 1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci service_->ShowForProfile(browser()->profile()); 1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(view_delegate, test_api_->view_delegate()); 1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(view_delegate->profile(), browser()->profile()); 1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 151