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

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

Issue 1033004: Adds GeolocationContentSettingsMap. (Closed)
Patch Set: Uses "RequestingOriginSettings" and allows empty embedder as a wildcard. Created 10 years, 9 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
diff --git a/chrome/browser/geolocation/geolocation_content_settings_map.cc b/chrome/browser/geolocation/geolocation_content_settings_map.cc
new file mode 100644
index 0000000000000000000000000000000000000000..0164ea40380762a1bc54a5ff7ab8304d827948c9
--- /dev/null
+++ b/chrome/browser/geolocation/geolocation_content_settings_map.cc
@@ -0,0 +1,184 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/geolocation/geolocation_content_settings_map.h"
+
+#include "base/utf_string_conversions.h"
+#include "chrome/browser/chrome_thread.h"
+#include "chrome/browser/pref_service.h"
+#include "chrome/browser/profile.h"
+#include "chrome/common/notification_service.h"
+#include "chrome/common/notification_type.h"
+#include "chrome/common/pref_names.h"
+#include "chrome/common/url_constants.h"
+#include "net/base/dns_util.h"
+#include "net/base/static_cookie_policy.h"
+
+// static
+const ContentSetting
+ GeolocationContentSettingsMap::kDefaultSetting = CONTENT_SETTING_ASK;
+
+GeolocationContentSettingsMap::GeolocationContentSettingsMap(Profile* profile)
+ : profile_(profile) {
+ PrefService* prefs = profile_->GetPrefs();
+
+ // Read global defaults.
+ int default_content_settting =
Peter Kasting 2010/03/18 20:59:20 Nit: 3 ts
+ prefs->GetInteger(prefs::kGeolocationDefaultContentSetting);
+ default_content_setting_ = ConvertToContentSetting(default_content_settting);
+ if (default_content_setting_ == CONTENT_SETTING_DEFAULT)
+ default_content_setting_ = kDefaultSetting;
+
+ // Read exceptions.
+ const DictionaryValue* all_settings_dictionary =
+ prefs->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);
+ DictionaryValue* requesting_origin_settings_dictionary = NULL;
+ bool found = all_settings_dictionary->GetDictionaryWithoutPathExpansion(
+ wide_origin, &requesting_origin_settings_dictionary);
+ DCHECK(found);
+ EmbedderSettings* embedder_settings =
+ &requesting_origin_settings_[GURL(WideToUTF8(wide_origin))];
+ GetEmbedderSettingsFromDictionary(requesting_origin_settings_dictionary,
+ embedder_settings);
+ }
+ }
+}
+
+// static
+void GeolocationContentSettingsMap::RegisterUserPrefs(PrefService* prefs) {
+ prefs->RegisterIntegerPref(prefs::kGeolocationDefaultContentSetting,
+ CONTENT_SETTING_ASK);
+ prefs->RegisterDictionaryPref(prefs::kGeolocationContentSettings);
+}
+
+ContentSetting GeolocationContentSettingsMap::GetDefaultContentSetting() const {
+ AutoLock auto_lock(lock_);
+ return default_content_setting_;
+}
+
+ContentSetting GeolocationContentSettingsMap::GetContentSetting(
+ const GURL& embedder, const GURL& requesting_origin) const {
Peter Kasting 2010/03/18 20:59:20 Nit: We should check that these are both valid.
+ AutoLock auto_lock(lock_);
+ RequestingOriginSettings::const_iterator i(
+ requesting_origin_settings_.find(requesting_origin.GetOrigin()));
+ if (i != requesting_origin_settings_.end()) {
+ EmbedderSettings::const_iterator j(i->second.find(embedder.GetOrigin()));
+ if (j != i->second.end())
+ return j->second;
+ EmbedderSettings::const_iterator any_embedder(i->second.find(GURL()));
Peter Kasting 2010/03/18 20:59:20 We should only do this if embedder != requesting_o
+ if (any_embedder != i->second.end())
+ return any_embedder->second;
+ }
+ return default_content_setting_;
+}
+
+const GeolocationContentSettingsMap::RequestingOriginSettings&
+ GeolocationContentSettingsMap::requesting_origin_settings() const {
+ return requesting_origin_settings_;
+}
+
+void GeolocationContentSettingsMap::SetDefaultContentSetting(
+ ContentSetting setting) {
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
+ {
+ AutoLock auto_lock(lock_);
+ default_content_setting_ = setting == CONTENT_SETTING_DEFAULT ?
Peter Kasting 2010/03/18 20:59:20 Nit: Enclosing the test in parens seems slightly m
+ kDefaultSetting : setting;
+ }
+ profile_->GetPrefs()->SetInteger(prefs::kGeolocationDefaultContentSetting,
+ default_content_setting_);
+}
+
+void GeolocationContentSettingsMap::SetContentSetting(
+ const GURL& embedder, const GURL& requesting_origin,
+ ContentSetting setting) {
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
+ DCHECK(embedder.is_valid() || embedder.is_empty());
+ DCHECK(requesting_origin.is_valid());
+
+ GURL embedder_internal = embedder.GetOrigin();
+ GURL requesting_origin_internal = requesting_origin.GetOrigin();
+ std::wstring wide_requesting_origin(UTF8ToWide(requesting_origin.spec()));
+ DictionaryValue* all_settings_dictionary =
+ profile_->GetPrefs()->GetMutableDictionary(
+ prefs::kGeolocationContentSettings);
+ std::wstring embedder_dictionary_path(UTF8ToWide(embedder_internal.spec()));
+
+ 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 (!requesting_origin_settings_.count(requesting_origin_internal) ||
+ !requesting_origin_settings_[requesting_origin_internal].count(
+ embedder_internal))
Peter Kasting 2010/03/18 20:59:20 Nit: I'd indent this 4
+ return;
+ if (requesting_origin_settings_[requesting_origin_internal].size() == 1U) {
Peter Kasting 2010/03/18 20:59:20 Nit: No need for U here.
+ all_settings_dictionary->RemoveWithoutPathExpansion(
+ wide_requesting_origin, NULL);
+ requesting_origin_settings_.erase(requesting_origin_internal);
+ return;
+ }
+ requesting_origin_settings_dictionary->RemoveWithoutPathExpansion(
+ embedder_dictionary_path, NULL);
+ requesting_origin_settings_[requesting_origin_internal].erase(
+ embedder_internal);
+ return;
+ }
+
+ if (!requesting_origin_settings_.count(requesting_origin_internal)) {
+ requesting_origin_settings_dictionary = new DictionaryValue;
+ all_settings_dictionary->SetWithoutPathExpansion(
+ wide_requesting_origin, requesting_origin_settings_dictionary);
+ }
+ requesting_origin_settings_[requesting_origin_internal][embedder_internal] =
+ setting;
+ DCHECK(requesting_origin_settings_dictionary);
+ requesting_origin_settings_dictionary->SetWithoutPathExpansion(
+ embedder_dictionary_path, Value::CreateIntegerValue(setting));
+}
+
+void GeolocationContentSettingsMap::ResetToDefault() {
Peter Kasting 2010/03/18 20:59:20 We also need a function to reset the settings for
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
+
+ {
+ AutoLock auto_lock(lock_);
+ default_content_setting_ = kDefaultSetting;
+ requesting_origin_settings_.clear();
+ }
+
+ PrefService* prefs = profile_->GetPrefs();
+ prefs->ClearPref(prefs::kGeolocationDefaultContentSetting);
+ prefs->ClearPref(prefs::kGeolocationContentSettings);
+}
+
+GeolocationContentSettingsMap::~GeolocationContentSettingsMap() {
+}
+
+// static
+void GeolocationContentSettingsMap::GetEmbedderSettingsFromDictionary(
+ const DictionaryValue* dictionary, EmbedderSettings* embedder_settings) {
+ for (DictionaryValue::key_iterator i(dictionary->begin_keys());
+ i != dictionary->end_keys(); ++i) {
+ const std::wstring& target(*i);
+ int setting = kDefaultSetting;
+ bool found = dictionary->GetIntegerWithoutPathExpansion(target, &setting);
+ DCHECK(found);
+ (*embedder_settings)[GURL(WideToUTF8(target))] =
+ ConvertToContentSetting(setting);
+ }
+}
+
+// static
+ContentSetting GeolocationContentSettingsMap::ConvertToContentSetting(
+ int content_setting) {
+ DCHECK(content_setting >= CONTENT_SETTING_DEFAULT &&
+ content_setting < CONTENT_SETTING_NUM_SETTINGS);
+ return static_cast<ContentSetting>(content_setting);
+}

Powered by Google App Engine
This is Rietveld 408576698