| Index: chrome/browser/geolocation/geolocation_content_settings_map.cc
|
| ===================================================================
|
| --- chrome/browser/geolocation/geolocation_content_settings_map.cc (revision 0)
|
| +++ chrome/browser/geolocation/geolocation_content_settings_map.cc (revision 0)
|
| @@ -0,0 +1,203 @@
|
| +// 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.
|
| + default_content_setting_ = IntToContentSetting(
|
| + prefs->GetInteger(prefs::kGeolocationDefaultContentSetting));
|
| + 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);
|
| + OneOriginSettings* requesting_origin_settings =
|
| + &content_settings_[GURL(WideToUTF8(wide_origin))];
|
| + GetOneOriginSettingsFromDictionary(requesting_origin_settings_dictionary,
|
| + requesting_origin_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& requesting_url,
|
| + const GURL& embedding_url) const {
|
| + 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;
|
| + }
|
| + }
|
| + return default_content_setting_;
|
| +}
|
| +
|
| +GeolocationContentSettingsMap::AllOriginsSettings
|
| + GeolocationContentSettingsMap::GetAllOriginsSettings() const {
|
| + AutoLock auto_lock(lock_);
|
| + 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_);
|
| +}
|
| +
|
| +void GeolocationContentSettingsMap::SetContentSetting(
|
| + const GURL& requesting_url,
|
| + const GURL& embedding_url,
|
| + ContentSetting setting) {
|
| + DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
|
| + DCHECK(requesting_url.is_valid() &&
|
| + (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()));
|
| + 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);
|
| +
|
| + 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))
|
| + return;
|
| + if (content_settings_[requesting_origin].size() == 1) {
|
| + all_settings_dictionary->RemoveWithoutPathExpansion(
|
| + wide_requesting_origin, NULL);
|
| + content_settings_.erase(requesting_origin);
|
| + return;
|
| + }
|
| + requesting_origin_settings_dictionary->RemoveWithoutPathExpansion(
|
| + wide_embedding_origin, NULL);
|
| + content_settings_[requesting_origin].erase(embedding_origin);
|
| + return;
|
| + }
|
| +
|
| + 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));
|
| +}
|
| +
|
| +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);
|
| + }
|
| +
|
| + DictionaryValue* all_settings_dictionary =
|
| + profile_->GetPrefs()->GetMutableDictionary(
|
| + prefs::kGeolocationContentSettings);
|
| + all_settings_dictionary->RemoveWithoutPathExpansion(
|
| + UTF8ToWide(requesting_origin.spec()), NULL);
|
| +}
|
| +
|
| +void GeolocationContentSettingsMap::ResetToDefault() {
|
| + DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
|
| +
|
| + {
|
| + AutoLock auto_lock(lock_);
|
| + default_content_setting_ = kDefaultSetting;
|
| + content_settings_.clear();
|
| + }
|
| +
|
| + PrefService* prefs = profile_->GetPrefs();
|
| + prefs->ClearPref(prefs::kGeolocationDefaultContentSetting);
|
| + prefs->ClearPref(prefs::kGeolocationContentSettings);
|
| +}
|
| +
|
| +GeolocationContentSettingsMap::~GeolocationContentSettingsMap() {
|
| +}
|
| +
|
| +// static
|
| +void GeolocationContentSettingsMap::GetOneOriginSettingsFromDictionary(
|
| + const DictionaryValue* dictionary,
|
| + OneOriginSettings* one_origin_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);
|
| + (*one_origin_settings)[GURL(WideToUTF8(target))] =
|
| + IntToContentSetting(setting);
|
| + }
|
| +}
|
|
|
| Property changes on: chrome/browser/geolocation/geolocation_content_settings_map.cc
|
| ___________________________________________________________________
|
| Added: svn:executable
|
| + *
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|