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