app_list_service.cc revision 23730a6e56a168d1879203e4b3819bb36e3d8f1f
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/app_list/app_list_service.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/command_line.h" 890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/metrics/histogram.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_registry_simple.h" 10bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "base/process/process_info.h" 1190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/strings/string_number_conversions.h" 12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 1390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/common/chrome_switches.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/pref_names.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace { 1790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)enum StartupType { 193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) COLD_START, 203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) WARM_START, 213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) WARM_START_FAST, 223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}; 233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)base::Time GetOriginalProcessStartTime(const CommandLine& command_line) { 253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (command_line.HasSwitch(switches::kOriginalProcessStartTime)) { 263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::string start_time_string = 273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) command_line.GetSwitchValueASCII(switches::kOriginalProcessStartTime); 283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int64 remote_start_time; 293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::StringToInt64(start_time_string, &remote_start_time); 303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return base::Time::FromInternalValue(remote_start_time); 313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// base::CurrentProcessInfo::CreationTime() is only defined on some 343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// platforms. 353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) 363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return base::CurrentProcessInfo::CreationTime(); 3723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#else 383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return base::Time(); 3923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#endif 403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)StartupType GetStartupType(const CommandLine& command_line) { 433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // The presence of kOriginalProcessStartTime implies that another process 443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // has sent us its command line to handle, ie: we are already running. 453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (command_line.HasSwitch(switches::kOriginalProcessStartTime)) { 463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return command_line.HasSwitch(switches::kFastStart) ? 473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) WARM_START_FAST : WARM_START; 483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return COLD_START; 503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// The time the process that caused the app list to be shown started. This isn't 53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// necessarily the currently executing process as we may be processing a command 54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// line given to a short-lived Chrome instance. 55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)int64 g_original_process_start_time; 56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// The type of startup the the current app list show has gone through. 58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)StartupType g_app_show_startup_type; 59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RecordStartupInfo(StartupType startup_type, const base::Time& start_time) { 61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) g_original_process_start_time = start_time.ToInternalValue(); 62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) g_app_show_startup_type = startup_type; 63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RecordFirstPaintTiming() { 66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::Time start_time( 67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::Time::FromInternalValue(g_original_process_start_time)); 683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::TimeDelta elapsed = base::Time::Now() - start_time; 69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) switch (g_app_show_startup_type) { 703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) case COLD_START: 713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) UMA_HISTOGRAM_LONG_TIMES("Startup.AppListFirstPaintColdStart", elapsed); 723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) break; 733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) case WARM_START: 743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) UMA_HISTOGRAM_LONG_TIMES("Startup.AppListFirstPaintWarmStart", elapsed); 753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) break; 763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) case WARM_START_FAST: 773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) UMA_HISTOGRAM_LONG_TIMES("Startup.AppListFirstPaintWarmStartFast", 783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) elapsed); 793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) break; 803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 8190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 8290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} // namespace 8490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AppListService::RegisterPrefs(PrefRegistrySimple* registry) { 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) registry->RegisterInt64Pref(prefs::kLastAppListLaunchPing, 0); 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) registry->RegisterIntegerPref(prefs::kAppListLaunchCount, 0); 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) registry->RegisterInt64Pref(prefs::kLastAppListAppLaunchPing, 0); 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) registry->RegisterIntegerPref(prefs::kAppListAppLaunchCount, 0); 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) registry->RegisterStringPref(prefs::kAppListProfile, std::string()); 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry->RegisterBooleanPref(prefs::kRestartWithAppList, false); 934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) registry->RegisterBooleanPref(prefs::kAppLauncherIsEnabled, false); 944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) registry->RegisterBooleanPref(prefs::kAppLauncherHasBeenEnabled, false); 955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) registry->RegisterIntegerPref(prefs::kAppListEnableMethod, 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ENABLE_NOT_RECORDED); 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) registry->RegisterInt64Pref(prefs::kAppListEnableTime, 0); 984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_MACOSX) 1004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) registry->RegisterIntegerPref(prefs::kAppLauncherShortcutVersion, 0); 1014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif 1024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Identifies whether we should show the app launcher promo or not. 1044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Note that a field trial also controls the showing, so the promo won't show 1054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // unless the pref is set AND the field trial is set to a proper group. 1064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) registry->RegisterBooleanPref(prefs::kShowAppLauncherPromo, true); 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 10990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// static 11090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void AppListService::RecordShowTimings(const CommandLine& command_line) { 1113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::Time start_time = GetOriginalProcessStartTime(command_line); 1123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (start_time.is_null()) 1133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return; 1143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::TimeDelta elapsed = base::Time::Now() - start_time; 1163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) StartupType startup = GetStartupType(command_line); 1173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) switch (startup) { 1183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) case COLD_START: 1193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) UMA_HISTOGRAM_LONG_TIMES("Startup.ShowAppListColdStart", elapsed); 1203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) break; 1213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) case WARM_START: 122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UMA_HISTOGRAM_LONG_TIMES("Startup.ShowAppListWarmStart", elapsed); 1233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) break; 1243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) case WARM_START_FAST: 1253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) UMA_HISTOGRAM_LONG_TIMES("Startup.ShowAppListWarmStartFast", elapsed); 1263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) break; 12790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 1283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) RecordStartupInfo(startup, start_time); 1301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) Get(chrome::HOST_DESKTOP_TYPE_NATIVE)->SetAppListNextPaintCallback( 131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) RecordFirstPaintTiming); 13290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 133