Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1566)

Unified Diff: apps/shortcut_manager.cc

Issue 17261016: When app shortcuts are enabled, do a once-off creation of all shortcuts. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address comments. Fix tests. Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « apps/shortcut_manager.h ('k') | chrome/browser/prefs/browser_prefs.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 =
« no previous file with comments | « apps/shortcut_manager.h ('k') | chrome/browser/prefs/browser_prefs.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698