Index: content/common/notification_service.cc |
=================================================================== |
--- content/common/notification_service.cc (revision 91968) |
+++ content/common/notification_service.cc (working copy) |
@@ -24,18 +24,12 @@ |
NotificationService::NotificationService() { |
DCHECK(current() == NULL); |
-#ifndef NDEBUG |
- memset(observer_counts_, 0, sizeof(observer_counts_)); |
-#endif |
- |
lazy_tls_ptr.Pointer()->Set(this); |
} |
void NotificationService::AddObserver(NotificationObserver* observer, |
- NotificationType type, |
+ int type, |
const NotificationSource& source) { |
- DCHECK(type.value < NotificationType::NOTIFICATION_TYPE_COUNT); |
- |
// 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 |
@@ -44,81 +38,78 @@ |
CHECK(observer); |
NotificationObserverList* observer_list; |
- if (HasKey(observers_[type.value], source)) { |
- observer_list = observers_[type.value][source.map_key()]; |
+ if (HasKey(observers_[type], source)) { |
+ observer_list = observers_[type][source.map_key()]; |
} else { |
observer_list = new NotificationObserverList; |
- observers_[type.value][source.map_key()] = observer_list; |
+ observers_[type][source.map_key()] = observer_list; |
} |
observer_list->AddObserver(observer); |
#ifndef NDEBUG |
- ++observer_counts_[type.value]; |
+ ++observer_counts_[type]; |
#endif |
} |
void NotificationService::RemoveObserver(NotificationObserver* observer, |
- NotificationType type, |
+ int type, |
const NotificationSource& source) { |
- DCHECK(type.value < NotificationType::NOTIFICATION_TYPE_COUNT); |
- |
// 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.value], source)); |
+ CHECK(HasKey(observers_[type], source)); |
NotificationObserverList* observer_list = |
- observers_[type.value][source.map_key()]; |
+ observers_[type][source.map_key()]; |
if (observer_list) { |
observer_list->RemoveObserver(observer); |
#ifndef NDEBUG |
- --observer_counts_[type.value]; |
+ --observer_counts_[type]; |
#endif |
} |
// TODO(jhughes): Remove observer list from map if empty? |
} |
-void NotificationService::Notify(NotificationType type, |
+void NotificationService::Notify(int type, |
const NotificationSource& source, |
const NotificationDetails& details) { |
- DCHECK(type.value > NotificationType::ALL) << |
+ DCHECK(type > content::NOTIFICATION_ALL) << |
"Allowed for observing, but not posting."; |
- DCHECK(type.value < NotificationType::NOTIFICATION_TYPE_COUNT); |
// 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_[NotificationType::ALL], AllSources()) && |
+ if (HasKey(observers_[content::NOTIFICATION_ALL], AllSources()) && |
source != AllSources()) { |
FOR_EACH_OBSERVER(NotificationObserver, |
- *observers_[NotificationType::ALL][AllSources().map_key()], |
+ *observers_[content::NOTIFICATION_ALL][AllSources().map_key()], |
Observe(type, source, details)); |
} |
// Notify observers of all types and the given source |
- if (HasKey(observers_[NotificationType::ALL], source)) { |
+ if (HasKey(observers_[content::NOTIFICATION_ALL], source)) { |
FOR_EACH_OBSERVER(NotificationObserver, |
- *observers_[NotificationType::ALL][source.map_key()], |
+ *observers_[content::NOTIFICATION_ALL][source.map_key()], |
Observe(type, source, details)); |
} |
// Notify observers of the given type and all sources |
- if (HasKey(observers_[type.value], AllSources()) && |
+ if (HasKey(observers_[type], AllSources()) && |
source != AllSources()) { |
FOR_EACH_OBSERVER(NotificationObserver, |
- *observers_[type.value][AllSources().map_key()], |
+ *observers_[type][AllSources().map_key()], |
Observe(type, source, details)); |
} |
// Notify observers of the given type and the given source |
- if (HasKey(observers_[type.value], source)) { |
+ if (HasKey(observers_[type], source)) { |
FOR_EACH_OBSERVER(NotificationObserver, |
- *observers_[type.value][source.map_key()], |
+ *observers_[type][source.map_key()], |
Observe(type, source, details)); |
} |
} |
@@ -128,7 +119,7 @@ |
lazy_tls_ptr.Pointer()->Set(NULL); |
#ifndef NDEBUG |
- for (int i = 0; i < NotificationType::NOTIFICATION_TYPE_COUNT; i++) { |
+ for (size_t i = 0; i < 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 . |
@@ -138,7 +129,7 @@ |
} |
#endif |
- for (int i = 0; i < NotificationType::NOTIFICATION_TYPE_COUNT; i++) { |
+ for (size_t i = 0; i < observers_.size(); i++) { |
NotificationSourceMap omap = observers_[i]; |
for (NotificationSourceMap::iterator it = omap.begin(); |
it != omap.end(); ++it) |