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