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