| Index: apps/shortcut_manager.cc
|
| diff --git a/apps/shortcut_manager.cc b/apps/shortcut_manager.cc
|
| index 13aba1826d05d081a147cc67b11d1277a9095c44..5fafdb63b6361f5a8654a0eb3ed0dd3fc8aedeba 100644
|
| --- a/apps/shortcut_manager.cc
|
| +++ b/apps/shortcut_manager.cc
|
| @@ -4,16 +4,22 @@
|
|
|
| #include "apps/shortcut_manager.h"
|
|
|
| +#include "apps/pref_names.h"
|
| #include "base/bind.h"
|
| #include "base/command_line.h"
|
| #include "base/compiler_specific.h"
|
| +#include "base/prefs/pref_service.h"
|
| #include "base/strings/string16.h"
|
| #include "base/strings/utf_string_conversions.h"
|
| +#include "chrome/browser/extensions/extension_service.h"
|
| +#include "chrome/browser/extensions/extension_system.h"
|
| +#include "chrome/browser/profiles/profile.h"
|
| #include "chrome/browser/shell_integration.h"
|
| #include "chrome/browser/ui/web_applications/web_app_ui.h"
|
| #include "chrome/browser/web_applications/web_app.h"
|
| #include "chrome/common/chrome_notification_types.h"
|
| #include "chrome/common/chrome_switches.h"
|
| +#include "chrome/common/extensions/extension_set.h"
|
| #include "content/public/browser/notification_details.h"
|
| #include "content/public/browser/notification_source.h"
|
|
|
| @@ -32,17 +38,27 @@ void CreateShortcutsInApplicationsMenu(
|
| web_app::CreateShortcuts(shortcut_info, creation_locations);
|
| }
|
|
|
| +bool ShouldCreateShortcutFor(const extensions::Extension* extension) {
|
| + return extension->is_platform_app() &&
|
| + extension->location() != extensions::Manifest::COMPONENT &&
|
| + extension->ShouldDisplayInAppLauncher();
|
| +}
|
| +
|
| } // namespace
|
|
|
| namespace apps {
|
|
|
| ShortcutManager::ShortcutManager(Profile* profile)
|
| : profile_(profile),
|
| + prefs_(profile->GetPrefs()),
|
| weak_factory_(this) {
|
| registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_INSTALLED,
|
| content::Source<Profile>(profile_));
|
| registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNINSTALLED,
|
| content::Source<Profile>(profile_));
|
| + // Wait for extensions to be ready before running OnceOffCreateShortcuts.
|
| + registrar_.Add(this, chrome::NOTIFICATION_EXTENSIONS_READY,
|
| + content::Source<Profile>(profile_));
|
| }
|
|
|
| ShortcutManager::~ShortcutManager() {}
|
| @@ -51,6 +67,10 @@ void ShortcutManager::Observe(int type,
|
| const content::NotificationSource& source,
|
| const content::NotificationDetails& details) {
|
| switch (type) {
|
| + case chrome::NOTIFICATION_EXTENSIONS_READY: {
|
| + OnceOffCreateShortcuts();
|
| + break;
|
| + }
|
| case chrome::NOTIFICATION_EXTENSION_INSTALLED: {
|
| #if defined(OS_MACOSX)
|
| if (!CommandLine::ForCurrentProcess()->
|
| @@ -62,9 +82,7 @@ void ShortcutManager::Observe(int type,
|
| content::Details<const extensions::InstalledExtensionInfo>(details)
|
| .ptr();
|
| const Extension* extension = installed_info->extension;
|
| - if (extension->is_platform_app() &&
|
| - extension->location() != extensions::Manifest::COMPONENT &&
|
| - extension->ShouldDisplayInAppLauncher()) {
|
| + if (ShouldCreateShortcutFor(extension)) {
|
| // If the app is being updated, update any existing shortcuts but do not
|
| // create new ones. If it is being installed, automatically create a
|
| // shortcut in the applications menu (e.g., Start Menu).
|
| @@ -94,6 +112,43 @@ void ShortcutManager::Observe(int type,
|
| }
|
| }
|
|
|
| +void ShortcutManager::OnceOffCreateShortcuts() {
|
| + bool was_enabled = prefs_->GetBoolean(apps::prefs::kShortcutsHaveBeenCreated);
|
| +
|
| + // Creation of shortcuts on Mac currently sits behind --enable-app-shims.
|
| + // Until it is enabled permanently, we need to check the flag, and set the
|
| + // pref accordingly.
|
| +#if defined(OS_MACOSX)
|
| + bool is_now_enabled =
|
| + CommandLine::ForCurrentProcess()->HasSwitch(switches::kEnableAppShims);
|
| +#else
|
| + bool is_now_enabled = true;
|
| +#endif // defined(OS_MACOSX)
|
| +
|
| + if (was_enabled != is_now_enabled)
|
| + prefs_->SetBoolean(apps::prefs::kShortcutsHaveBeenCreated, is_now_enabled);
|
| +
|
| + if (was_enabled || !is_now_enabled)
|
| + return;
|
| +
|
| + // Check if extension system/service are available. They might not be in
|
| + // tests.
|
| + extensions::ExtensionSystem* extension_system;
|
| + ExtensionServiceInterface* extension_service;
|
| + if (!(extension_system = extensions::ExtensionSystem::Get(profile_)) ||
|
| + !(extension_service = extension_system->extension_service()))
|
| + return;
|
| +
|
| + // Create an applications menu shortcut for each app in this profile.
|
| + const ExtensionSet* apps = extension_service->extensions();
|
| + for (ExtensionSet::const_iterator it = apps->begin();
|
| + it != apps->end(); ++it) {
|
| + if (ShouldCreateShortcutFor(*it))
|
| + web_app::UpdateShortcutInfoAndIconForApp(
|
| + *(*it), profile_, base::Bind(&CreateShortcutsInApplicationsMenu));
|
| + }
|
| +}
|
| +
|
| void ShortcutManager::DeleteApplicationShortcuts(
|
| const Extension* extension) {
|
| ShellIntegration::ShortcutInfo delete_info =
|
|
|