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