app_list_controller_delegate.cc revision 1e9bf3e0803691d0a228da41fc608347b6db4340
158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// found in the LICENSE file.
458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/ui/app_list/app_list_controller_delegate.h"
658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/extensions/extension_service.h"
858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/extensions/extension_system.h"
958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/extensions/management_policy.h"
1058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/ui/app_list/extension_uninstaller.h"
1158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/ui/browser_navigator.h"
1258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/common/extensions/extension.h"
1358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/common/extensions/extension_constants.h"
1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/common/extensions/manifest_url_handler.h"
1558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "net/base/url_util.h"
1658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace {
1858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const extensions::Extension* GetExtension(Profile* profile,
20a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                              const std::string& extension_id) {
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const ExtensionService* service =
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      extensions::ExtensionSystem::Get(profile)->extension_service();
2358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const extensions::Extension* extension =
2458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      service->GetInstalledExtension(extension_id);
2558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return extension;
2658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
2758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}  // namespace
2958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
30116680a4aac90f2aa7413d9095a592090648e557Ben MurdochAppListControllerDelegate::~AppListControllerDelegate() {}
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
3258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AppListControllerDelegate::ViewClosing() {}
3358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AppListControllerDelegate::OnShowExtensionPrompt() {}
3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AppListControllerDelegate::OnCloseExtensionPrompt() {}
3658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)std::string AppListControllerDelegate::AppListSourceToString(
3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    AppListSource source) {
39a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  switch (source) {
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case LAUNCH_FROM_APP_LIST:
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return extension_urls::kLaunchSourceAppList;
4258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    case LAUNCH_FROM_APP_LIST_SEARCH:
4358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      return extension_urls::kLaunchSourceAppListSearch;
4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    default: return std::string();
4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool AppListControllerDelegate::UserMayModifySettings(
4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    Profile* profile,
5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const std::string& app_id) {
5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const extensions::Extension* extension = GetExtension(profile, app_id);
52a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  const extensions::ManagementPolicy* policy =
5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      extensions::ExtensionSystem::Get(profile)->management_policy();
5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return extension &&
5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         policy->UserMayModifySettings(extension, NULL);
5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
5758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
5858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void AppListControllerDelegate::UninstallApp(Profile* profile,
59                                             const std::string& app_id) {
60  // ExtensionUninstall deletes itself when done or aborted.
61  ExtensionUninstaller* uninstaller =
62      new ExtensionUninstaller(profile, app_id, this);
63  uninstaller->Run();
64}
65
66bool AppListControllerDelegate::IsAppFromWebStore(
67    Profile* profile,
68    const std::string& app_id) {
69  const extensions::Extension* extension = GetExtension(profile, app_id);
70  return extension && extension->from_webstore();
71}
72
73void AppListControllerDelegate::ShowAppInWebStore(
74    Profile* profile,
75    const std::string& app_id,
76    bool is_search_result) {
77  const extensions::Extension* extension = GetExtension(profile, app_id);
78  if (!extension)
79    return;
80
81  const GURL url = extensions::ManifestURL::GetDetailsURL(extension);
82  DCHECK_NE(url, GURL::EmptyGURL());
83
84  const std::string source = AppListSourceToString(
85      is_search_result ?
86          AppListControllerDelegate::LAUNCH_FROM_APP_LIST_SEARCH :
87          AppListControllerDelegate::LAUNCH_FROM_APP_LIST);
88  chrome::NavigateParams params(
89      profile,
90      net::AppendQueryParameter(url,
91                                extension_urls::kWebstoreSourceField,
92                                source),
93      content::PAGE_TRANSITION_LINK);
94  chrome::Navigate(&params);
95}
96
97bool AppListControllerDelegate::HasOptionsPage(
98    Profile* profile,
99    const std::string& app_id) {
100  const ExtensionService* service =
101      extensions::ExtensionSystem::Get(profile)->extension_service();
102  const extensions::Extension* extension = GetExtension(profile, app_id);
103  return service->IsExtensionEnabledForLauncher(app_id) &&
104         extension &&
105         !extensions::ManifestURL::GetOptionsPage(extension).is_empty();
106}
107
108void AppListControllerDelegate::ShowOptionsPage(
109    Profile* profile,
110    const std::string& app_id) {
111  const extensions::Extension* extension = GetExtension(profile, app_id);
112  if (!extension)
113    return;
114
115  chrome::NavigateParams params(
116      profile,
117      extensions::ManifestURL::GetOptionsPage(extension),
118      content::PAGE_TRANSITION_LINK);
119  chrome::Navigate(&params);
120}
121
122extensions::ExtensionPrefs::LaunchType
123AppListControllerDelegate::GetExtensionLaunchType(
124    Profile* profile,
125    const std::string& app_id) {
126  ExtensionService* service =
127      extensions::ExtensionSystem::Get(profile)->extension_service();
128  return service->extension_prefs()->
129      GetLaunchType(GetExtension(profile, app_id),
130                    extensions::ExtensionPrefs::LAUNCH_DEFAULT);
131}
132
133void AppListControllerDelegate::SetExtensionLaunchType(
134    Profile* profile,
135    const std::string& extension_id,
136    extensions::ExtensionPrefs::LaunchType launch_type) {
137  ExtensionService* service =
138      extensions::ExtensionSystem::Get(profile)->extension_service();
139  service->extension_prefs()->SetLaunchType(extension_id, launch_type);
140}
141
142bool AppListControllerDelegate::IsExtensionInstalled(
143    Profile* profile, const std::string& app_id) {
144  return !!GetExtension(profile, app_id);
145}
146