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"
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/common/constants.h"
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h"
17a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "extensions/common/extension_set.h"
18558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "net/base/escape.h"
19558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
20558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochnamespace {
21558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochconst net::UnescapeRule::Type kUnescapeRules =
22558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    net::UnescapeRule::NORMAL | net::UnescapeRule::URL_SPECIAL_CHARS;
23558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
24558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
25558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochCoreAppLauncherHandler::CoreAppLauncherHandler() {}
26558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
27558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochCoreAppLauncherHandler::~CoreAppLauncherHandler() {}
28558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
29558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// static
30558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid CoreAppLauncherHandler::RecordAppLaunchType(
31558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    extension_misc::AppLaunchBucket bucket,
32558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    extensions::Manifest::Type app_type) {
33558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  DCHECK_LT(bucket, extension_misc::APP_LAUNCH_BUCKET_BOUNDARY);
34558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (app_type == extensions::Manifest::TYPE_PLATFORM_APP) {
35558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    UMA_HISTOGRAM_ENUMERATION(extension_misc::kPlatformAppLaunchHistogram,
36558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                              bucket,
37558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                              extension_misc::APP_LAUNCH_BUCKET_BOUNDARY);
38558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  } else {
39558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    UMA_HISTOGRAM_ENUMERATION(extension_misc::kAppLaunchHistogram,
40558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                              bucket,
41558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                              extension_misc::APP_LAUNCH_BUCKET_BOUNDARY);
42558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
43558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
44558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
45a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// static
46a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void CoreAppLauncherHandler::RecordAppListSearchLaunch(
47a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    const extensions::Extension* extension) {
48a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  extension_misc::AppLaunchBucket bucket =
49a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      extension_misc::APP_LAUNCH_APP_LIST_SEARCH;
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (extension->id() == extensions::kWebStoreAppId)
51a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    bucket = extension_misc::APP_LAUNCH_APP_LIST_SEARCH_WEBSTORE;
52a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  else if (extension->id() == extension_misc::kChromeAppId)
53a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    bucket = extension_misc::APP_LAUNCH_APP_LIST_SEARCH_CHROME;
54a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  RecordAppLaunchType(bucket, extension->GetType());
55a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
56a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
57a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// static
58a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void CoreAppLauncherHandler::RecordAppListMainLaunch(
59a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    const extensions::Extension* extension) {
60a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  extension_misc::AppLaunchBucket bucket =
61a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      extension_misc::APP_LAUNCH_APP_LIST_MAIN;
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (extension->id() == extensions::kWebStoreAppId)
63a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    bucket = extension_misc::APP_LAUNCH_APP_LIST_MAIN_WEBSTORE;
64a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  else if (extension->id() == extension_misc::kChromeAppId)
65a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    bucket = extension_misc::APP_LAUNCH_APP_LIST_MAIN_CHROME;
66a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  RecordAppLaunchType(bucket, extension->GetType());
67a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
68a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
69a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// static
70a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void CoreAppLauncherHandler::RecordWebStoreLaunch() {
71a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  RecordAppLaunchType(extension_misc::APP_LAUNCH_NTP_WEBSTORE,
72a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                      extensions::Manifest::TYPE_HOSTED_APP);
73a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
74a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
75a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// static
76a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void CoreAppLauncherHandler::RegisterProfilePrefs(
77a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    user_prefs::PrefRegistrySyncable* registry) {
78a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  registry->RegisterListPref(prefs::kNtpAppPageNames,
79a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                             user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
80a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
81a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
82558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid CoreAppLauncherHandler::HandleRecordAppLaunchByUrl(
83558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    const base::ListValue* args) {
84558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  std::string url;
85558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  CHECK(args->GetString(0, &url));
86558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  double source;
87558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  CHECK(args->GetDouble(1, &source));
88558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
89558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  extension_misc::AppLaunchBucket bucket =
90558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      static_cast<extension_misc::AppLaunchBucket>(static_cast<int>(source));
91558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  CHECK(source < extension_misc::APP_LAUNCH_BUCKET_BOUNDARY);
92558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
93558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  RecordAppLaunchByUrl(Profile::FromWebUI(web_ui()), url, bucket);
94558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
95558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
96558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid CoreAppLauncherHandler::RecordAppLaunchByUrl(
97558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    Profile* profile,
98558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    std::string escaped_url,
99558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    extension_misc::AppLaunchBucket bucket) {
100558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  CHECK(bucket != extension_misc::APP_LAUNCH_BUCKET_INVALID);
101558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
102558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  GURL url(net::UnescapeURLComponent(escaped_url, kUnescapeRules));
103a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (!extensions::ExtensionRegistry::Get(profile)
104a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch          ->enabled_extensions().GetAppByURL(url)) {
105558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return;
106a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
107558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
108558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  RecordAppLaunchType(bucket, extensions::Manifest::TYPE_HOSTED_APP);
109558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
110558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
111558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid CoreAppLauncherHandler::RegisterMessages() {
112558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  web_ui()->RegisterMessageCallback("recordAppLaunchByURL",
113558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      base::Bind(&CoreAppLauncherHandler::HandleRecordAppLaunchByUrl,
114558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                 base::Unretained(this)));
115558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
116