Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / ui / app_list / app_list_service.cc
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
16 namespace {
17
18 enum StartupType {
19   COLD_START,
20   WARM_START,
21   WARM_START_FAST,
22 };
23
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);
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 #else
38   return base::Time();
39 #endif
40 }
41
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;
48   }
49   return COLD_START;
50 }
51
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;
56
57 // The type of startup the the current app list show has gone through.
58 StartupType g_app_show_startup_type;
59
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;
63 }
64
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) {
70     case COLD_START:
71       UMA_HISTOGRAM_LONG_TIMES("Startup.AppListFirstPaintColdStart", elapsed);
72       break;
73     case WARM_START:
74       UMA_HISTOGRAM_LONG_TIMES("Startup.AppListFirstPaintWarmStart", elapsed);
75       break;
76     case WARM_START_FAST:
77       UMA_HISTOGRAM_LONG_TIMES("Startup.AppListFirstPaintWarmStartFast",
78                                elapsed);
79       break;
80   }
81 }
82
83 }  // namespace
84
85 // static
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,
95                                 ENABLE_NOT_RECORDED);
96   registry->RegisterInt64Pref(prefs::kAppListEnableTime, 0);
97
98 #if defined(OS_MACOSX)
99   registry->RegisterIntegerPref(prefs::kAppLauncherShortcutVersion, 0);
100 #endif
101
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);
106 }
107
108 // static
109 void AppListService::RecordShowTimings(const CommandLine& command_line) {
110   base::Time start_time = GetOriginalProcessStartTime(command_line);
111   if (start_time.is_null())
112     return;
113
114   base::TimeDelta elapsed = base::Time::Now() - start_time;
115   StartupType startup = GetStartupType(command_line);
116   switch (startup) {
117     case COLD_START:
118       UMA_HISTOGRAM_LONG_TIMES("Startup.ShowAppListColdStart", elapsed);
119       break;
120     case WARM_START:
121       UMA_HISTOGRAM_LONG_TIMES("Startup.ShowAppListWarmStart", elapsed);
122       break;
123     case WARM_START_FAST:
124       UMA_HISTOGRAM_LONG_TIMES("Startup.ShowAppListWarmStartFast", elapsed);
125       break;
126   }
127
128   RecordStartupInfo(startup, start_time);
129   Get(chrome::HOST_DESKTOP_TYPE_NATIVE)->SetAppListNextPaintCallback(
130       RecordFirstPaintTiming);
131 }