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 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 } 50