| 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..52067e972fbe12ffea543659ec2f5544532faa46 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,23 @@ 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;
|
| + }
|
| + default: {
|
| + NOTREACHED();
|
| + }
|
| + }
|
| }
|
|
|
| void PrefMemberBase::VerifyValuePrefName() const {
|
|
|