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