app_list_service.cc revision f2477e01787aa58f445919b809d89e252beef54f
1// Copyright 2013 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.h" 6 7#include "base/command_line.h" 8#include "base/metrics/histogram.h" 9#include "base/prefs/pref_registry_simple.h" 10#include "base/process/process_info.h" 11#include "base/strings/string_number_conversions.h" 12#include "base/time/time.h" 13#include "chrome/common/chrome_switches.h" 14#include "chrome/common/pref_names.h" 15 16namespace { 17 18enum StartupType { 19 COLD_START, 20 WARM_START, 21 WARM_START_FAST, 22}; 23 24base::Time GetOriginalProcessStartTime(const CommandLine& command_line) { 25 if (command_line.HasSwitch(switches::kOriginalProcessStartTime)) { 26 std::string start_time_string = 27 command_line.GetSwitchValueASCII(switches::kOriginalProcessStartTime); 28 int64 remote_start_time; 29 base::StringToInt64(start_time_string, &remote_start_time); 30 return base::Time::FromInternalValue(remote_start_time); 31 } 32 33// base::CurrentProcessInfo::CreationTime() is only defined on some 34// platforms. 35#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) 36 return base::CurrentProcessInfo::CreationTime(); 37#endif 38 return base::Time(); 39} 40 41StartupType GetStartupType(const CommandLine& command_line) { 42 // The presence of kOriginalProcessStartTime implies that another process 43 // has sent us its command line to handle, ie: we are already running. 44 if (command_line.HasSwitch(switches::kOriginalProcessStartTime)) { 45 return command_line.HasSwitch(switches::kFastStart) ? 46 WARM_START_FAST : WARM_START; 47 } 48 return COLD_START; 49} 50 51// The time the process that caused the app list to be shown started. This isn't 52// necessarily the currently executing process as we may be processing a command 53// line given to a short-lived Chrome instance. 54int64 g_original_process_start_time; 55 56// The type of startup the the current app list show has gone through. 57StartupType g_app_show_startup_type; 58 59void RecordStartupInfo(StartupType startup_type, const base::Time& start_time) { 60 g_original_process_start_time = start_time.ToInternalValue(); 61 g_app_show_startup_type = startup_type; 62} 63 64void RecordFirstPaintTiming() { 65 base::Time start_time( 66 base::Time::FromInternalValue(g_original_process_start_time)); 67 base::TimeDelta elapsed = base::Time::Now() - start_time; 68 switch (g_app_show_startup_type) { 69 case COLD_START: 70 UMA_HISTOGRAM_LONG_TIMES("Startup.AppListFirstPaintColdStart", elapsed); 71 break; 72 case WARM_START: 73 UMA_HISTOGRAM_LONG_TIMES("Startup.AppListFirstPaintWarmStart", elapsed); 74 break; 75 case WARM_START_FAST: 76 UMA_HISTOGRAM_LONG_TIMES("Startup.AppListFirstPaintWarmStartFast", 77 elapsed); 78 break; 79 } 80} 81 82} // namespace 83 84// static 85void AppListService::RegisterPrefs(PrefRegistrySimple* registry) { 86 registry->RegisterInt64Pref(prefs::kLastAppListLaunchPing, 0); 87 registry->RegisterIntegerPref(prefs::kAppListLaunchCount, 0); 88 registry->RegisterInt64Pref(prefs::kLastAppListAppLaunchPing, 0); 89 registry->RegisterIntegerPref(prefs::kAppListAppLaunchCount, 0); 90 registry->RegisterStringPref(prefs::kAppListProfile, std::string()); 91 registry->RegisterBooleanPref(prefs::kRestartWithAppList, false); 92 registry->RegisterBooleanPref(prefs::kAppLauncherIsEnabled, false); 93 registry->RegisterBooleanPref(prefs::kAppLauncherHasBeenEnabled, false); 94 95#if defined(OS_MACOSX) 96 registry->RegisterIntegerPref(prefs::kAppLauncherShortcutVersion, 0); 97#endif 98 99 // Identifies whether we should show the app launcher promo or not. 100 // Note that a field trial also controls the showing, so the promo won't show 101 // unless the pref is set AND the field trial is set to a proper group. 102 registry->RegisterBooleanPref(prefs::kShowAppLauncherPromo, true); 103} 104 105// static 106void AppListService::RecordShowTimings(const CommandLine& command_line) { 107 base::Time start_time = GetOriginalProcessStartTime(command_line); 108 if (start_time.is_null()) 109 return; 110 111 base::TimeDelta elapsed = base::Time::Now() - start_time; 112 StartupType startup = GetStartupType(command_line); 113 switch (startup) { 114 case COLD_START: 115 UMA_HISTOGRAM_LONG_TIMES("Startup.ShowAppListColdStart", elapsed); 116 break; 117 case WARM_START: 118 UMA_HISTOGRAM_LONG_TIMES("Startup.ShowAppListWarmStart", elapsed); 119 break; 120 case WARM_START_FAST: 121 UMA_HISTOGRAM_LONG_TIMES("Startup.ShowAppListWarmStartFast", elapsed); 122 break; 123 } 124 125 RecordStartupInfo(startup, start_time); 126 Get(chrome::HOST_DESKTOP_TYPE_NATIVE)->SetAppListNextPaintCallback( 127 RecordFirstPaintTiming); 128} 129