| Index: base/prefs/pref_member.cc
|
| diff --git a/base/prefs/pref_member.cc b/base/prefs/pref_member.cc
|
| index eb708394979964615eec8db0c9222ae0de220632..35cbf3a1a19861e5cccf3a710bb894cbfdb999a6 100644
|
| --- a/base/prefs/pref_member.cc
|
| +++ b/base/prefs/pref_member.cc
|
| @@ -6,6 +6,8 @@
|
|
|
| #include "base/callback.h"
|
| #include "base/callback_helpers.h"
|
| +// TODO(battre): Delete this. See crbug.com/373435.
|
| +#include "base/debug/alias.h"
|
| #include "base/location.h"
|
| #include "base/prefs/pref_service.h"
|
| #include "base/value_conversions.h"
|
| @@ -47,6 +49,21 @@ void PrefMemberBase::Init(const char* pref_name,
|
|
|
| void PrefMemberBase::Destroy() {
|
| if (prefs_ && !pref_name_.empty()) {
|
| + // TODO(battre): Delete this. See crbug.com/373435.
|
| + if (!pref_service_destruction_.empty()) {
|
| + // The PrefService is already destroyed, so the following call to
|
| + // service_->RemovePrefObserver would crash anyway. When the PrefService
|
| + // was destroyed, it stored a stacktrack of the destruction in
|
| + // pref_service_destruction_. We save this on the stack in the minidump to
|
| + // understand what happens.
|
| + char tmp[2048];
|
| + const int copy =
|
| + std::min<int>(sizeof(tmp) - 1, pref_service_destruction_.length());
|
| + memcpy(tmp, pref_service_destruction_.c_str(), copy);
|
| + tmp[copy] = '\0';
|
| + base::debug::Alias(tmp);
|
| + CHECK(false) << tmp;
|
| + }
|
| prefs_->RemovePrefObserver(pref_name_.c_str(), this);
|
| prefs_ = NULL;
|
| }
|
| @@ -68,6 +85,12 @@ void PrefMemberBase::OnPreferenceChanged(PrefService* service,
|
| base::Bind(observer_, pref_name) : base::Closure());
|
| }
|
|
|
| +// TODO(battre): Delete this. See crbug.com/373435.
|
| +void PrefMemberBase::SetPrefServiceDestructionTrace(
|
| + const std::string& stacktrace) {
|
| + pref_service_destruction_ = stacktrace;
|
| +}
|
| +
|
| void PrefMemberBase::UpdateValueFromPref(const base::Closure& callback) const {
|
| VerifyValuePrefName();
|
| const PrefService::Preference* pref =
|
|
|