Index: chrome/browser/apps/shortcut_manager.cc |
diff --git a/chrome/browser/apps/shortcut_manager.cc b/chrome/browser/apps/shortcut_manager.cc |
index 31fd204dc2249fcf5f791d40098c4e884879429d..0da0a8d740b8b12fe5445003be986a5119c9dae1 100644 |
--- a/chrome/browser/apps/shortcut_manager.cc |
+++ b/chrome/browser/apps/shortcut_manager.cc |
@@ -31,6 +31,14 @@ using extensions::Extension; |
namespace { |
+// This version number is stored in local prefs to check whether app shortcuts |
+// need to be recreated. This might happen when we change various aspects of app |
+// shortcuts like command-line flags or associated icons, binaries, etc. |
+const int kCurrentAppShortcutsVersion = 0; |
+ |
+// Delay in seconds before running UpdateShortcutsForAllApps. |
+const int kUpdateShortcutsForAllAppsDelay = 10; |
+ |
// Creates a shortcut for an application in the applications menu, if there is |
// not already one present. |
void CreateShortcutsInApplicationsMenu(Profile* profile, |
@@ -43,10 +51,8 @@ void CreateShortcutsInApplicationsMenu(Profile* profile, |
web_app::SHORTCUT_CREATION_AUTOMATED, creation_locations, profile, app); |
} |
-bool ShouldCreateShortcutFor(Profile* profile, const Extension* extension) { |
- return extension->is_platform_app() && |
- extension->location() != extensions::Manifest::COMPONENT && |
- extensions::ui_util::ShouldDisplayInAppLauncher(extension, profile); |
+void SetCurrentAppShortcutsVersion(PrefService* prefs) { |
+ prefs->SetInteger(prefs::kAppShortcutsVersion, kCurrentAppShortcutsVersion); |
} |
} // namespace |
@@ -55,8 +61,8 @@ bool ShouldCreateShortcutFor(Profile* profile, const Extension* extension) { |
void AppShortcutManager::RegisterProfilePrefs( |
user_prefs::PrefRegistrySyncable* registry) { |
// Indicates whether app shortcuts have been created. |
- registry->RegisterBooleanPref( |
- prefs::kAppShortcutsHaveBeenCreated, false, |
+ registry->RegisterIntegerPref( |
+ prefs::kAppShortcutsVersion, 0, |
user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); |
} |
@@ -74,10 +80,11 @@ AppShortcutManager::AppShortcutManager(Profile* profile) |
extension_registry_observer_.Add( |
extensions::ExtensionRegistry::Get(profile_)); |
- // Wait for extensions to be ready before running OnceOffCreateShortcuts. |
+ // Wait for extensions to be ready before running |
+ // UpdateShortcutsForAllAppsIfNeeded. |
extensions::ExtensionSystem::Get(profile)->ready().Post( |
FROM_HERE, |
- base::Bind(&AppShortcutManager::OnceOffCreateShortcuts, |
+ base::Bind(&AppShortcutManager::UpdateShortcutsForAllAppsIfNeeded, |
weak_ptr_factory_.GetWeakPtr())); |
ProfileManager* profile_manager = g_browser_process->profile_manager(); |
@@ -112,7 +119,7 @@ void AppShortcutManager::OnExtensionWillBeInstalled( |
if (is_update && !from_ephemeral) { |
web_app::UpdateAllShortcuts( |
base::UTF8ToUTF16(old_name), profile_, extension); |
- } else if (ShouldCreateShortcutFor(profile_, extension)) { |
+ } else { |
CreateShortcutsInApplicationsMenu(profile_, extension); |
} |
} |
@@ -133,25 +140,16 @@ void AppShortcutManager::OnProfileWillBeRemoved( |
profile_path)); |
} |
-void AppShortcutManager::OnceOffCreateShortcuts() { |
- if (prefs_->GetBoolean(prefs::kAppShortcutsHaveBeenCreated)) |
+void AppShortcutManager::UpdateShortcutsForAllAppsIfNeeded() { |
+ int last_version = prefs_->GetInteger(prefs::kAppShortcutsVersion); |
+ if (last_version >= kCurrentAppShortcutsVersion) |
return; |
- prefs_->SetBoolean(prefs::kAppShortcutsHaveBeenCreated, true); |
- |
- // 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 extensions::ExtensionSet* apps = extension_service->extensions(); |
- for (extensions::ExtensionSet::const_iterator it = apps->begin(); |
- it != apps->end(); ++it) { |
- if (ShouldCreateShortcutFor(profile_, it->get())) |
- CreateShortcutsInApplicationsMenu(profile_, it->get()); |
- } |
+ content::BrowserThread::PostDelayedTask( |
+ content::BrowserThread::UI, |
+ FROM_HERE, |
+ base::Bind(&web_app::UpdateShortcutsForAllApps, |
+ profile_, |
+ base::Bind(&SetCurrentAppShortcutsVersion, prefs_)), |
+ base::TimeDelta::FromSeconds(kUpdateShortcutsForAllAppsDelay)); |
} |