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 |
deleted file mode 100644 |
index afcf4abae598eb3d30b9c42b0ec032345f7e0842..0000000000000000000000000000000000000000 |
--- a/chrome/browser/content_settings/content_settings_pref_provider.cc |
+++ /dev/null |
@@ -1,657 +0,0 @@ |
-// Copyright (c) 2012 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/content_settings/content_settings_pref_provider.h" |
- |
-#include <map> |
-#include <string> |
-#include <utility> |
- |
-#include "base/auto_reset.h" |
-#include "base/bind.h" |
-#include "base/command_line.h" |
-#include "base/memory/scoped_ptr.h" |
-#include "base/metrics/histogram.h" |
-#include "base/prefs/pref_service.h" |
-#include "base/prefs/scoped_user_pref_update.h" |
-#include "base/strings/string_split.h" |
-#include "base/time/clock.h" |
-#include "base/time/default_clock.h" |
-#include "chrome/browser/content_settings/content_settings_utils.h" |
-#include "chrome/browser/content_settings/host_content_settings_map.h" |
-#include "chrome/common/pref_names.h" |
-#include "components/content_settings/core/browser/content_settings_rule.h" |
-#include "components/content_settings/core/common/content_settings.h" |
-#include "components/content_settings/core/common/content_settings_pattern.h" |
-#include "components/pref_registry/pref_registry_syncable.h" |
-#include "url/gurl.h" |
- |
-namespace { |
- |
-typedef std::pair<std::string, std::string> StringPair; |
-typedef std::map<std::string, std::string> StringMap; |
- |
-const char kPerPluginPrefName[] = "per_plugin"; |
-const char kAudioKey[] = "audio"; |
-const char kVideoKey[] = "video"; |
-const char kLastUsed[] = "last_used"; |
- |
-ContentSetting FixObsoleteCookiePromptMode(ContentSettingsType content_type, |
- ContentSetting setting) { |
- if (content_type == CONTENT_SETTINGS_TYPE_COOKIES && |
- setting == CONTENT_SETTING_ASK) { |
- return CONTENT_SETTING_BLOCK; |
- } |
- return setting; |
-} |
- |
-// If the given content type supports resource identifiers in user preferences, |
-// returns true and sets |pref_key| to the key in the content settings |
-// dictionary under which per-resource content settings are stored. |
-// Otherwise, returns false. |
-bool GetResourceTypeName(ContentSettingsType content_type, |
- std::string* pref_key) { |
- if (content_type == CONTENT_SETTINGS_TYPE_PLUGINS) { |
- *pref_key = kPerPluginPrefName; |
- return true; |
- } |
- return false; |
-} |
- |
-} // namespace |
- |
-namespace content_settings { |
- |
-// //////////////////////////////////////////////////////////////////////////// |
-// PrefProvider: |
-// |
- |
-// static |
-void PrefProvider::RegisterProfilePrefs( |
- user_prefs::PrefRegistrySyncable* registry) { |
- registry->RegisterIntegerPref( |
- prefs::kContentSettingsVersion, |
- ContentSettingsPattern::kContentSettingsPatternVersion, |
- user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); |
- registry->RegisterDictionaryPref( |
- prefs::kContentSettingsPatternPairs, |
- user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); |
-} |
- |
-PrefProvider::PrefProvider(PrefService* prefs, bool incognito) |
- : prefs_(prefs), |
- clock_(new base::DefaultClock()), |
- is_incognito_(incognito), |
- updating_preferences_(false) { |
- DCHECK(prefs_); |
- // Verify preferences version. |
- if (!prefs_->HasPrefPath(prefs::kContentSettingsVersion)) { |
- prefs_->SetInteger(prefs::kContentSettingsVersion, |
- ContentSettingsPattern::kContentSettingsPatternVersion); |
- } |
- if (prefs_->GetInteger(prefs::kContentSettingsVersion) > |
- ContentSettingsPattern::kContentSettingsPatternVersion) { |
- return; |
- } |
- |
- // Read content settings exceptions. |
- ReadContentSettingsFromPref(false); |
- |
- if (!is_incognito_) { |
- UMA_HISTOGRAM_COUNTS("ContentSettings.NumberOfExceptions", |
- value_map_.size()); |
- } |
- |
- // Migrate the obsolete media content setting exceptions to the new settings. |
- // This needs to be done after ReadContentSettingsFromPref(). |
- if (!is_incognito_) |
- MigrateObsoleteMediaContentSetting(); |
- |
- pref_change_registrar_.Init(prefs_); |
- pref_change_registrar_.Add( |
- prefs::kContentSettingsPatternPairs, |
- base::Bind(&PrefProvider::OnContentSettingsPatternPairsChanged, |
- base::Unretained(this))); |
-} |
- |
-bool PrefProvider::SetWebsiteSetting( |
- const ContentSettingsPattern& primary_pattern, |
- const ContentSettingsPattern& secondary_pattern, |
- ContentSettingsType content_type, |
- const ResourceIdentifier& resource_identifier, |
- base::Value* in_value) { |
- DCHECK(CalledOnValidThread()); |
- DCHECK(prefs_); |
- // Default settings are set using a wildcard pattern for both |
- // |primary_pattern| and |secondary_pattern|. Don't store default settings in |
- // the |PrefProvider|. The |PrefProvider| handles settings for specific |
- // sites/origins defined by the |primary_pattern| and the |secondary_pattern|. |
- // Default settings are handled by the |DefaultProvider|. |
- if (primary_pattern == ContentSettingsPattern::Wildcard() && |
- secondary_pattern == ContentSettingsPattern::Wildcard() && |
- resource_identifier.empty()) { |
- return false; |
- } |
- |
- // At this point take the ownership of the |in_value|. |
- scoped_ptr<base::Value> value(in_value); |
- // Update in memory value map. |
- OriginIdentifierValueMap* map_to_modify = &incognito_value_map_; |
- if (!is_incognito_) |
- map_to_modify = &value_map_; |
- |
- { |
- base::AutoLock auto_lock(lock_); |
- if (value.get()) { |
- map_to_modify->SetValue( |
- primary_pattern, |
- secondary_pattern, |
- content_type, |
- resource_identifier, |
- value->DeepCopy()); |
- } else { |
- map_to_modify->DeleteValue( |
- primary_pattern, |
- secondary_pattern, |
- content_type, |
- resource_identifier); |
- } |
- } |
- // Update the content settings preference. |
- if (!is_incognito_) { |
- UpdatePref(primary_pattern, |
- secondary_pattern, |
- content_type, |
- resource_identifier, |
- value.get()); |
- } |
- |
- NotifyObservers( |
- primary_pattern, secondary_pattern, content_type, resource_identifier); |
- |
- return true; |
-} |
- |
-void PrefProvider::ClearAllContentSettingsRules( |
- ContentSettingsType content_type) { |
- DCHECK(CalledOnValidThread()); |
- DCHECK(prefs_); |
- |
- OriginIdentifierValueMap* map_to_modify = &incognito_value_map_; |
- if (!is_incognito_) |
- map_to_modify = &value_map_; |
- |
- std::vector<Rule> rules_to_delete; |
- { |
- base::AutoLock auto_lock(lock_); |
- scoped_ptr<RuleIterator> rule_iterator( |
- map_to_modify->GetRuleIterator(content_type, std::string(), NULL)); |
- // Copy the rules; we cannot call |UpdatePref| while holding |lock_|. |
- while (rule_iterator->HasNext()) |
- rules_to_delete.push_back(rule_iterator->Next()); |
- |
- map_to_modify->DeleteValues(content_type, std::string()); |
- } |
- |
- for (std::vector<Rule>::const_iterator it = rules_to_delete.begin(); |
- it != rules_to_delete.end(); ++it) { |
- UpdatePref(it->primary_pattern, |
- it->secondary_pattern, |
- content_type, |
- std::string(), |
- NULL); |
- } |
- NotifyObservers(ContentSettingsPattern(), |
- ContentSettingsPattern(), |
- content_type, |
- std::string()); |
-} |
- |
-PrefProvider::~PrefProvider() { |
- DCHECK(!prefs_); |
-} |
- |
-RuleIterator* PrefProvider::GetRuleIterator( |
- ContentSettingsType content_type, |
- const ResourceIdentifier& resource_identifier, |
- bool incognito) const { |
- if (incognito) |
- return incognito_value_map_.GetRuleIterator(content_type, |
- resource_identifier, |
- &lock_); |
- return value_map_.GetRuleIterator(content_type, resource_identifier, &lock_); |
-} |
- |
-// //////////////////////////////////////////////////////////////////////////// |
-// Private |
- |
-void PrefProvider::UpdatePref( |
- const ContentSettingsPattern& primary_pattern, |
- const ContentSettingsPattern& secondary_pattern, |
- ContentSettingsType content_type, |
- const ResourceIdentifier& resource_identifier, |
- const base::Value* value) { |
- // Ensure that |lock_| is not held by this thread, since this function will |
- // send out notifications (by |~DictionaryPrefUpdate|). |
- AssertLockNotHeld(); |
- |
- base::AutoReset<bool> auto_reset(&updating_preferences_, true); |
- { |
- DictionaryPrefUpdate update(prefs_, |
- prefs::kContentSettingsPatternPairs); |
- base::DictionaryValue* pattern_pairs_settings = update.Get(); |
- |
- // Get settings dictionary for the given patterns. |
- std::string pattern_str(CreatePatternString(primary_pattern, |
- secondary_pattern)); |
- base::DictionaryValue* settings_dictionary = NULL; |
- bool found = pattern_pairs_settings->GetDictionaryWithoutPathExpansion( |
- pattern_str, &settings_dictionary); |
- |
- if (!found && value) { |
- settings_dictionary = new base::DictionaryValue; |
- pattern_pairs_settings->SetWithoutPathExpansion( |
- pattern_str, settings_dictionary); |
- } |
- |
- if (settings_dictionary) { |
- std::string res_dictionary_path; |
- if (GetResourceTypeName(content_type, &res_dictionary_path) && |
- !resource_identifier.empty()) { |
- base::DictionaryValue* resource_dictionary = NULL; |
- found = settings_dictionary->GetDictionary( |
- res_dictionary_path, &resource_dictionary); |
- if (!found) { |
- if (value == NULL) |
- return; // Nothing to remove. Exit early. |
- resource_dictionary = new base::DictionaryValue; |
- settings_dictionary->Set(res_dictionary_path, resource_dictionary); |
- } |
- // Update resource dictionary. |
- if (value == NULL) { |
- resource_dictionary->RemoveWithoutPathExpansion(resource_identifier, |
- NULL); |
- if (resource_dictionary->empty()) { |
- settings_dictionary->RemoveWithoutPathExpansion( |
- res_dictionary_path, NULL); |
- } |
- } else { |
- resource_dictionary->SetWithoutPathExpansion( |
- resource_identifier, value->DeepCopy()); |
- } |
- } else { |
- // Update settings dictionary. |
- std::string setting_path = GetTypeName(content_type); |
- if (value == NULL) { |
- settings_dictionary->RemoveWithoutPathExpansion(setting_path, |
- NULL); |
- settings_dictionary->RemoveWithoutPathExpansion(kLastUsed, NULL); |
- } else { |
- settings_dictionary->SetWithoutPathExpansion( |
- setting_path, value->DeepCopy()); |
- } |
- } |
- // Remove the settings dictionary if it is empty. |
- if (settings_dictionary->empty()) { |
- pattern_pairs_settings->RemoveWithoutPathExpansion( |
- pattern_str, NULL); |
- } |
- } |
- } |
-} |
- |
- |
-void PrefProvider::MigrateObsoleteMediaContentSetting() { |
- std::vector<Rule> rules_to_delete; |
- { |
- scoped_ptr<RuleIterator> rule_iterator(GetRuleIterator( |
- CONTENT_SETTINGS_TYPE_MEDIASTREAM, std::string(), false)); |
- while (rule_iterator->HasNext()) { |
- // Skip default setting and rules without a value. |
- const content_settings::Rule& rule = rule_iterator->Next(); |
- DCHECK(rule.primary_pattern != ContentSettingsPattern::Wildcard()); |
- if (!rule.value.get()) |
- continue; |
- rules_to_delete.push_back(rule); |
- } |
- } |
- |
- for (std::vector<Rule>::const_iterator it = rules_to_delete.begin(); |
- it != rules_to_delete.end(); ++it) { |
- const base::DictionaryValue* value_dict = NULL; |
- if (!it->value->GetAsDictionary(&value_dict) || value_dict->empty()) |
- return; |
- |
- std::string audio_device, video_device; |
- value_dict->GetString(kAudioKey, &audio_device); |
- value_dict->GetString(kVideoKey, &video_device); |
- // Add the exception to the new microphone content setting. |
- if (!audio_device.empty()) { |
- SetWebsiteSetting(it->primary_pattern, |
- it->secondary_pattern, |
- CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC, |
- std::string(), |
- new base::FundamentalValue(CONTENT_SETTING_ALLOW)); |
- } |
- // Add the exception to the new camera content setting. |
- if (!video_device.empty()) { |
- SetWebsiteSetting(it->primary_pattern, |
- it->secondary_pattern, |
- CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA, |
- std::string(), |
- new base::FundamentalValue(CONTENT_SETTING_ALLOW)); |
- } |
- |
- // Remove the old exception in CONTENT_SETTINGS_TYPE_MEDIASTREAM. |
- SetWebsiteSetting(it->primary_pattern, |
- it->secondary_pattern, |
- CONTENT_SETTINGS_TYPE_MEDIASTREAM, |
- std::string(), |
- NULL); |
- } |
-} |
- |
-void PrefProvider::ReadContentSettingsFromPref(bool overwrite) { |
- // |DictionaryPrefUpdate| sends out notifications when destructed. This |
- // construction order ensures |AutoLock| gets destroyed first and |lock_| is |
- // not held when the notifications are sent. Also, |auto_reset| must be still |
- // valid when the notifications are sent, so that |Observe| skips the |
- // notification. |
- base::AutoReset<bool> auto_reset(&updating_preferences_, true); |
- DictionaryPrefUpdate update(prefs_, prefs::kContentSettingsPatternPairs); |
- base::AutoLock auto_lock(lock_); |
- |
- const base::DictionaryValue* all_settings_dictionary = |
- prefs_->GetDictionary(prefs::kContentSettingsPatternPairs); |
- |
- if (overwrite) |
- value_map_.clear(); |
- |
- // Careful: The returned value could be NULL if the pref has never been set. |
- if (!all_settings_dictionary) |
- return; |
- |
- base::DictionaryValue* mutable_settings; |
- scoped_ptr<base::DictionaryValue> mutable_settings_scope; |
- |
- if (!is_incognito_) { |
- mutable_settings = update.Get(); |
- } else { |
- // Create copy as we do not want to persist anything in OTR prefs. |
- mutable_settings = all_settings_dictionary->DeepCopy(); |
- mutable_settings_scope.reset(mutable_settings); |
- } |
- // Convert all Unicode patterns into punycode form, then read. |
- CanonicalizeContentSettingsExceptions(mutable_settings); |
- |
- size_t cookies_block_exception_count = 0; |
- size_t cookies_allow_exception_count = 0; |
- size_t cookies_session_only_exception_count = 0; |
- for (base::DictionaryValue::Iterator i(*mutable_settings); !i.IsAtEnd(); |
- i.Advance()) { |
- const std::string& pattern_str(i.key()); |
- std::pair<ContentSettingsPattern, ContentSettingsPattern> pattern_pair = |
- ParsePatternString(pattern_str); |
- if (!pattern_pair.first.IsValid() || |
- !pattern_pair.second.IsValid()) { |
- // TODO: Change this to DFATAL when crbug.com/132659 is fixed. |
- LOG(ERROR) << "Invalid pattern strings: " << pattern_str; |
- continue; |
- } |
- |
- // Get settings dictionary for the current pattern string, and read |
- // settings from the dictionary. |
- const base::DictionaryValue* settings_dictionary = NULL; |
- bool is_dictionary = i.value().GetAsDictionary(&settings_dictionary); |
- DCHECK(is_dictionary); |
- |
- for (size_t i = 0; i < CONTENT_SETTINGS_NUM_TYPES; ++i) { |
- ContentSettingsType content_type = static_cast<ContentSettingsType>(i); |
- |
- std::string res_dictionary_path; |
- if (GetResourceTypeName(content_type, &res_dictionary_path)) { |
- const base::DictionaryValue* resource_dictionary = NULL; |
- if (settings_dictionary->GetDictionary( |
- res_dictionary_path, &resource_dictionary)) { |
- for (base::DictionaryValue::Iterator j(*resource_dictionary); |
- !j.IsAtEnd(); |
- j.Advance()) { |
- const std::string& resource_identifier(j.key()); |
- int setting = CONTENT_SETTING_DEFAULT; |
- bool is_integer = j.value().GetAsInteger(&setting); |
- DCHECK(is_integer); |
- DCHECK_NE(CONTENT_SETTING_DEFAULT, setting); |
- value_map_.SetValue(pattern_pair.first, |
- pattern_pair.second, |
- content_type, |
- resource_identifier, |
- new base::FundamentalValue(setting)); |
- } |
- } |
- } |
- base::Value* value = NULL; |
- if (HostContentSettingsMap::ContentTypeHasCompoundValue(content_type)) { |
- const base::DictionaryValue* setting = NULL; |
- // TODO(xians): Handle the non-dictionary types. |
- if (settings_dictionary->GetDictionaryWithoutPathExpansion( |
- GetTypeName(ContentSettingsType(i)), &setting)) { |
- DCHECK(!setting->empty()); |
- value = setting->DeepCopy(); |
- } |
- } else { |
- int setting = CONTENT_SETTING_DEFAULT; |
- if (settings_dictionary->GetIntegerWithoutPathExpansion( |
- GetTypeName(ContentSettingsType(i)), &setting)) { |
- DCHECK_NE(CONTENT_SETTING_DEFAULT, setting); |
- setting = FixObsoleteCookiePromptMode(content_type, |
- ContentSetting(setting)); |
- value = new base::FundamentalValue(setting); |
- } |
- } |
- |
- // |value_map_| will take the ownership of |value|. |
- if (value != NULL) { |
- value_map_.SetValue(pattern_pair.first, |
- pattern_pair.second, |
- content_type, |
- ResourceIdentifier(), |
- value); |
- if (content_type == CONTENT_SETTINGS_TYPE_COOKIES) { |
- ContentSetting s = ValueToContentSetting(value); |
- switch (s) { |
- case CONTENT_SETTING_ALLOW : |
- ++cookies_allow_exception_count; |
- break; |
- case CONTENT_SETTING_BLOCK : |
- ++cookies_block_exception_count; |
- break; |
- case CONTENT_SETTING_SESSION_ONLY : |
- ++cookies_session_only_exception_count; |
- break; |
- default: |
- NOTREACHED(); |
- break; |
- } |
- } |
- } |
- } |
- } |
- UMA_HISTOGRAM_COUNTS("ContentSettings.NumberOfBlockCookiesExceptions", |
- cookies_block_exception_count); |
- UMA_HISTOGRAM_COUNTS("ContentSettings.NumberOfAllowCookiesExceptions", |
- cookies_allow_exception_count); |
- UMA_HISTOGRAM_COUNTS("ContentSettings.NumberOfSessionOnlyCookiesExceptions", |
- cookies_session_only_exception_count); |
-} |
- |
-void PrefProvider::OnContentSettingsPatternPairsChanged() { |
- DCHECK(CalledOnValidThread()); |
- |
- if (updating_preferences_) |
- return; |
- |
- ReadContentSettingsFromPref(true); |
- |
- NotifyObservers(ContentSettingsPattern(), |
- ContentSettingsPattern(), |
- CONTENT_SETTINGS_TYPE_DEFAULT, |
- std::string()); |
-} |
- |
-// static |
-void PrefProvider::CanonicalizeContentSettingsExceptions( |
- base::DictionaryValue* all_settings_dictionary) { |
- DCHECK(all_settings_dictionary); |
- |
- std::vector<std::string> remove_items; |
- base::StringPairs move_items; |
- for (base::DictionaryValue::Iterator i(*all_settings_dictionary); |
- !i.IsAtEnd(); |
- i.Advance()) { |
- const std::string& pattern_str(i.key()); |
- std::pair<ContentSettingsPattern, ContentSettingsPattern> pattern_pair = |
- ParsePatternString(pattern_str); |
- if (!pattern_pair.first.IsValid() || |
- !pattern_pair.second.IsValid()) { |
- LOG(ERROR) << "Invalid pattern strings: " << pattern_str; |
- continue; |
- } |
- |
- const std::string canonicalized_pattern_str = CreatePatternString( |
- pattern_pair.first, pattern_pair.second); |
- |
- if (canonicalized_pattern_str.empty() || |
- canonicalized_pattern_str == pattern_str) { |
- continue; |
- } |
- |
- // Clear old pattern if prefs already have canonicalized pattern. |
- const base::DictionaryValue* new_pattern_settings_dictionary = NULL; |
- if (all_settings_dictionary->GetDictionaryWithoutPathExpansion( |
- canonicalized_pattern_str, &new_pattern_settings_dictionary)) { |
- remove_items.push_back(pattern_str); |
- continue; |
- } |
- |
- // Move old pattern to canonicalized pattern. |
- const base::DictionaryValue* old_pattern_settings_dictionary = NULL; |
- if (i.value().GetAsDictionary(&old_pattern_settings_dictionary)) { |
- move_items.push_back( |
- std::make_pair(pattern_str, canonicalized_pattern_str)); |
- } |
- } |
- |
- for (size_t i = 0; i < remove_items.size(); ++i) { |
- all_settings_dictionary->RemoveWithoutPathExpansion(remove_items[i], NULL); |
- } |
- |
- for (size_t i = 0; i < move_items.size(); ++i) { |
- scoped_ptr<base::Value> pattern_settings_dictionary; |
- all_settings_dictionary->RemoveWithoutPathExpansion( |
- move_items[i].first, &pattern_settings_dictionary); |
- all_settings_dictionary->SetWithoutPathExpansion( |
- move_items[i].second, pattern_settings_dictionary.release()); |
- } |
-} |
- |
-void PrefProvider::ShutdownOnUIThread() { |
- DCHECK(CalledOnValidThread()); |
- DCHECK(prefs_); |
- RemoveAllObservers(); |
- pref_change_registrar_.RemoveAll(); |
- prefs_ = NULL; |
-} |
- |
-void PrefProvider::UpdateLastUsage( |
- const ContentSettingsPattern& primary_pattern, |
- const ContentSettingsPattern& secondary_pattern, |
- ContentSettingsType content_type) { |
- // Don't write if in incognito. |
- if (is_incognito_) { |
- return; |
- } |
- |
- // Ensure that |lock_| is not held by this thread, since this function will |
- // send out notifications (by |~DictionaryPrefUpdate|). |
- AssertLockNotHeld(); |
- |
- base::AutoReset<bool> auto_reset(&updating_preferences_, true); |
- { |
- DictionaryPrefUpdate update(prefs_, prefs::kContentSettingsPatternPairs); |
- base::DictionaryValue* pattern_pairs_settings = update.Get(); |
- |
- std::string pattern_str( |
- CreatePatternString(primary_pattern, secondary_pattern)); |
- base::DictionaryValue* settings_dictionary = NULL; |
- bool found = pattern_pairs_settings->GetDictionaryWithoutPathExpansion( |
- pattern_str, &settings_dictionary); |
- |
- if (!found) { |
- settings_dictionary = new base::DictionaryValue; |
- pattern_pairs_settings->SetWithoutPathExpansion(pattern_str, |
- settings_dictionary); |
- } |
- |
- base::DictionaryValue* last_used_dictionary = NULL; |
- found = settings_dictionary->GetDictionaryWithoutPathExpansion( |
- kLastUsed, &last_used_dictionary); |
- |
- if (!found) { |
- last_used_dictionary = new base::DictionaryValue; |
- settings_dictionary->SetWithoutPathExpansion(kLastUsed, |
- last_used_dictionary); |
- } |
- |
- std::string settings_path = GetTypeName(content_type); |
- last_used_dictionary->Set( |
- settings_path, new base::FundamentalValue(clock_->Now().ToDoubleT())); |
- } |
-} |
- |
-base::Time PrefProvider::GetLastUsage( |
- const ContentSettingsPattern& primary_pattern, |
- const ContentSettingsPattern& secondary_pattern, |
- ContentSettingsType content_type) { |
- const base::DictionaryValue* pattern_pairs_settings = |
- prefs_->GetDictionary(prefs::kContentSettingsPatternPairs); |
- std::string pattern_str( |
- CreatePatternString(primary_pattern, secondary_pattern)); |
- |
- const base::DictionaryValue* settings_dictionary = NULL; |
- bool found = pattern_pairs_settings->GetDictionaryWithoutPathExpansion( |
- pattern_str, &settings_dictionary); |
- |
- if (!found) |
- return base::Time(); |
- |
- const base::DictionaryValue* last_used_dictionary = NULL; |
- found = settings_dictionary->GetDictionaryWithoutPathExpansion( |
- kLastUsed, &last_used_dictionary); |
- |
- if (!found) |
- return base::Time(); |
- |
- double last_used_time; |
- found = last_used_dictionary->GetDoubleWithoutPathExpansion( |
- GetTypeName(content_type), &last_used_time); |
- |
- if (!found) |
- return base::Time(); |
- |
- return base::Time::FromDoubleT(last_used_time); |
-} |
- |
-void PrefProvider::AssertLockNotHeld() const { |
-#if !defined(NDEBUG) |
- // |Lock::Acquire()| will assert if the lock is held by this thread. |
- lock_.Acquire(); |
- lock_.Release(); |
-#endif |
-} |
- |
-void PrefProvider::SetClockForTesting(scoped_ptr<base::Clock> clock) { |
- clock_ = clock.Pass(); |
-} |
- |
-} // namespace content_settings |