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