app_list_controller_delegate.cc revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
1// Copyright (c) 2012 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/app_list/app_list_controller_delegate.h" 6 7#include "chrome/browser/extensions/extension_service.h" 8#include "chrome/browser/extensions/extension_util.h" 9#include "chrome/browser/extensions/install_tracker_factory.h" 10#include "chrome/browser/extensions/launch_util.h" 11#include "chrome/browser/profiles/profile.h" 12#include "chrome/browser/ui/app_list/app_list_syncable_service.h" 13#include "chrome/browser/ui/app_list/app_list_syncable_service_factory.h" 14#include "chrome/browser/ui/app_list/extension_uninstaller.h" 15#include "chrome/browser/ui/apps/app_info_dialog.h" 16#include "chrome/browser/ui/browser_navigator.h" 17#include "chrome/common/extensions/extension_constants.h" 18#include "chrome/common/extensions/manifest_url_handler.h" 19#include "extensions/browser/extension_prefs.h" 20#include "extensions/browser/extension_registry.h" 21#include "extensions/browser/extension_system.h" 22#include "extensions/browser/management_policy.h" 23#include "extensions/common/extension.h" 24#include "extensions/common/extension_set.h" 25#include "net/base/url_util.h" 26#include "ui/app_list/app_list_folder_item.h" 27#include "ui/app_list/app_list_item.h" 28#include "ui/app_list/app_list_model.h" 29#include "ui/app_list/app_list_switches.h" 30 31using extensions::ExtensionRegistry; 32 33namespace { 34 35const extensions::Extension* GetExtension(Profile* profile, 36 const std::string& extension_id) { 37 const ExtensionService* service = 38 extensions::ExtensionSystem::Get(profile)->extension_service(); 39 const extensions::Extension* extension = 40 service->GetInstalledExtension(extension_id); 41 return extension; 42} 43 44} // namespace 45 46AppListControllerDelegate::~AppListControllerDelegate() {} 47 48bool AppListControllerDelegate::ForceNativeDesktop() const { 49 return false; 50} 51 52void AppListControllerDelegate::ViewClosing() {} 53 54void AppListControllerDelegate::OnShowExtensionPrompt() {} 55void AppListControllerDelegate::OnCloseExtensionPrompt() {} 56 57std::string AppListControllerDelegate::AppListSourceToString( 58 AppListSource source) { 59 switch (source) { 60 case LAUNCH_FROM_APP_LIST: 61 return extension_urls::kLaunchSourceAppList; 62 case LAUNCH_FROM_APP_LIST_SEARCH: 63 return extension_urls::kLaunchSourceAppListSearch; 64 default: 65 return std::string(); 66 } 67} 68 69bool AppListControllerDelegate::UserMayModifySettings( 70 Profile* profile, 71 const std::string& app_id) { 72 const extensions::Extension* extension = GetExtension(profile, app_id); 73 const extensions::ManagementPolicy* policy = 74 extensions::ExtensionSystem::Get(profile)->management_policy(); 75 return extension && 76 policy->UserMayModifySettings(extension, NULL); 77} 78 79bool AppListControllerDelegate::CanDoShowAppInfoFlow() { 80 return app_list::switches::IsAppInfoEnabled(); 81} 82 83void AppListControllerDelegate::DoShowAppInfoFlow( 84 Profile* profile, 85 const std::string& extension_id) { 86 DCHECK(CanDoShowAppInfoFlow()); 87 ExtensionService* service = 88 extensions::ExtensionSystem::Get(profile)->extension_service(); 89 DCHECK(service); 90 const extensions::Extension* extension = service->GetInstalledExtension( 91 extension_id); 92 DCHECK(extension); 93 94 gfx::NativeWindow parent_window = GetAppListWindow(); 95 if (!parent_window) 96 return; 97 98 OnShowExtensionPrompt(); 99 ShowAppInfoDialog( 100 parent_window, 101 profile, 102 extension, 103 base::Bind(&AppListControllerDelegate::OnCloseExtensionPrompt, 104 base::Unretained(this))); 105} 106 107void AppListControllerDelegate::UninstallApp(Profile* profile, 108 const std::string& app_id) { 109 // ExtensionUninstall deletes itself when done or aborted. 110 ExtensionUninstaller* uninstaller = 111 new ExtensionUninstaller(profile, app_id, this); 112 uninstaller->Run(); 113} 114 115bool AppListControllerDelegate::IsAppFromWebStore( 116 Profile* profile, 117 const std::string& app_id) { 118 const extensions::Extension* extension = GetExtension(profile, app_id); 119 return extension && extension->from_webstore(); 120} 121 122void AppListControllerDelegate::ShowAppInWebStore( 123 Profile* profile, 124 const std::string& app_id, 125 bool is_search_result) { 126 const extensions::Extension* extension = GetExtension(profile, app_id); 127 if (!extension) 128 return; 129 130 const GURL url = extensions::ManifestURL::GetDetailsURL(extension); 131 DCHECK_NE(url, GURL::EmptyGURL()); 132 133 const std::string source = AppListSourceToString( 134 is_search_result ? 135 AppListControllerDelegate::LAUNCH_FROM_APP_LIST_SEARCH : 136 AppListControllerDelegate::LAUNCH_FROM_APP_LIST); 137 chrome::NavigateParams params( 138 profile, 139 net::AppendQueryParameter(url, 140 extension_urls::kWebstoreSourceField, 141 source), 142 content::PAGE_TRANSITION_LINK); 143 chrome::Navigate(¶ms); 144} 145 146bool AppListControllerDelegate::HasOptionsPage( 147 Profile* profile, 148 const std::string& app_id) { 149 const extensions::Extension* extension = GetExtension(profile, app_id); 150 return extensions::util::IsAppLaunchableWithoutEnabling(app_id, profile) && 151 extension && 152 !extensions::ManifestURL::GetOptionsPage(extension).is_empty(); 153} 154 155void AppListControllerDelegate::ShowOptionsPage( 156 Profile* profile, 157 const std::string& app_id) { 158 const extensions::Extension* extension = GetExtension(profile, app_id); 159 if (!extension) 160 return; 161 162 chrome::NavigateParams params( 163 profile, 164 extensions::ManifestURL::GetOptionsPage(extension), 165 content::PAGE_TRANSITION_LINK); 166 chrome::Navigate(¶ms); 167} 168 169extensions::LaunchType AppListControllerDelegate::GetExtensionLaunchType( 170 Profile* profile, 171 const std::string& app_id) { 172 return extensions::GetLaunchType(extensions::ExtensionPrefs::Get(profile), 173 GetExtension(profile, app_id)); 174} 175 176void AppListControllerDelegate::SetExtensionLaunchType( 177 Profile* profile, 178 const std::string& extension_id, 179 extensions::LaunchType launch_type) { 180 ExtensionService* service = 181 extensions::ExtensionSystem::Get(profile)->extension_service(); 182 extensions::SetLaunchType( 183 service, extension_id, launch_type); 184} 185 186bool AppListControllerDelegate::IsExtensionInstalled( 187 Profile* profile, const std::string& app_id) { 188 return !!GetExtension(profile, app_id); 189} 190 191extensions::InstallTracker* AppListControllerDelegate::GetInstallTrackerFor( 192 Profile* profile) { 193 if (extensions::ExtensionSystem::Get(profile)->extension_service()) 194 return extensions::InstallTrackerFactory::GetForProfile(profile); 195 return NULL; 196} 197 198void AppListControllerDelegate::GetApps(Profile* profile, 199 extensions::ExtensionSet* out_apps) { 200 ExtensionRegistry* registry = ExtensionRegistry::Get(profile); 201 DCHECK(registry); 202 out_apps->InsertAll(registry->enabled_extensions()); 203 out_apps->InsertAll(registry->disabled_extensions()); 204 out_apps->InsertAll(registry->terminated_extensions()); 205} 206