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.
5 #include "chrome/browser/ui/app_list/app_list_service.h"
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"
24 base::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);
33 // base::CurrentProcessInfo::CreationTime() is only defined on some
35 #if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
36 return base::CurrentProcessInfo::CreationTime();
42 StartupType GetStartupType(const CommandLine& command_line) {
43 // The presence of kOriginalProcessStartTime implies that another process
44 // has sent us its command line to handle, ie: we are already running.
45 if (command_line.HasSwitch(switches::kOriginalProcessStartTime)) {
46 return command_line.HasSwitch(switches::kFastStart) ?
47 WARM_START_FAST : WARM_START;
52 // The time the process that caused the app list to be shown started. This isn't
53 // necessarily the currently executing process as we may be processing a command
54 // line given to a short-lived Chrome instance.
55 int64 g_original_process_start_time;
57 // The type of startup the the current app list show has gone through.
58 StartupType g_app_show_startup_type;
60 void RecordStartupInfo(StartupType startup_type, const base::Time& start_time) {
61 g_original_process_start_time = start_time.ToInternalValue();
62 g_app_show_startup_type = startup_type;
65 void RecordFirstPaintTiming() {
66 base::Time start_time(
67 base::Time::FromInternalValue(g_original_process_start_time));
68 base::TimeDelta elapsed = base::Time::Now() - start_time;
69 switch (g_app_show_startup_type) {
71 UMA_HISTOGRAM_LONG_TIMES("Startup.AppListFirstPaintColdStart", elapsed);
74 UMA_HISTOGRAM_LONG_TIMES("Startup.AppListFirstPaintWarmStart", elapsed);
77 UMA_HISTOGRAM_LONG_TIMES("Startup.AppListFirstPaintWarmStartFast",
86 void AppListService::RegisterPrefs(PrefRegistrySimple* registry) {
87 registry->RegisterInt64Pref(prefs::kLastAppListLaunchPing, 0);
88 registry->RegisterIntegerPref(prefs::kAppListLaunchCount, 0);
89 registry->RegisterInt64Pref(prefs::kLastAppListAppLaunchPing, 0);
90 registry->RegisterIntegerPref(prefs::kAppListAppLaunchCount, 0);
91 registry->RegisterStringPref(prefs::kAppListProfile, std::string());
92 registry->RegisterBooleanPref(prefs::kAppLauncherIsEnabled, false);
93 registry->RegisterBooleanPref(prefs::kAppLauncherHasBeenEnabled, false);
94 registry->RegisterIntegerPref(prefs::kAppListEnableMethod,
96 registry->RegisterInt64Pref(prefs::kAppListEnableTime, 0);
98 #if defined(OS_MACOSX)
99 registry->RegisterIntegerPref(prefs::kAppLauncherShortcutVersion, 0);
102 // Identifies whether we should show the app launcher promo or not.
103 // Note that a field trial also controls the showing, so the promo won't show
104 // unless the pref is set AND the field trial is set to a proper group.
105 registry->RegisterBooleanPref(prefs::kShowAppLauncherPromo, true);
109 void AppListService::RecordShowTimings(const CommandLine& command_line) {
110 base::Time start_time = GetOriginalProcessStartTime(command_line);
111 if (start_time.is_null())
114 base::TimeDelta elapsed = base::Time::Now() - start_time;
115 StartupType startup = GetStartupType(command_line);
118 UMA_HISTOGRAM_LONG_TIMES("Startup.ShowAppListColdStart", elapsed);
121 UMA_HISTOGRAM_LONG_TIMES("Startup.ShowAppListWarmStart", elapsed);
123 case WARM_START_FAST:
124 UMA_HISTOGRAM_LONG_TIMES("Startup.ShowAppListWarmStartFast", elapsed);
128 RecordStartupInfo(startup, start_time);
129 Get(chrome::HOST_DESKTOP_TYPE_NATIVE)->SetAppListNextPaintCallback(
130 RecordFirstPaintTiming);