1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/browser/notifications/notification_system_observer.h"
7 #include "base/logging.h"
8 #include "chrome/browser/chrome_notification_types.h"
9 #include "chrome/browser/notifications/notification_ui_manager.h"
10 #include "chrome/browser/profiles/profile.h"
11 #include "content/public/browser/notification_service.h"
12 #include "extensions/common/extension.h"
14 NotificationSystemObserver::NotificationSystemObserver(
15 NotificationUIManager
* ui_manager
)
16 : ui_manager_(ui_manager
) {
18 registrar_
.Add(this, chrome::NOTIFICATION_APP_TERMINATING
,
19 content::NotificationService::AllSources());
20 registrar_
.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED
,
21 content::NotificationService::AllSources());
22 registrar_
.Add(this, chrome::NOTIFICATION_PROFILE_DESTROYED
,
23 content::NotificationService::AllSources());
26 NotificationSystemObserver::~NotificationSystemObserver() {
29 void NotificationSystemObserver::Observe(
31 const content::NotificationSource
& source
,
32 const content::NotificationDetails
& details
) {
33 if (type
== chrome::NOTIFICATION_APP_TERMINATING
) {
34 ui_manager_
->CancelAll();
35 } else if (type
== chrome::NOTIFICATION_EXTENSION_UNLOADED
) {
36 if (!content::Source
<Profile
>(source
)->IsOffTheRecord()) {
37 extensions::UnloadedExtensionInfo
* extension_info
=
38 content::Details
<extensions::UnloadedExtensionInfo
>(details
).ptr();
39 const extensions::Extension
* extension
= extension_info
->extension
;
40 ui_manager_
->CancelAllBySourceOrigin(extension
->url());
42 } else if (type
== chrome::NOTIFICATION_PROFILE_DESTROYED
) {
43 // We only want to remove the incognito notifications.
44 if (content::Source
<Profile
>(source
)->IsOffTheRecord())
45 ui_manager_
->CancelAllByProfile(content::Source
<Profile
>(source
).ptr());