- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / browser / ui / webui / ntp / core_app_launcher_handler.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/webui/ntp/core_app_launcher_handler.h"
6
7 #include "base/bind.h"
8 #include "base/metrics/histogram.h"
9 #include "chrome/browser/extensions/extension_service.h"
10 #include "chrome/browser/profiles/profile.h"
11 #include "chrome/browser/ui/webui/ntp/app_launcher_handler.h"
12 #include "chrome/common/extensions/extension.h"
13 #include "chrome/common/pref_names.h"
14 #include "components/user_prefs/pref_registry_syncable.h"
15 #include "content/public/browser/web_ui.h"
16 #include "net/base/escape.h"
17
18 namespace {
19 const net::UnescapeRule::Type kUnescapeRules =
20     net::UnescapeRule::NORMAL | net::UnescapeRule::URL_SPECIAL_CHARS;
21 }
22
23 CoreAppLauncherHandler::CoreAppLauncherHandler() {}
24
25 CoreAppLauncherHandler::~CoreAppLauncherHandler() {}
26
27 // static
28 void CoreAppLauncherHandler::RecordAppLaunchType(
29     extension_misc::AppLaunchBucket bucket,
30     extensions::Manifest::Type app_type) {
31   DCHECK_LT(bucket, extension_misc::APP_LAUNCH_BUCKET_BOUNDARY);
32   if (app_type == extensions::Manifest::TYPE_PLATFORM_APP) {
33     UMA_HISTOGRAM_ENUMERATION(extension_misc::kPlatformAppLaunchHistogram,
34                               bucket,
35                               extension_misc::APP_LAUNCH_BUCKET_BOUNDARY);
36   } else {
37     UMA_HISTOGRAM_ENUMERATION(extension_misc::kAppLaunchHistogram,
38                               bucket,
39                               extension_misc::APP_LAUNCH_BUCKET_BOUNDARY);
40   }
41 }
42
43 // static
44 void CoreAppLauncherHandler::RecordAppListSearchLaunch(
45     const extensions::Extension* extension) {
46   extension_misc::AppLaunchBucket bucket =
47       extension_misc::APP_LAUNCH_APP_LIST_SEARCH;
48   if (extension->id() == extension_misc::kWebStoreAppId)
49     bucket = extension_misc::APP_LAUNCH_APP_LIST_SEARCH_WEBSTORE;
50   else if (extension->id() == extension_misc::kChromeAppId)
51     bucket = extension_misc::APP_LAUNCH_APP_LIST_SEARCH_CHROME;
52   RecordAppLaunchType(bucket, extension->GetType());
53 }
54
55 // static
56 void CoreAppLauncherHandler::RecordAppListMainLaunch(
57     const extensions::Extension* extension) {
58   extension_misc::AppLaunchBucket bucket =
59       extension_misc::APP_LAUNCH_APP_LIST_MAIN;
60   if (extension->id() == extension_misc::kWebStoreAppId)
61     bucket = extension_misc::APP_LAUNCH_APP_LIST_MAIN_WEBSTORE;
62   else if (extension->id() == extension_misc::kChromeAppId)
63     bucket = extension_misc::APP_LAUNCH_APP_LIST_MAIN_CHROME;
64   RecordAppLaunchType(bucket, extension->GetType());
65 }
66
67 // static
68 void CoreAppLauncherHandler::RecordWebStoreLaunch() {
69   RecordAppLaunchType(extension_misc::APP_LAUNCH_NTP_WEBSTORE,
70                       extensions::Manifest::TYPE_HOSTED_APP);
71 }
72
73 // static
74 void CoreAppLauncherHandler::RegisterProfilePrefs(
75     user_prefs::PrefRegistrySyncable* registry) {
76   registry->RegisterListPref(prefs::kNtpAppPageNames,
77                              user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
78 }
79
80 void CoreAppLauncherHandler::HandleRecordAppLaunchByUrl(
81     const base::ListValue* args) {
82   std::string url;
83   CHECK(args->GetString(0, &url));
84   double source;
85   CHECK(args->GetDouble(1, &source));
86
87   extension_misc::AppLaunchBucket bucket =
88       static_cast<extension_misc::AppLaunchBucket>(static_cast<int>(source));
89   CHECK(source < extension_misc::APP_LAUNCH_BUCKET_BOUNDARY);
90
91   RecordAppLaunchByUrl(Profile::FromWebUI(web_ui()), url, bucket);
92 }
93
94 void CoreAppLauncherHandler::RecordAppLaunchByUrl(
95     Profile* profile,
96     std::string escaped_url,
97     extension_misc::AppLaunchBucket bucket) {
98   CHECK(bucket != extension_misc::APP_LAUNCH_BUCKET_INVALID);
99
100   GURL url(net::UnescapeURLComponent(escaped_url, kUnescapeRules));
101   DCHECK(profile->GetExtensionService());
102   if (!profile->GetExtensionService()->IsInstalledApp(url))
103     return;
104
105   RecordAppLaunchType(bucket, extensions::Manifest::TYPE_HOSTED_APP);
106 }
107
108 void CoreAppLauncherHandler::RegisterMessages() {
109   web_ui()->RegisterMessageCallback("recordAppLaunchByURL",
110       base::Bind(&CoreAppLauncherHandler::HandleRecordAppLaunchByUrl,
111                  base::Unretained(this)));
112 }