- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / browser / notifications / notification_system_observer.cc
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 "chrome/common/extensions/extension.h"
12 #include "content/public/browser/notification_service.h"
13
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,
21                  content::NotificationService::AllSources());
22   registrar_.Add(this, chrome::NOTIFICATION_PROFILE_DESTROYED,
23                  content::NotificationService::AllSources());
24 }
25
26 NotificationSystemObserver::~NotificationSystemObserver() {
27 }
28
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) {
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 }