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

Unified Diff: chrome/browser/geolocation/geolocation_content_settings_map.cc

Issue 1525018: Simplify the geolocation content settings map: it's only ever used from the U... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 10 years, 8 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/geolocation/geolocation_content_settings_map.cc
===================================================================
--- chrome/browser/geolocation/geolocation_content_settings_map.cc (revision 43945)
+++ chrome/browser/geolocation/geolocation_content_settings_map.cc (working copy)
@@ -21,19 +21,8 @@
GeolocationContentSettingsMap::kDefaultSetting = CONTENT_SETTING_ASK;
GeolocationContentSettingsMap::GeolocationContentSettingsMap(Profile* profile)
- : profile_(profile), updating_preferences_(false) {
- PrefService* prefs = profile_->GetPrefs();
-
- // Read global defaults.
- default_content_setting_ = IntToContentSetting(
- prefs->GetInteger(prefs::kGeolocationDefaultContentSetting));
- if (default_content_setting_ == CONTENT_SETTING_DEFAULT)
- default_content_setting_ = kDefaultSetting;
-
- // Read exceptions from the preference service.
- ReadExceptions();
-
- prefs->AddPrefObserver(prefs::kGeolocationContentSettings, this);
+ : profile_(profile) {
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
}
// static
@@ -53,49 +42,78 @@
}
ContentSetting GeolocationContentSettingsMap::GetDefaultContentSetting() const {
- AutoLock auto_lock(lock_);
- return default_content_setting_;
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
+ const PrefService* prefs = profile_->GetPrefs();
+ const ContentSetting default_content_setting = IntToContentSetting(
+ prefs->GetInteger(prefs::kGeolocationDefaultContentSetting));
+ return default_content_setting == CONTENT_SETTING_DEFAULT ?
+ kDefaultSetting : default_content_setting;
}
ContentSetting GeolocationContentSettingsMap::GetContentSetting(
const GURL& requesting_url,
const GURL& embedding_url) const {
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
DCHECK(requesting_url.is_valid() && embedding_url.is_valid());
GURL requesting_origin(requesting_url.GetOrigin());
GURL embedding_origin(embedding_url.GetOrigin());
DCHECK(requesting_origin.is_valid() && embedding_origin.is_valid());
- AutoLock auto_lock(lock_);
- AllOriginsSettings::const_iterator i(content_settings_.find(
- requesting_origin));
- if (i != content_settings_.end()) {
- OneOriginSettings::const_iterator j(i->second.find(embedding_origin));
- if (j != i->second.end())
- return j->second;
- if (requesting_origin != embedding_origin) {
- OneOriginSettings::const_iterator any_embedder(i->second.find(GURL()));
- if (any_embedder != i->second.end())
- return any_embedder->second;
+
+ const DictionaryValue* all_settings_dictionary =
+ profile_->GetPrefs()->GetDictionary(prefs::kGeolocationContentSettings);
+ // Careful: The returned value could be NULL if the pref has never been set.
+ if (all_settings_dictionary != NULL) {
+ DictionaryValue* requesting_origin_settings;
+ if (all_settings_dictionary->GetDictionaryWithoutPathExpansion(
+ UTF8ToWide(requesting_origin.spec()), &requesting_origin_settings)) {
+ int setting;
+ if (requesting_origin_settings->GetIntegerWithoutPathExpansion(
+ UTF8ToWide(embedding_origin.spec()), &setting))
+ return IntToContentSetting(setting);
+ // Check for any-embedder setting
+ if (requesting_origin != embedding_origin &&
+ requesting_origin_settings->GetIntegerWithoutPathExpansion(
+ L"", &setting))
+ return IntToContentSetting(setting);
}
}
- return default_content_setting_;
+ return GetDefaultContentSetting();
}
GeolocationContentSettingsMap::AllOriginsSettings
GeolocationContentSettingsMap::GetAllOriginsSettings() const {
- AutoLock auto_lock(lock_);
- return content_settings_;
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
+ AllOriginsSettings content_settings;
+ const DictionaryValue* all_settings_dictionary =
+ profile_->GetPrefs()->GetDictionary(prefs::kGeolocationContentSettings);
+ // Careful: The returned value could be NULL if the pref has never been set.
+ if (all_settings_dictionary != NULL) {
+ for (DictionaryValue::key_iterator i(all_settings_dictionary->begin_keys());
+ i != all_settings_dictionary->end_keys(); ++i) {
+ const std::wstring& wide_origin(*i);
+ GURL origin_as_url(WideToUTF8(wide_origin));
+ if (!origin_as_url.is_valid())
+ continue;
+ DictionaryValue* requesting_origin_settings_dictionary = NULL;
+ bool found = all_settings_dictionary->GetDictionaryWithoutPathExpansion(
+ wide_origin, &requesting_origin_settings_dictionary);
+ DCHECK(found);
+ if (!requesting_origin_settings_dictionary)
+ continue;
+ GetOneOriginSettingsFromDictionary(
+ requesting_origin_settings_dictionary,
+ &content_settings[origin_as_url]);
+ }
+ }
+ return content_settings;
}
void GeolocationContentSettingsMap::SetDefaultContentSetting(
ContentSetting setting) {
DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
- {
- AutoLock auto_lock(lock_);
- default_content_setting_ =
- (setting == CONTENT_SETTING_DEFAULT) ? kDefaultSetting : setting;
- }
profile_->GetPrefs()->SetInteger(prefs::kGeolocationDefaultContentSetting,
- default_content_setting_);
+ setting == CONTENT_SETTING_DEFAULT ?
+ kDefaultSetting : setting);
}
void GeolocationContentSettingsMap::SetContentSetting(
@@ -107,143 +125,50 @@
DCHECK(embedding_url.is_valid() || embedding_url.is_empty());
GURL requesting_origin(requesting_url.GetOrigin());
GURL embedding_origin(embedding_url.GetOrigin());
- DCHECK(requesting_origin.is_valid() &&
- (embedding_origin.is_valid() || embedding_url.is_empty()));
+ DCHECK(requesting_origin.is_valid());
+ DCHECK(embedding_origin.is_valid() || embedding_url.is_empty());
std::wstring wide_requesting_origin(UTF8ToWide(requesting_origin.spec()));
std::wstring wide_embedding_origin(UTF8ToWide(embedding_origin.spec()));
- DictionaryValue* all_settings_dictionary =
- profile_->GetPrefs()->GetMutableDictionary(
- prefs::kGeolocationContentSettings);
+ PrefService* prefs = profile_->GetPrefs();
+ DictionaryValue* all_settings_dictionary = prefs->GetMutableDictionary(
+ prefs::kGeolocationContentSettings);
+ DCHECK(all_settings_dictionary);
- updating_preferences_ = true;
- {
- ScopedPrefUpdate update(profile_->GetPrefs(),
- prefs::kGeolocationContentSettings);
- AutoLock auto_lock(lock_);
- DictionaryValue* requesting_origin_settings_dictionary;
- all_settings_dictionary->GetDictionaryWithoutPathExpansion(
- wide_requesting_origin, &requesting_origin_settings_dictionary);
- if (setting == CONTENT_SETTING_DEFAULT) {
- if (content_settings_.count(requesting_origin) &&
- content_settings_[requesting_origin].count(embedding_origin)) {
- if (content_settings_[requesting_origin].size() == 1) {
- all_settings_dictionary->RemoveWithoutPathExpansion(
- wide_requesting_origin, NULL);
- content_settings_.erase(requesting_origin);
- } else {
- requesting_origin_settings_dictionary->RemoveWithoutPathExpansion(
- wide_embedding_origin, NULL);
- content_settings_[requesting_origin].erase(embedding_origin);
- }
- }
- } else {
- if (!content_settings_.count(requesting_origin)) {
- requesting_origin_settings_dictionary = new DictionaryValue;
- all_settings_dictionary->SetWithoutPathExpansion(
- wide_requesting_origin, requesting_origin_settings_dictionary);
- }
- content_settings_[requesting_origin][embedding_origin] = setting;
- DCHECK(requesting_origin_settings_dictionary);
- requesting_origin_settings_dictionary->SetWithoutPathExpansion(
- wide_embedding_origin, Value::CreateIntegerValue(setting));
+ ScopedPrefUpdate update(prefs, prefs::kGeolocationContentSettings);
+ DictionaryValue* requesting_origin_settings_dictionary = NULL;
+ all_settings_dictionary->GetDictionaryWithoutPathExpansion(
+ wide_requesting_origin, &requesting_origin_settings_dictionary);
+ if (setting == CONTENT_SETTING_DEFAULT) {
+ if (requesting_origin_settings_dictionary) {
+ requesting_origin_settings_dictionary->RemoveWithoutPathExpansion(
+ wide_embedding_origin, NULL);
+ if (requesting_origin_settings_dictionary->empty())
+ all_settings_dictionary->RemoveWithoutPathExpansion(
+ wide_requesting_origin, NULL);
}
+ } else {
+ if (!requesting_origin_settings_dictionary) {
+ requesting_origin_settings_dictionary = new DictionaryValue;
+ all_settings_dictionary->SetWithoutPathExpansion(
+ wide_requesting_origin, requesting_origin_settings_dictionary);
+ }
+ DCHECK(requesting_origin_settings_dictionary);
+ requesting_origin_settings_dictionary->SetWithoutPathExpansion(
+ wide_embedding_origin, Value::CreateIntegerValue(setting));
}
- updating_preferences_ = false;
}
-void GeolocationContentSettingsMap::ClearOneRequestingOrigin(
- const GURL& requesting_origin) {
- DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
- DCHECK(requesting_origin.is_valid());
-
- {
- AutoLock auto_lock(lock_);
- AllOriginsSettings::iterator i(content_settings_.find(requesting_origin));
- if (i == content_settings_.end())
- return;
- content_settings_.erase(i);
- }
-
- PrefService* prefs = profile_->GetPrefs();
- DictionaryValue* all_settings_dictionary =
- prefs->GetMutableDictionary(prefs::kGeolocationContentSettings);
- updating_preferences_ = true;
- {
- ScopedPrefUpdate update(prefs, prefs::kGeolocationContentSettings);
- all_settings_dictionary->RemoveWithoutPathExpansion(
- UTF8ToWide(requesting_origin.spec()), NULL);
- }
- updating_preferences_ = false;
-}
-
void GeolocationContentSettingsMap::ResetToDefault() {
DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
- {
- AutoLock auto_lock(lock_);
- default_content_setting_ = kDefaultSetting;
- content_settings_.clear();
- }
-
PrefService* prefs = profile_->GetPrefs();
- updating_preferences_ = true;
- {
- prefs->ClearPref(prefs::kGeolocationDefaultContentSetting);
- prefs->ClearPref(prefs::kGeolocationContentSettings);
- }
- updating_preferences_ = false;
+ prefs->ClearPref(prefs::kGeolocationDefaultContentSetting);
+ prefs->ClearPref(prefs::kGeolocationContentSettings);
}
-void GeolocationContentSettingsMap::Observe(
- NotificationType type,
- const NotificationSource& source,
- const NotificationDetails& details) {
- DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
- DCHECK(NotificationType::PREF_CHANGED == type);
- DCHECK_EQ(profile_->GetPrefs(), Source<PrefService>(source).ptr());
- if (updating_preferences_)
- return;
-
- std::wstring* name = Details<std::wstring>(details).ptr();
- if (prefs::kGeolocationContentSettings == *name) {
- ReadExceptions();
- } else {
- NOTREACHED() << "Unexpected preference observed.";
- }
-}
-
GeolocationContentSettingsMap::~GeolocationContentSettingsMap() {
- profile_->GetPrefs()->RemovePrefObserver(prefs::kGeolocationContentSettings,
- this);
}
-void GeolocationContentSettingsMap::ReadExceptions() {
- PrefService* prefs = profile_->GetPrefs();
- const DictionaryValue* all_settings_dictionary =
- prefs->GetDictionary(prefs::kGeolocationContentSettings);
- content_settings_.clear();
- // Careful: The returned value could be NULL if the pref has never been set.
- if (all_settings_dictionary != NULL) {
- for (DictionaryValue::key_iterator i(
- all_settings_dictionary->begin_keys());
- i != all_settings_dictionary->end_keys(); ++i) {
- const std::wstring& wide_origin(*i);
- DictionaryValue* requesting_origin_settings_dictionary = NULL;
- bool found = all_settings_dictionary->GetDictionaryWithoutPathExpansion(
- wide_origin, &requesting_origin_settings_dictionary);
- DCHECK(found);
- GURL origin_as_url(WideToUTF8(wide_origin));
- if (!origin_as_url.is_valid())
- continue;
- OneOriginSettings* requesting_origin_settings =
- &content_settings_[origin_as_url];
- GetOneOriginSettingsFromDictionary(
- requesting_origin_settings_dictionary,
- requesting_origin_settings);
- }
- }
-}
-
// static
void GeolocationContentSettingsMap::GetOneOriginSettingsFromDictionary(
const DictionaryValue* dictionary,

Powered by Google App Engine
This is Rietveld 408576698