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.
4
5 #include "chrome/browser/notifications/notification_system_observer.h"
6
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"
13
NotificationSystemObserver(NotificationUIManager * ui_manager)14 NotificationSystemObserver::NotificationSystemObserver(
15 NotificationUIManager* ui_manager)
16 : ui_manager_(ui_manager) {
17 DCHECK(ui_manager_);
18 registrar_.Add(this, chrome::NOTIFICATION_APP_TERMINATING,
19 content::NotificationService::AllSources());
20 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED_DEPRECATED,
21 content::NotificationService::AllSources());
22 registrar_.Add(this, chrome::NOTIFICATION_PROFILE_DESTROYED,
23 content::NotificationService::AllSources());
24 }
25
~NotificationSystemObserver()26 NotificationSystemObserver::~NotificationSystemObserver() {
27 }
28
Observe(int type,const content::NotificationSource & source,const content::NotificationDetails & details)29 void NotificationSystemObserver::Observe(
30 int type,
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_DEPRECATED) {
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());
41 }
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());
46 } else {
47 NOTREACHED();
48 }
49 }
50