| // Copyright 2013 The Chromium Authors | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #include "chrome/browser/notifications/notification_system_observer.h" | 
 |  | 
 | #include "base/check.h" | 
 | #include "base/notreached.h" | 
 | #include "chrome/browser/browser_process.h" | 
 | #include "chrome/browser/extensions/chrome_content_browser_client_extensions_part.h" | 
 | #include "chrome/browser/lifetime/termination_notification.h" | 
 | #include "chrome/browser/notifications/notification_ui_manager.h" | 
 | #include "chrome/browser/profiles/profile.h" | 
 | #include "chrome/browser/profiles/profile_manager.h" | 
 | #include "content/public/browser/notification_service.h" | 
 | #include "extensions/common/extension.h" | 
 |  | 
 | NotificationSystemObserver::NotificationSystemObserver( | 
 |     NotificationUIManager* ui_manager) | 
 |     : ui_manager_(ui_manager) { | 
 |   DCHECK(ui_manager_); | 
 |   // base::Unretained(this) is safe here as this object owns | 
 |   // |on_app_terminating_subscription_| and the callback won't be invoked | 
 |   // after the subscription is destroyed. | 
 |   on_app_terminating_subscription_ = | 
 |       browser_shutdown::AddAppTerminatingCallback( | 
 |           base::BindOnce(&NotificationSystemObserver::OnAppTerminating, | 
 |                          base::Unretained(this))); | 
 |   for (auto* profile : | 
 |        g_browser_process->profile_manager()->GetLoadedProfiles()) { | 
 |     if (extensions::ChromeContentBrowserClientExtensionsPart:: | 
 |             AreExtensionsDisabledForProfile(profile)) { | 
 |       continue; | 
 |     } | 
 |  | 
 |     extensions::ExtensionRegistry* registry = | 
 |         extensions::ExtensionRegistry::Get(profile); | 
 |     DCHECK(registry); | 
 |     extension_registry_observations_.AddObservation(registry); | 
 |   } | 
 |  | 
 |   g_browser_process->profile_manager()->AddObserver(this); | 
 | } | 
 |  | 
 | NotificationSystemObserver::~NotificationSystemObserver() { | 
 |   g_browser_process->profile_manager()->RemoveObserver(this); | 
 | } | 
 |  | 
 | void NotificationSystemObserver::OnAppTerminating() { | 
 |   ui_manager_->StartShutdown(); | 
 | } | 
 |  | 
 | void NotificationSystemObserver::OnProfileAdded(Profile* profile) { | 
 |   DCHECK(!profile->IsOffTheRecord()); | 
 |  | 
 |   if (extensions::ChromeContentBrowserClientExtensionsPart:: | 
 |           AreExtensionsDisabledForProfile(profile)) { | 
 |     return; | 
 |   } | 
 |   auto* registry = extensions::ExtensionRegistry::Get(profile); | 
 |   DCHECK(registry); | 
 |   // If |this| was created after the profile was created but before the | 
 |   // ADDED notification was sent, we may be already observing it. |this| is | 
 |   // created lazily so it's not easy to predict construction order. | 
 |   if (!extension_registry_observations_.IsObservingSource(registry)) | 
 |     extension_registry_observations_.AddObservation(registry); | 
 | } | 
 |  | 
 | void NotificationSystemObserver::OnExtensionUnloaded( | 
 |     content::BrowserContext* browser_context, | 
 |     const extensions::Extension* extension, | 
 |     extensions::UnloadedExtensionReason reason) { | 
 |   ui_manager_->CancelAllBySourceOrigin(extension->url()); | 
 | } | 
 |  | 
 | void NotificationSystemObserver::OnShutdown( | 
 |     extensions::ExtensionRegistry* registry) { | 
 |   extension_registry_observations_.RemoveObservation(registry); | 
 | } |