Chromium Code Reviews| Index: chrome/browser/prefs/pref_member.cc |
| diff --git a/chrome/browser/prefs/pref_member.cc b/chrome/browser/prefs/pref_member.cc |
| index 405aab63d850747d491fdfc6d5cc779a1373195c..5ccfecd70684b990f28922d72a938e0882127de2 100644 |
| --- a/chrome/browser/prefs/pref_member.cc |
| +++ b/chrome/browser/prefs/pref_member.cc |
| @@ -7,6 +7,7 @@ |
| #include "base/logging.h" |
| #include "base/value_conversions.h" |
| #include "chrome/browser/prefs/pref_service.h" |
| +#include "content/common/notification_source.h" |
| #include "content/common/notification_type.h" |
| namespace subtle { |
| @@ -18,8 +19,7 @@ PrefMemberBase::PrefMemberBase() |
| } |
| PrefMemberBase::~PrefMemberBase() { |
| - if (prefs_ && !pref_name_.empty()) |
| - prefs_->RemovePrefObserver(pref_name_.c_str(), this); |
| + Destroy(); |
| } |
| @@ -37,8 +37,15 @@ void PrefMemberBase::Init(const char* pref_name, PrefService* prefs, |
| prefs_->AddPrefObserver(pref_name, this); |
| } |
| +void PrefMemberBase::ObserveProfileDestruction(Profile* profile) { |
| + DCHECK(registrar_.IsEmpty()); |
| + registrar_.Add(this, |
| + NotificationType::PROFILE_DESTROYED, |
| + Source<Profile>(profile)); |
| +} |
| + |
| void PrefMemberBase::Destroy() { |
| - if (prefs_) { |
| + if (prefs_ && !pref_name_.empty()) { |
| prefs_->RemovePrefObserver(pref_name_.c_str(), this); |
| prefs_ = NULL; |
| } |
| @@ -55,11 +62,22 @@ void PrefMemberBase::MoveToThread(BrowserThread::ID thread_id) { |
| void PrefMemberBase::Observe(NotificationType type, |
| const NotificationSource& source, |
| const NotificationDetails& details) { |
| - VerifyValuePrefName(); |
| - DCHECK(NotificationType::PREF_CHANGED == type); |
| - UpdateValueFromPref(); |
| - if (!setting_value_ && observer_) |
| - observer_->Observe(type, source, details); |
| + switch (type.value) { |
| + case NotificationType::PREF_CHANGED: { |
| + VerifyValuePrefName(); |
| + UpdateValueFromPref(); |
| + if (!setting_value_ && observer_) |
| + observer_->Observe(type, source, details); |
| + break; |
| + } |
| + case NotificationType::PROFILE_DESTROYED: { |
| + Destroy(); |
| + registrar_.RemoveAll(); |
| + break; |
| + } |
|
Mattias Nissler (ping if slow)
2011/04/05 08:48:27
No need for curlies (or make it consistent with th
Bernhard Bauer
2011/04/05 10:48:34
Done.
|
| + default: |
| + NOTREACHED(); |
| + } |
| } |
| void PrefMemberBase::VerifyValuePrefName() const { |