Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(137)

Unified Diff: chrome/browser/content_settings/content_settings_pref_provider.cc

Issue 7218073: Explicitly ShutdownOnUIThread the HostContentSettingsMap when destroying the Profile. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: sync Created 9 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/content_settings/content_settings_pref_provider.cc
diff --git a/chrome/browser/content_settings/content_settings_pref_provider.cc b/chrome/browser/content_settings/content_settings_pref_provider.cc
index 3d2805edd1f684e2005966da7d46d38031b213d6..93879539cd89c0680feac380e283e34e4aab8c0c 100644
--- a/chrome/browser/content_settings/content_settings_pref_provider.cc
+++ b/chrome/browser/content_settings/content_settings_pref_provider.cc
@@ -9,6 +9,7 @@
#include <utility>
#include <vector>
+#include "base/auto_reset.h"
#include "base/command_line.h"
#include "base/metrics/histogram.h"
#include "chrome/browser/content_settings/content_settings_details.h"
@@ -148,14 +149,14 @@ ContentSetting FixObsoleteCookiePromptMode(ContentSettingsType content_type,
namespace content_settings {
-PrefDefaultProvider::PrefDefaultProvider(Profile* profile)
- : profile_(profile),
- is_incognito_(profile_->IsOffTheRecord()),
+PrefDefaultProvider::PrefDefaultProvider(HostContentSettingsMap* map,
+ PrefService* prefs,
+ bool incognito)
+ : map_(map),
+ prefs_(prefs),
+ is_incognito_(incognito),
updating_preferences_(false) {
- initializing_ = true;
- PrefService* prefs = profile->GetPrefs();
-
- MigrateObsoleteNotificationPref(prefs);
+ MigrateObsoleteNotificationPref();
// Read global defaults.
DCHECK_EQ(arraysize(kTypeNames),
@@ -170,15 +171,12 @@ PrefDefaultProvider::PrefDefaultProvider(Profile* profile)
UserMetricsAction("CookieBlockingDisabledPerDefault"));
}
- pref_change_registrar_.Init(prefs);
+ pref_change_registrar_.Init(prefs_);
pref_change_registrar_.Add(prefs::kDefaultContentSettings, this);
- notification_registrar_.Add(this, NotificationType::PROFILE_DESTROYED,
- Source<Profile>(profile_));
- initializing_ = false;
}
PrefDefaultProvider::~PrefDefaultProvider() {
- UnregisterObservers();
+ DCHECK(!prefs_);
}
ContentSetting PrefDefaultProvider::ProvideDefaultSetting(
@@ -198,13 +196,11 @@ void PrefDefaultProvider::UpdateDefaultSetting(
if (is_incognito_)
return;
- PrefService* prefs = profile_->GetPrefs();
-
std::string dictionary_path(kTypeNames[content_type]);
updating_preferences_ = true;
{
base::AutoLock lock(lock_);
- DictionaryPrefUpdate update(prefs, prefs::kDefaultContentSettings);
+ DictionaryPrefUpdate update(prefs_, prefs::kDefaultContentSettings);
DictionaryValue* default_settings_dictionary = update.Get();
if ((setting == CONTENT_SETTING_DEFAULT) ||
(setting == kDefaultSettings[content_type])) {
@@ -240,9 +236,8 @@ void PrefDefaultProvider::ResetToDefaults() {
ForceDefaultsToBeExplicit();
if (!is_incognito_) {
- PrefService* prefs = profile_->GetPrefs();
updating_preferences_ = true;
- prefs->ClearPref(prefs::kDefaultContentSettings);
+ prefs_->ClearPref(prefs::kDefaultContentSettings);
updating_preferences_ = false;
}
}
@@ -253,7 +248,7 @@ void PrefDefaultProvider::Observe(NotificationType type,
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
if (type == NotificationType::PREF_CHANGED) {
- DCHECK_EQ(profile_->GetPrefs(), Source<PrefService>(source).ptr());
+ DCHECK_EQ(prefs_, Source<PrefService>(source).ptr());
if (updating_preferences_)
return;
@@ -265,35 +260,28 @@ void PrefDefaultProvider::Observe(NotificationType type,
return;
}
- if (!is_incognito_) {
- ContentSettingsDetails details(ContentSettingsPattern(),
- ContentSettingsPattern(),
- CONTENT_SETTINGS_TYPE_DEFAULT,
- std::string());
- NotifyObservers(details);
- }
- } else if (type == NotificationType::PROFILE_DESTROYED) {
- DCHECK_EQ(profile_, Source<Profile>(source).ptr());
- UnregisterObservers();
+ ContentSettingsDetails details(ContentSettingsPattern(),
+ ContentSettingsPattern(),
+ CONTENT_SETTINGS_TYPE_DEFAULT,
+ std::string());
+ NotifyObservers(details);
} else {
NOTREACHED() << "Unexpected notification";
}
}
-void PrefDefaultProvider::UnregisterObservers() {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- if (!profile_)
+void PrefDefaultProvider::ShutdownOnUIThread() {
+ if (!prefs_)
return;
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
pref_change_registrar_.RemoveAll();
- notification_registrar_.Remove(this, NotificationType::PROFILE_DESTROYED,
- Source<Profile>(profile_));
- profile_ = NULL;
+ prefs_ = NULL;
+ map_ = NULL;
}
void PrefDefaultProvider::ReadDefaultSettings(bool overwrite) {
- PrefService* prefs = profile_->GetPrefs();
const DictionaryValue* default_settings_dictionary =
- prefs->GetDictionary(prefs::kDefaultContentSettings);
+ prefs_->GetDictionary(prefs::kDefaultContentSettings);
base::AutoLock lock(lock_);
@@ -348,20 +336,20 @@ void PrefDefaultProvider::GetSettingsFromDictionary(
void PrefDefaultProvider::NotifyObservers(
const ContentSettingsDetails& details) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- if (initializing_ || profile_ == NULL)
+ if (map_ == NULL)
return;
NotificationService::current()->Notify(
NotificationType::CONTENT_SETTINGS_CHANGED,
- Source<HostContentSettingsMap>(profile_->GetHostContentSettingsMap()),
+ Source<HostContentSettingsMap>(map_),
Details<const ContentSettingsDetails>(&details));
}
-void PrefDefaultProvider::MigrateObsoleteNotificationPref(PrefService* prefs) {
- if (prefs->HasPrefPath(prefs::kDesktopNotificationDefaultContentSetting)) {
+void PrefDefaultProvider::MigrateObsoleteNotificationPref() {
+ if (prefs_->HasPrefPath(prefs::kDesktopNotificationDefaultContentSetting)) {
ContentSetting setting = IntToContentSetting(
- prefs->GetInteger(prefs::kDesktopNotificationDefaultContentSetting));
+ prefs_->GetInteger(prefs::kDesktopNotificationDefaultContentSetting));
UpdateDefaultSetting(CONTENT_SETTINGS_TYPE_NOTIFICATIONS, setting);
- prefs->ClearPref(prefs::kDesktopNotificationDefaultContentSetting);
+ prefs_->ClearPref(prefs::kDesktopNotificationDefaultContentSetting);
}
}
@@ -408,28 +396,26 @@ void PrefProvider::RegisterUserPrefs(PrefService* prefs) {
PrefService::UNSYNCABLE_PREF);
}
-PrefProvider::PrefProvider(Profile* profile)
- : profile_(profile),
- is_incognito_(profile_->IsOffTheRecord()),
+PrefProvider::PrefProvider(HostContentSettingsMap* map,
+ PrefService* prefs,
+ bool incognito)
+ : prefs_(prefs),
+ map_(map),
+ is_incognito_(incognito),
updating_preferences_(false) {
- Init();
-}
-
-void PrefProvider::Init() {
- initializing_ = true;
- PrefService* prefs = profile_->GetPrefs();
-
- // Migrate obsolete preferences.
- MigrateObsoletePerhostPref(prefs);
- MigrateObsoletePopupsPref(prefs);
- MigrateObsoleteContentSettingsPatternPref(prefs);
+ if (!is_incognito_) {
+ // Migrate obsolete preferences.
+ MigrateObsoletePerhostPref();
+ MigrateObsoletePopupsPref();
+ MigrateObsoleteContentSettingsPatternPref();
+ }
// Verify preferences version.
- if (!prefs->HasPrefPath(prefs::kContentSettingsVersion)) {
- prefs->SetInteger(prefs::kContentSettingsVersion,
+ if (!prefs_->HasPrefPath(prefs::kContentSettingsVersion)) {
+ prefs_->SetInteger(prefs::kContentSettingsVersion,
ContentSettingsPattern::kContentSettingsPatternVersion);
}
- if (prefs->GetInteger(prefs::kContentSettingsVersion) >
+ if (prefs_->GetInteger(prefs::kContentSettingsVersion) >
ContentSettingsPattern::kContentSettingsPatternVersion) {
LOG(ERROR) << "Unknown content settings version in preferences.";
return;
@@ -443,13 +429,9 @@ void PrefProvider::Init() {
value_map_.size());
}
- pref_change_registrar_.Init(prefs);
+ pref_change_registrar_.Init(prefs_);
pref_change_registrar_.Add(prefs::kContentSettingsPatterns, this);
pref_change_registrar_.Add(prefs::kContentSettingsPatternPairs, this);
-
- notification_registrar_.Add(this, NotificationType::PROFILE_DESTROYED,
- Source<Profile>(profile_));
- initializing_ = false;
}
ContentSetting PrefProvider::GetContentSetting(
@@ -540,7 +522,7 @@ void PrefProvider::SetContentSetting(
}
// Update the content settings preference.
- if (!is_incognito_ && profile_) {
+ if (!is_incognito_) {
UpdatePref(primary_pattern,
secondary_pattern,
content_type,
@@ -555,6 +537,7 @@ void PrefProvider::SetContentSetting(
void PrefProvider::ResetToDefaults() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ DCHECK(prefs_);
{
base::AutoLock auto_lock(lock_);
@@ -563,10 +546,9 @@ void PrefProvider::ResetToDefaults() {
}
if (!is_incognito_) {
- PrefService* prefs = profile_->GetPrefs();
updating_preferences_ = true;
- prefs->ClearPref(prefs::kContentSettingsPatternPairs);
- prefs->ClearPref(prefs::kContentSettingsPatterns);
+ prefs_->ClearPref(prefs::kContentSettingsPatternPairs);
+ prefs_->ClearPref(prefs::kContentSettingsPatterns);
updating_preferences_ = false;
}
}
@@ -574,6 +556,7 @@ void PrefProvider::ResetToDefaults() {
void PrefProvider::ClearAllContentSettingsRules(
ContentSettingsType content_type) {
DCHECK(kTypeNames[content_type] != NULL); // Don't call this for Geolocation.
+ DCHECK(prefs_);
OriginIdentifierValueMap* map_to_modify = &incognito_value_map_;
if (!is_incognito_)
@@ -613,41 +596,35 @@ void PrefProvider::Observe(
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
if (type == NotificationType::PREF_CHANGED) {
- DCHECK_EQ(profile_->GetPrefs(), Source<PrefService>(source).ptr());
+ DCHECK_EQ(prefs_, Source<PrefService>(source).ptr());
if (updating_preferences_)
return;
std::string* name = Details<std::string>(details).ptr();
if (*name == prefs::kContentSettingsPatternPairs) {
- SyncObsoletePref(profile_->GetPrefs());
+ SyncObsoletePref();
ReadContentSettingsFromPref(true);
} else if (*name == prefs::kContentSettingsPatterns) {
- updating_preferences_ = true;
- MigrateObsoleteContentSettingsPatternPref(profile_->GetPrefs());
- updating_preferences_ = false;
+ AutoReset<bool> tmp(&updating_preferences_, true);
+ MigrateObsoleteContentSettingsPatternPref();
ReadContentSettingsFromPref(true);
} else {
NOTREACHED() << "Unexpected preference observed";
return;
}
- if (!is_incognito_) {
- ContentSettingsDetails details(ContentSettingsPattern(),
- ContentSettingsPattern(),
- CONTENT_SETTINGS_TYPE_DEFAULT,
- std::string());
- NotifyObservers(details);
- }
- } else if (type == NotificationType::PROFILE_DESTROYED) {
- DCHECK_EQ(profile_, Source<Profile>(source).ptr());
- UnregisterObservers();
+ ContentSettingsDetails details(ContentSettingsPattern(),
+ ContentSettingsPattern(),
+ CONTENT_SETTINGS_TYPE_DEFAULT,
+ std::string());
+ NotifyObservers(details);
} else {
NOTREACHED() << "Unexpected notification";
}
}
PrefProvider::~PrefProvider() {
- UnregisterObservers();
+ DCHECK(!prefs_);
}
// ////////////////////////////////////////////////////////////////////////////
@@ -659,7 +636,8 @@ void PrefProvider::UpdatePref(
ContentSettingsType content_type,
const ResourceIdentifier& resource_identifier,
ContentSetting setting) {
- updating_preferences_ = true;
+ DCHECK(prefs_);
+ AutoReset<bool> tmp(&updating_preferences_, true);
UpdatePatternPairsPref(primary_pattern,
secondary_pattern,
content_type,
@@ -670,23 +648,22 @@ void PrefProvider::UpdatePref(
content_type,
resource_identifier,
setting);
- updating_preferences_ = false;
}
void PrefProvider::ReadContentSettingsFromPref(bool overwrite) {
+ DCHECK(prefs_);
base::AutoLock auto_lock(lock_);
- PrefService* prefs = profile_->GetPrefs();
const DictionaryValue* all_settings_dictionary =
- prefs->GetDictionary(prefs::kContentSettingsPatternPairs);
+ prefs_->GetDictionary(prefs::kContentSettingsPatternPairs);
if (overwrite)
value_map_.clear();
- updating_preferences_ = true;
+ AutoReset<bool> tmp(&updating_preferences_, true);
// Careful: The returned value could be NULL if the pref has never been set.
if (all_settings_dictionary != NULL) {
- DictionaryPrefUpdate update(prefs, prefs::kContentSettingsPatternPairs);
+ DictionaryPrefUpdate update(prefs_, prefs::kContentSettingsPatternPairs);
DictionaryValue* mutable_settings;
scoped_ptr<DictionaryValue> mutable_settings_scope;
@@ -773,7 +750,8 @@ void PrefProvider::UpdatePatternsPref(
ContentSettingsType content_type,
const ResourceIdentifier& resource_identifier,
ContentSetting setting) {
- DictionaryPrefUpdate update(profile_->GetPrefs(),
+ DCHECK(prefs_);
+ DictionaryPrefUpdate update(prefs_,
prefs::kContentSettingsPatterns);
DictionaryValue* all_settings_dictionary = update.Get();
@@ -839,7 +817,8 @@ void PrefProvider::UpdatePatternPairsPref(
ContentSettingsType content_type,
const ResourceIdentifier& resource_identifier,
ContentSetting setting) {
- DictionaryPrefUpdate update(profile_->GetPrefs(),
+ DCHECK(prefs_);
+ DictionaryPrefUpdate update(prefs_,
prefs::kContentSettingsPatternPairs);
DictionaryValue* all_settings_dictionary = update.Get();
@@ -952,29 +931,27 @@ void PrefProvider::CanonicalizeContentSettingsExceptions(
void PrefProvider::NotifyObservers(
const ContentSettingsDetails& details) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- if (initializing_ || profile_ == NULL)
+ if (map_ == NULL)
return;
NotificationService::current()->Notify(
NotificationType::CONTENT_SETTINGS_CHANGED,
- Source<HostContentSettingsMap>(
- profile_->GetHostContentSettingsMap()),
+ Source<HostContentSettingsMap>(map_),
Details<const ContentSettingsDetails>(&details));
}
-void PrefProvider::UnregisterObservers() {
+void PrefProvider::ShutdownOnUIThread() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- if (!profile_)
+ if (!prefs_)
return;
pref_change_registrar_.RemoveAll();
- notification_registrar_.Remove(this, NotificationType::PROFILE_DESTROYED,
- Source<Profile>(profile_));
- profile_ = NULL;
+ prefs_ = NULL;
+ map_ = NULL;
}
-void PrefProvider::MigrateObsoletePerhostPref(PrefService* prefs) {
- if (prefs->HasPrefPath(prefs::kPerHostContentSettings)) {
+void PrefProvider::MigrateObsoletePerhostPref() {
+ if (prefs_->HasPrefPath(prefs::kPerHostContentSettings)) {
const DictionaryValue* all_settings_dictionary =
- prefs->GetDictionary(prefs::kPerHostContentSettings);
+ prefs_->GetDictionary(prefs::kPerHostContentSettings);
DCHECK(all_settings_dictionary);
for (DictionaryValue::key_iterator
i(all_settings_dictionary->begin_keys());
@@ -1026,14 +1003,14 @@ void PrefProvider::MigrateObsoletePerhostPref(PrefService* prefs) {
}
}
}
- prefs->ClearPref(prefs::kPerHostContentSettings);
+ prefs_->ClearPref(prefs::kPerHostContentSettings);
}
}
-void PrefProvider::MigrateObsoletePopupsPref(PrefService* prefs) {
- if (prefs->HasPrefPath(prefs::kPopupWhitelistedHosts)) {
+void PrefProvider::MigrateObsoletePopupsPref() {
+ if (prefs_->HasPrefPath(prefs::kPopupWhitelistedHosts)) {
const ListValue* whitelist_pref =
- prefs->GetList(prefs::kPopupWhitelistedHosts);
+ prefs_->GetList(prefs::kPopupWhitelistedHosts);
for (ListValue::const_iterator i(whitelist_pref->begin());
i != whitelist_pref->end(); ++i) {
std::string host;
@@ -1044,18 +1021,17 @@ void PrefProvider::MigrateObsoletePopupsPref(PrefService* prefs) {
"",
CONTENT_SETTING_ALLOW);
}
- prefs->ClearPref(prefs::kPopupWhitelistedHosts);
+ prefs_->ClearPref(prefs::kPopupWhitelistedHosts);
}
}
-void PrefProvider::MigrateObsoleteContentSettingsPatternPref(
- PrefService* prefs) {
- if (prefs->HasPrefPath(prefs::kContentSettingsPatterns) &&
- !is_incognito_) {
+void PrefProvider::MigrateObsoleteContentSettingsPatternPref() {
+ DCHECK(prefs_);
+ if (prefs_->HasPrefPath(prefs::kContentSettingsPatterns)) {
const DictionaryValue* all_settings_dictionary =
- prefs->GetDictionary(prefs::kContentSettingsPatterns);
+ prefs_->GetDictionary(prefs::kContentSettingsPatterns);
- DictionaryPrefUpdate update(prefs, prefs::kContentSettingsPatternPairs);
+ DictionaryPrefUpdate update(prefs_, prefs::kContentSettingsPatternPairs);
DictionaryValue* exceptions_dictionary;
exceptions_dictionary = update.Get();
for (DictionaryValue::key_iterator i(all_settings_dictionary->begin_keys());
@@ -1088,14 +1064,15 @@ void PrefProvider::MigrateObsoleteContentSettingsPatternPref(
}
}
-void PrefProvider::SyncObsoletePref(PrefService* prefs) {
- updating_preferences_ = true;
- if (prefs->HasPrefPath(prefs::kContentSettingsPatternPairs) &&
+void PrefProvider::SyncObsoletePref() {
+ DCHECK(prefs_);
+ AutoReset<bool> tmp(&updating_preferences_, true);
markusheintz_ 2011/07/06 15:56:24 This is up to you: Could we use a more descriptive
+ if (prefs_->HasPrefPath(prefs::kContentSettingsPatternPairs) &&
!is_incognito_) {
const DictionaryValue* pattern_pairs_dictionary =
- prefs->GetDictionary(prefs::kContentSettingsPatternPairs);
+ prefs_->GetDictionary(prefs::kContentSettingsPatternPairs);
- DictionaryPrefUpdate update(prefs, prefs::kContentSettingsPatterns);
+ DictionaryPrefUpdate update(prefs_, prefs::kContentSettingsPatterns);
DictionaryValue* obsolete_settings_dictionary = update.Get();
for (DictionaryValue::key_iterator i =
@@ -1120,7 +1097,6 @@ void PrefProvider::SyncObsoletePref(PrefService* prefs) {
new_key, dictionary->DeepCopy());
}
}
- updating_preferences_ = false;
}
} // namespace content_settings

Powered by Google App Engine
This is Rietveld 408576698