Index: chrome/browser/ui/views/app_list/app_list_controller_win.cc |
=================================================================== |
--- chrome/browser/ui/views/app_list/app_list_controller_win.cc (revision 199485) |
+++ chrome/browser/ui/views/app_list/app_list_controller_win.cc (working copy) |
@@ -290,10 +290,6 @@ |
bool can_close() { return can_close_app_list_; } |
Profile* profile() const { return profile_; } |
- // Creates the app list view and populates it from |profile|, but doesn't |
- // show it. Does nothing if the view already exists. |
- void InitView(Profile* profile); |
- |
void AppListClosing(); |
void AppListActivationChanged(bool active); |
void ShowAppListDuringModeSwitch(Profile* profile); |
@@ -378,6 +374,16 @@ |
void EnsureHaveKeepAliveForView(); |
void FreeAnyKeepAliveForView(); |
+ // Loads the profile last used with the app list and populates the view from |
+ // it without showing it so that the next show is faster. Does nothing if the |
+ // view already exists, or another profile is in the middle of being loaded to |
+ // be shown. |
+ void InitView(); |
+ bool IsInitViewNeeded(); |
+ void InitViewFromProfile(int profile_load_sequence_id, |
+ Profile* profile, |
+ Profile::CreateStatus status); |
+ |
// Weak pointer. The view manages its own lifetime. |
app_list::AppListView* current_view_; |
@@ -604,7 +610,6 @@ |
DecrementPendingProfileLoads(); |
break; |
} |
- |
} |
void AppListController::IncrementPendingProfileLoads() { |
@@ -661,14 +666,6 @@ |
RecordAppListLaunch(); |
} |
-void AppListController::InitView(Profile* profile) { |
- if (current_view_) |
- return; |
- AppListService::SendAppListStats(); |
- PopulateViewFromProfile(profile); |
- current_view_->Prerender(); |
-} |
- |
void AppListController::ShowAppListDuringModeSwitch(Profile* profile) { |
regain_first_lost_focus_ = true; |
ShowAppList(profile); |
@@ -981,10 +978,49 @@ |
keep_alive_.reset(NULL); |
} |
-void InitView(Profile* profile) { |
+void AppListController::InitView() { |
+ if (!IsInitViewNeeded()) |
+ return; |
+ |
+ base::FilePath user_data_dir( |
+ g_browser_process->profile_manager()->user_data_dir()); |
+ base::FilePath profile_file_path(GetAppListProfilePath(user_data_dir)); |
+ |
+ ProfileManager* profile_manager = g_browser_process->profile_manager(); |
+ Profile* profile = profile_manager->GetProfileByPath(profile_file_path); |
+ |
+ if (!profile) { |
+ profile_manager->CreateProfileAsync( |
+ profile_file_path, |
+ base::Bind(&AppListController::InitViewFromProfile, |
+ weak_factory_.GetWeakPtr(), profile_load_sequence_id_), |
+ string16(), string16(), false); |
+ return; |
+ } |
+ InitViewFromProfile( |
+ profile_load_sequence_id_, profile, Profile::CREATE_STATUS_INITIALIZED); |
+} |
+ |
+bool AppListController::IsInitViewNeeded() { |
if (!g_browser_process || g_browser_process->IsShuttingDown()) |
+ return false; |
+ |
+ // We only need to initialize the view if there's no view already created and |
+ // there's no profile loading to be shown. |
+ return !current_view_ && profile_load_sequence_id_ == 0; |
+} |
+ |
+void AppListController::InitViewFromProfile(int profile_load_sequence_id, |
+ Profile* profile, |
+ Profile::CreateStatus status) { |
+ if (!IsInitViewNeeded()) |
return; |
- AppListController::GetInstance()->InitView(profile); |
+ |
+ if (status != Profile::CREATE_STATUS_INITIALIZED) |
+ return; |
+ |
+ PopulateViewFromProfile(profile); |
+ current_view_->Prerender(); |
} |
void AppListController::Init(Profile* initial_profile) { |
@@ -1009,9 +1045,16 @@ |
const int kInitWindowDelay = 5; |
MessageLoop::current()->PostDelayedTask( |
FROM_HERE, |
- base::Bind(&::InitView, initial_profile), |
+ base::Bind(&AppListController::InitView, weak_factory_.GetWeakPtr()), |
base::TimeDelta::FromSeconds(kInitWindowDelay)); |
+ // Send app list usage stats after a delay. |
+ const int kSendUsageStatsDelay = 5; |
+ MessageLoop::current()->PostDelayedTask( |
+ FROM_HERE, |
+ base::Bind(&AppListService::SendAppListStats), |
+ base::TimeDelta::FromSeconds(kSendUsageStatsDelay)); |
+ |
MigrateAppLauncherEnabledPref(); |
if (CommandLine::ForCurrentProcess()->HasSwitch( |