Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1803)

Unified Diff: content/common/notification_service.cc

Issue 8342048: Make NotificationService an interface in the content namespace, and switch callers to use it. Mov... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/common/notification_service.h ('k') | content/common/notification_service_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/common/notification_service.cc
===================================================================
--- content/common/notification_service.cc (revision 106380)
+++ content/common/notification_service.cc (working copy)
@@ -1,141 +0,0 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/common/notification_service.h"
-
-#include "base/lazy_instance.h"
-#include "base/threading/thread_local.h"
-#include "content/public/browser/notification_observer.h"
-#include "content/public/browser/notification_types.h"
-
-static base::LazyInstance<base::ThreadLocalPointer<NotificationService> >
- lazy_tls_ptr(base::LINKER_INITIALIZED);
-
-// static
-NotificationService* NotificationService::current() {
- return lazy_tls_ptr.Pointer()->Get();
-}
-
-// static
-bool NotificationService::HasKey(const NotificationSourceMap& map,
- const content::NotificationSource& source) {
- return map.find(source.map_key()) != map.end();
-}
-
-NotificationService::NotificationService() {
- DCHECK(current() == NULL);
- lazy_tls_ptr.Pointer()->Set(this);
-}
-
-void NotificationService::AddObserver(
- content::NotificationObserver* observer,
- int type,
- const content::NotificationSource& source) {
- // We have gotten some crashes where the observer pointer is NULL. The problem
- // is that this happens when we actually execute a notification, so have no
- // way of knowing who the bad observer was. We want to know when this happens
- // in release mode so we know what code to blame the crash on (since this is
- // guaranteed to crash later).
- CHECK(observer);
-
- NotificationObserverList* observer_list;
- if (HasKey(observers_[type], source)) {
- observer_list = observers_[type][source.map_key()];
- } else {
- observer_list = new NotificationObserverList;
- observers_[type][source.map_key()] = observer_list;
- }
-
- observer_list->AddObserver(observer);
-#ifndef NDEBUG
- ++observer_counts_[type];
-#endif
-}
-
-void NotificationService::RemoveObserver(
- content::NotificationObserver* observer,
- int type,
- const content::NotificationSource& source) {
- // This is a very serious bug. An object is most likely being deleted on
- // the wrong thread, and as a result another thread's NotificationService
- // has its deleted pointer in its map. A garbge object will be called in the
- // future.
- // NOTE: when this check shows crashes, use BrowserThread::DeleteOnIOThread or
- // other variants as the trait on the object.
- CHECK(HasKey(observers_[type], source));
-
- NotificationObserverList* observer_list =
- observers_[type][source.map_key()];
- if (observer_list) {
- observer_list->RemoveObserver(observer);
-#ifndef NDEBUG
- --observer_counts_[type];
-#endif
- }
-
- // TODO(jhughes): Remove observer list from map if empty?
-}
-
-void NotificationService::Notify(int type,
- const content::NotificationSource& source,
- const content::NotificationDetails& details) {
- DCHECK(type > content::NOTIFICATION_ALL) <<
- "Allowed for observing, but not posting.";
-
- // There's no particular reason for the order in which the different
- // classes of observers get notified here.
-
- // Notify observers of all types and all sources
- if (HasKey(observers_[content::NOTIFICATION_ALL], AllSources()) &&
- source != AllSources()) {
- FOR_EACH_OBSERVER(content::NotificationObserver,
- *observers_[content::NOTIFICATION_ALL][AllSources().map_key()],
- Observe(type, source, details));
- }
-
- // Notify observers of all types and the given source
- if (HasKey(observers_[content::NOTIFICATION_ALL], source)) {
- FOR_EACH_OBSERVER(content::NotificationObserver,
- *observers_[content::NOTIFICATION_ALL][source.map_key()],
- Observe(type, source, details));
- }
-
- // Notify observers of the given type and all sources
- if (HasKey(observers_[type], AllSources()) &&
- source != AllSources()) {
- FOR_EACH_OBSERVER(content::NotificationObserver,
- *observers_[type][AllSources().map_key()],
- Observe(type, source, details));
- }
-
- // Notify observers of the given type and the given source
- if (HasKey(observers_[type], source)) {
- FOR_EACH_OBSERVER(content::NotificationObserver,
- *observers_[type][source.map_key()],
- Observe(type, source, details));
- }
-}
-
-
-NotificationService::~NotificationService() {
- lazy_tls_ptr.Pointer()->Set(NULL);
-
-#ifndef NDEBUG
- for (int i = 0; i < static_cast<int>(observer_counts_.size()); i++) {
- if (observer_counts_[i] > 0) {
- // This may not be completely fixable -- see
- // http://code.google.com/p/chromium/issues/detail?id=11010 .
- VLOG(1) << observer_counts_[i] << " notification observer(s) leaked "
- "of notification type " << i;
- }
- }
-#endif
-
- for (int i = 0; i < static_cast<int>(observers_.size()); i++) {
- NotificationSourceMap omap = observers_[i];
- for (NotificationSourceMap::iterator it = omap.begin();
- it != omap.end(); ++it)
- delete it->second;
- }
-}
« no previous file with comments | « content/common/notification_service.h ('k') | content/common/notification_service_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698