blob: 0ac1a66cdba583c692f02295e8103516a61657e7 [file] [log] [blame]
// 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 "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);
}