Index: chrome/browser/chromeos/note_taking_helper.cc |
diff --git a/chrome/browser/chromeos/note_taking_helper.cc b/chrome/browser/chromeos/note_taking_helper.cc |
index cfba53e151595ed7896d8ceafe881fe8bd6ae14d..273d740760b1246f5b93910205fb4d01b4d60a4d 100644 |
--- a/chrome/browser/chromeos/note_taking_helper.cc |
+++ b/chrome/browser/chromeos/note_taking_helper.cc |
@@ -4,6 +4,7 @@ |
#include "chrome/browser/chromeos/note_taking_helper.h" |
+#include <algorithm> |
#include <utility> |
#include "apps/launcher.h" |
@@ -15,14 +16,18 @@ |
#include "base/memory/ptr_util.h" |
#include "base/memory/ref_counted.h" |
#include "base/strings/string_split.h" |
+#include "chrome/browser/browser_process.h" |
+#include "chrome/browser/chrome_notification_types.h" |
#include "chrome/browser/chromeos/file_manager/path_util.h" |
#include "chrome/browser/profiles/profile.h" |
+#include "chrome/browser/profiles/profile_manager.h" |
#include "chrome/common/pref_names.h" |
#include "chromeos/chromeos_switches.h" |
#include "components/arc/arc_bridge_service.h" |
#include "components/arc/common/intent_helper.mojom.h" |
#include "components/prefs/pref_service.h" |
#include "content/public/browser/browser_thread.h" |
+#include "content/public/browser/notification_service.h" |
#include "extensions/browser/extension_registry.h" |
#include "extensions/common/api/app_runtime.h" |
#include "extensions/common/extension.h" |
@@ -72,37 +77,6 @@ arc::mojom::IntentInfoPtr CreateIntentInfo(const GURL& clip_data_uri) { |
return intent; |
} |
-// Returns all installed and enabled whitelisted Chrome note-taking apps. |
-std::vector<const extensions::Extension*> GetChromeApps(Profile* profile) { |
- DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
- // TODO(derat): Query for additional Chrome apps once http://crbug.com/657139 |
- // is resolved. |
- std::vector<extensions::ExtensionId> ids; |
- const std::string switch_value = |
- base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( |
- switches::kNoteTakingAppIds); |
- if (!switch_value.empty()) { |
- ids = base::SplitString(switch_value, ",", base::TRIM_WHITESPACE, |
- base::SPLIT_WANT_NONEMPTY); |
- } |
- ids.insert(ids.end(), kExtensionIds, |
- kExtensionIds + arraysize(kExtensionIds)); |
- |
- const extensions::ExtensionRegistry* extension_registry = |
- extensions::ExtensionRegistry::Get(profile); |
- const extensions::ExtensionSet& enabled_extensions = |
- extension_registry->enabled_extensions(); |
- |
- std::vector<const extensions::Extension*> extensions; |
- for (const auto& id : ids) { |
- if (enabled_extensions.Contains(id)) { |
- extensions.push_back(extension_registry->GetExtensionById( |
- id, extensions::ExtensionRegistry::ENABLED)); |
- } |
- } |
- return extensions; |
-} |
- |
} // namespace |
const char NoteTakingHelper::kIntentAction[] = |
@@ -218,9 +192,30 @@ void NoteTakingHelper::OnArcOptInChanged(bool enabled) { |
NoteTakingHelper::NoteTakingHelper() |
: launch_chrome_app_callback_( |
base::Bind(&apps::LaunchPlatformAppWithAction)), |
+ extension_registry_observer_(this), |
weak_ptr_factory_(this) { |
DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
+ const std::string switch_value = |
+ base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( |
+ switches::kNoteTakingAppIds); |
+ if (!switch_value.empty()) { |
+ whitelisted_chrome_app_ids_ = base::SplitString( |
+ switch_value, ",", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY); |
+ } |
+ whitelisted_chrome_app_ids_.insert(whitelisted_chrome_app_ids_.end(), |
+ kExtensionIds, |
+ kExtensionIds + arraysize(kExtensionIds)); |
+ |
+ // Track profiles so we can observe their extension registries. |
+ registrar_.Add(this, chrome::NOTIFICATION_PROFILE_ADDED, |
+ content::NotificationService::AllBrowserContextsAndSources()); |
+ for (Profile* profile : |
+ g_browser_process->profile_manager()->GetLoadedProfiles()) { |
+ extension_registry_observer_.Add( |
+ extensions::ExtensionRegistry::Get(profile)); |
+ } |
+ |
// Check if the primary profile has already enabled ARC and watch for changes. |
auto session_manager = arc::ArcSessionManager::Get(); |
session_manager->AddObserver(this); |
@@ -244,6 +239,7 @@ NoteTakingHelper::NoteTakingHelper() |
NoteTakingHelper::~NoteTakingHelper() { |
DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
+ |
// ArcSessionManagerTest shuts down ARC before NoteTakingHelper. |
if (arc::ArcServiceManager::Get()) |
arc::ArcServiceManager::Get()->RemoveObserver(this); |
@@ -251,6 +247,34 @@ NoteTakingHelper::~NoteTakingHelper() { |
arc::ArcSessionManager::Get()->RemoveObserver(this); |
} |
+bool NoteTakingHelper::IsWhitelistedChromeApp( |
+ const extensions::Extension* extension) const { |
+ DCHECK(extension); |
+ return std::find(whitelisted_chrome_app_ids_.begin(), |
+ whitelisted_chrome_app_ids_.end(), |
+ extension->id()) != whitelisted_chrome_app_ids_.end(); |
+} |
+ |
+std::vector<const extensions::Extension*> NoteTakingHelper::GetChromeApps( |
+ Profile* profile) const { |
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
+ const extensions::ExtensionRegistry* extension_registry = |
+ extensions::ExtensionRegistry::Get(profile); |
+ const extensions::ExtensionSet& enabled_extensions = |
+ extension_registry->enabled_extensions(); |
+ |
+ // TODO(derat): Query for additional Chrome apps once http://crbug.com/657139 |
+ // is resolved. |
+ std::vector<const extensions::Extension*> extensions; |
+ for (const auto& id : whitelisted_chrome_app_ids_) { |
+ if (enabled_extensions.Contains(id)) { |
+ extensions.push_back(extension_registry->GetExtensionById( |
+ id, extensions::ExtensionRegistry::ENABLED)); |
+ } |
+ } |
+ return extensions; |
+} |
+ |
void NoteTakingHelper::UpdateAndroidApps() { |
DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
auto* helper = GetIntentHelper("RequestIntentHandlerList", 12); |
@@ -327,4 +351,37 @@ bool NoteTakingHelper::LaunchAppInternal(Profile* profile, |
return true; |
} |
+void NoteTakingHelper::Observe(int type, |
+ const content::NotificationSource& source, |
+ const content::NotificationDetails& details) { |
+ DCHECK_EQ(type, chrome::NOTIFICATION_PROFILE_ADDED); |
+ auto registry = extensions::ExtensionRegistry::Get( |
+ content::Source<Profile>(source).ptr()); |
+ DCHECK(!extension_registry_observer_.IsObserving(registry)); |
+ extension_registry_observer_.Add(registry); |
+} |
+ |
+void NoteTakingHelper::OnExtensionLoaded( |
+ content::BrowserContext* browser_context, |
+ const extensions::Extension* extension) { |
+ if (IsWhitelistedChromeApp(extension)) { |
+ for (auto& observer : observers_) |
+ observer.OnAvailableNoteTakingAppsUpdated(); |
+ } |
+} |
+ |
+void NoteTakingHelper::OnExtensionUnloaded( |
+ content::BrowserContext* browser_context, |
+ const extensions::Extension* extension, |
+ extensions::UnloadedExtensionInfo::Reason reason) { |
+ if (IsWhitelistedChromeApp(extension)) { |
+ for (auto& observer : observers_) |
+ observer.OnAvailableNoteTakingAppsUpdated(); |
+ } |
+} |
+ |
+void NoteTakingHelper::OnShutdown(extensions::ExtensionRegistry* registry) { |
+ extension_registry_observer_.Remove(registry); |
+} |
+ |
} // namespace chromeos |