1558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
2558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// found in the LICENSE file.
4558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
5558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "chrome/browser/ui/webui/ntp/core_app_launcher_handler.h"
6558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
7558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "base/bind.h"
8558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "base/metrics/histogram.h"
9558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "chrome/browser/profiles/profile.h"
10558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "chrome/browser/ui/webui/ntp/app_launcher_handler.h"
11a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/common/pref_names.h"
12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/pref_registry/pref_registry_syncable.h"
13558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/public/browser/web_ui.h"
14a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "extensions/browser/extension_registry.h"
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h"
16a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "extensions/common/extension_set.h"
17558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "net/base/escape.h"
18558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
19558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochnamespace {
20558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochconst net::UnescapeRule::Type kUnescapeRules =
21558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    net::UnescapeRule::NORMAL | net::UnescapeRule::URL_SPECIAL_CHARS;
22558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
23558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
24558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochCoreAppLauncherHandler::CoreAppLauncherHandler() {}
25558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
26558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochCoreAppLauncherHandler::~CoreAppLauncherHandler() {}
27558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
28558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// static
29558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid CoreAppLauncherHandler::RecordAppLaunchType(
30558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    extension_misc::AppLaunchBucket bucket,
31558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    extensions::Manifest::Type app_type) {
32558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  DCHECK_LT(bucket, extension_misc::APP_LAUNCH_BUCKET_BOUNDARY);
33558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (app_type == extensions::Manifest::TYPE_PLATFORM_APP) {
34558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    UMA_HISTOGRAM_ENUMERATION(extension_misc::kPlatformAppLaunchHistogram,
35558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                              bucket,
36558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                              extension_misc::APP_LAUNCH_BUCKET_BOUNDARY);
37558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  } else {
38558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    UMA_HISTOGRAM_ENUMERATION(extension_misc::kAppLaunchHistogram,
39558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                              bucket,
40558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                              extension_misc::APP_LAUNCH_BUCKET_BOUNDARY);
41558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
42558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
43558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
44a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// static
45a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void CoreAppLauncherHandler::RecordAppListSearchLaunch(
46a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    const extensions::Extension* extension) {
47a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  extension_misc::AppLaunchBucket bucket =
48a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      extension_misc::APP_LAUNCH_APP_LIST_SEARCH;
49a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (extension->id() == extension_misc::kWebStoreAppId)
50a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    bucket = extension_misc::APP_LAUNCH_APP_LIST_SEARCH_WEBSTORE;
51a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  else if (extension->id() == extension_misc::kChromeAppId)
52a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    bucket = extension_misc::APP_LAUNCH_APP_LIST_SEARCH_CHROME;
53a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  RecordAppLaunchType(bucket, extension->GetType());
54a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
55a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
56a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// static
57a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void CoreAppLauncherHandler::RecordAppListMainLaunch(
58a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    const extensions::Extension* extension) {
59a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  extension_misc::AppLaunchBucket bucket =
60a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      extension_misc::APP_LAUNCH_APP_LIST_MAIN;
61a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (extension->id() == extension_misc::kWebStoreAppId)
62a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    bucket = extension_misc::APP_LAUNCH_APP_LIST_MAIN_WEBSTORE;
63a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  else if (extension->id() == extension_misc::kChromeAppId)
64a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    bucket = extension_misc::APP_LAUNCH_APP_LIST_MAIN_CHROME;
65a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  RecordAppLaunchType(bucket, extension->GetType());
66a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
67a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
68a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// static
69a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void CoreAppLauncherHandler::RecordWebStoreLaunch() {
70a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  RecordAppLaunchType(extension_misc::APP_LAUNCH_NTP_WEBSTORE,
71a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                      extensions::Manifest::TYPE_HOSTED_APP);
72a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
73a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
74a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// static
75a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void CoreAppLauncherHandler::RegisterProfilePrefs(
76a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    user_prefs::PrefRegistrySyncable* registry) {
77a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  registry->RegisterListPref(prefs::kNtpAppPageNames,
78a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                             user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
79a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
80a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
81558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid CoreAppLauncherHandler::HandleRecordAppLaunchByUrl(
82558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    const base::ListValue* args) {
83558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  std::string url;
84558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  CHECK(args->GetString(0, &url));
85558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  double source;
86558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  CHECK(args->GetDouble(1, &source));
87558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
88558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  extension_misc::AppLaunchBucket bucket =
89558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      static_cast<extension_misc::AppLaunchBucket>(static_cast<int>(source));
90558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  CHECK(source < extension_misc::APP_LAUNCH_BUCKET_BOUNDARY);
91558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
92558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  RecordAppLaunchByUrl(Profile::FromWebUI(web_ui()), url, bucket);
93558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
94558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
95558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid CoreAppLauncherHandler::RecordAppLaunchByUrl(
96558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    Profile* profile,
97558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    std::string escaped_url,
98558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    extension_misc::AppLaunchBucket bucket) {
99558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  CHECK(bucket != extension_misc::APP_LAUNCH_BUCKET_INVALID);
100558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
101558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  GURL url(net::UnescapeURLComponent(escaped_url, kUnescapeRules));
102a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (!extensions::ExtensionRegistry::Get(profile)
103a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch          ->enabled_extensions().GetAppByURL(url)) {
104558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return;
105a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
106558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
107558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  RecordAppLaunchType(bucket, extensions::Manifest::TYPE_HOSTED_APP);
108558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
109558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
110558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid CoreAppLauncherHandler::RegisterMessages() {
111558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  web_ui()->RegisterMessageCallback("recordAppLaunchByURL",
112558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      base::Bind(&CoreAppLauncherHandler::HandleRecordAppLaunchByUrl,
113558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                 base::Unretained(this)));
114558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
115