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

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

Issue 670953006: Componentize HostContentSettingsMap and content settings providers. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: win64 suppress warnings Created 6 years, 2 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_default_provider.cc
diff --git a/chrome/browser/content_settings/content_settings_default_provider.cc b/chrome/browser/content_settings/content_settings_default_provider.cc
deleted file mode 100644
index 4dc313dfe07ac219364c1dd588d2171f2a270092..0000000000000000000000000000000000000000
--- a/chrome/browser/content_settings/content_settings_default_provider.cc
+++ /dev/null
@@ -1,340 +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_default_provider.h"
-
-#include <string>
-#include <vector>
-
-#include "base/auto_reset.h"
-#include "base/basictypes.h"
-#include "base/bind.h"
-#include "base/command_line.h"
-#include "base/metrics/histogram.h"
-#include "base/prefs/pref_service.h"
-#include "base/prefs/scoped_user_pref_update.h"
-#include "chrome/browser/content_settings/content_settings_utils.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 {
-
-// The default setting for each content type.
-const ContentSetting kDefaultSettings[] = {
- CONTENT_SETTING_ALLOW, // CONTENT_SETTINGS_TYPE_COOKIES
- CONTENT_SETTING_ALLOW, // CONTENT_SETTINGS_TYPE_IMAGES
- CONTENT_SETTING_ALLOW, // CONTENT_SETTINGS_TYPE_JAVASCRIPT
- CONTENT_SETTING_ALLOW, // CONTENT_SETTINGS_TYPE_PLUGINS
- CONTENT_SETTING_BLOCK, // CONTENT_SETTINGS_TYPE_POPUPS
- CONTENT_SETTING_ASK, // CONTENT_SETTINGS_TYPE_GEOLOCATION
- CONTENT_SETTING_ASK, // CONTENT_SETTINGS_TYPE_NOTIFICATIONS
- CONTENT_SETTING_DEFAULT, // CONTENT_SETTINGS_TYPE_AUTO_SELECT_CERTIFICATE
- CONTENT_SETTING_ASK, // CONTENT_SETTINGS_TYPE_FULLSCREEN
- CONTENT_SETTING_ASK, // CONTENT_SETTINGS_TYPE_MOUSELOCK
- CONTENT_SETTING_DEFAULT, // CONTENT_SETTINGS_TYPE_MIXEDSCRIPT
- CONTENT_SETTING_ASK, // CONTENT_SETTINGS_TYPE_MEDIASTREAM
- CONTENT_SETTING_ASK, // CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC
- CONTENT_SETTING_ASK, // CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA
- CONTENT_SETTING_DEFAULT, // CONTENT_SETTINGS_TYPE_PROTOCOL_HANDLERS
- CONTENT_SETTING_ASK, // CONTENT_SETTINGS_TYPE_PPAPI_BROKER
- CONTENT_SETTING_ASK, // CONTENT_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS
- CONTENT_SETTING_ASK, // CONTENT_SETTINGS_TYPE_MIDI_SYSEX
- CONTENT_SETTING_ASK, // CONTENT_SETTINGS_TYPE_PUSH_MESSAGING
- CONTENT_SETTING_ALLOW, // CONTENT_SETTINGS_TYPE_SSL_CERT_DECISIONS
-#if defined(OS_WIN)
- CONTENT_SETTING_ASK, // CONTENT_SETTINGS_TYPE_METRO_SWITCH_TO_DESKTOP
-#elif defined(OS_ANDROID) || defined(OS_CHROMEOS)
- CONTENT_SETTING_ASK, // CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER
-#endif
-#if defined(OS_ANDROID)
- CONTENT_SETTING_DEFAULT, // CONTENT_SETTINGS_TYPE_APP_BANNER
-#endif
-};
-COMPILE_ASSERT(arraysize(kDefaultSettings) == CONTENT_SETTINGS_NUM_TYPES,
- default_settings_incorrect_size);
-
-} // namespace
-
-namespace content_settings {
-
-namespace {
-
-class DefaultRuleIterator : public RuleIterator {
- public:
- explicit DefaultRuleIterator(const base::Value* value) {
- if (value)
- value_.reset(value->DeepCopy());
- }
-
- bool HasNext() const override { return value_.get() != NULL; }
-
- Rule Next() override {
- DCHECK(value_.get());
- return Rule(ContentSettingsPattern::Wildcard(),
- ContentSettingsPattern::Wildcard(),
- value_.release());
- }
-
- private:
- scoped_ptr<base::Value> value_;
-};
-
-} // namespace
-
-// static
-void DefaultProvider::RegisterProfilePrefs(
- user_prefs::PrefRegistrySyncable* registry) {
- // The registration of the preference prefs::kDefaultContentSettings should
- // also include the default values for default content settings. This allows
- // functional tests to get default content settings by reading the preference
- // prefs::kDefaultContentSettings via pyauto.
- // TODO(markusheintz): Write pyauto hooks for the content settings map as
- // content settings should be read from the host content settings map.
- base::DictionaryValue* default_content_settings = new base::DictionaryValue();
- registry->RegisterDictionaryPref(
- prefs::kDefaultContentSettings,
- default_content_settings,
- user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
-}
-
-DefaultProvider::DefaultProvider(PrefService* prefs, bool incognito)
- : prefs_(prefs),
- is_incognito_(incognito),
- updating_preferences_(false) {
- DCHECK(prefs_);
-
- // Read global defaults.
- ReadDefaultSettings(true);
-
- UMA_HISTOGRAM_ENUMERATION(
- "ContentSettings.DefaultCookiesSetting",
- ValueToContentSetting(
- default_settings_[CONTENT_SETTINGS_TYPE_COOKIES].get()),
- CONTENT_SETTING_NUM_SETTINGS);
- UMA_HISTOGRAM_ENUMERATION(
- "ContentSettings.DefaultImagesSetting",
- ValueToContentSetting(
- default_settings_[CONTENT_SETTINGS_TYPE_IMAGES].get()),
- CONTENT_SETTING_NUM_SETTINGS);
- UMA_HISTOGRAM_ENUMERATION(
- "ContentSettings.DefaultJavaScriptSetting",
- ValueToContentSetting(
- default_settings_[CONTENT_SETTINGS_TYPE_JAVASCRIPT].get()),
- CONTENT_SETTING_NUM_SETTINGS);
- UMA_HISTOGRAM_ENUMERATION(
- "ContentSettings.DefaultPluginsSetting",
- ValueToContentSetting(
- default_settings_[CONTENT_SETTINGS_TYPE_PLUGINS].get()),
- CONTENT_SETTING_NUM_SETTINGS);
- UMA_HISTOGRAM_ENUMERATION(
- "ContentSettings.DefaultPopupsSetting",
- ValueToContentSetting(
- default_settings_[CONTENT_SETTINGS_TYPE_POPUPS].get()),
- CONTENT_SETTING_NUM_SETTINGS);
- UMA_HISTOGRAM_ENUMERATION(
- "ContentSettings.DefaultLocationSetting",
- ValueToContentSetting(
- default_settings_[CONTENT_SETTINGS_TYPE_GEOLOCATION].get()),
- CONTENT_SETTING_NUM_SETTINGS);
- UMA_HISTOGRAM_ENUMERATION(
- "ContentSettings.DefaultNotificationsSetting",
- ValueToContentSetting(
- default_settings_[CONTENT_SETTINGS_TYPE_NOTIFICATIONS].get()),
- CONTENT_SETTING_NUM_SETTINGS);
- UMA_HISTOGRAM_ENUMERATION(
- "ContentSettings.DefaultMouseCursorSetting",
- ValueToContentSetting(
- default_settings_[CONTENT_SETTINGS_TYPE_MOUSELOCK].get()),
- CONTENT_SETTING_NUM_SETTINGS);
- UMA_HISTOGRAM_ENUMERATION(
- "ContentSettings.DefaultMediaStreamSetting",
- ValueToContentSetting(
- default_settings_[CONTENT_SETTINGS_TYPE_MEDIASTREAM].get()),
- CONTENT_SETTING_NUM_SETTINGS);
- UMA_HISTOGRAM_ENUMERATION(
- "ContentSettings.DefaultMIDISysExSetting",
- ValueToContentSetting(
- default_settings_[CONTENT_SETTINGS_TYPE_MIDI_SYSEX].get()),
- CONTENT_SETTING_NUM_SETTINGS);
- UMA_HISTOGRAM_ENUMERATION(
- "ContentSettings.DefaultPushMessagingSetting",
- ValueToContentSetting(
- default_settings_[CONTENT_SETTINGS_TYPE_PUSH_MESSAGING].get()),
- CONTENT_SETTING_NUM_SETTINGS);
-
- pref_change_registrar_.Init(prefs_);
- PrefChangeRegistrar::NamedChangeCallback callback = base::Bind(
- &DefaultProvider::OnPreferenceChanged, base::Unretained(this));
- pref_change_registrar_.Add(prefs::kDefaultContentSettings, callback);
-}
-
-DefaultProvider::~DefaultProvider() {
-}
-
-bool DefaultProvider::SetWebsiteSetting(
- const ContentSettingsPattern& primary_pattern,
- const ContentSettingsPattern& secondary_pattern,
- ContentSettingsType content_type,
- const ResourceIdentifier& resource_identifier,
- base::Value* in_value) {
- DCHECK(CalledOnValidThread());
- DCHECK(prefs_);
-
- // Ignore non default settings
- if (primary_pattern != ContentSettingsPattern::Wildcard() ||
- secondary_pattern != ContentSettingsPattern::Wildcard()) {
- return false;
- }
-
- // The default settings may not be directly modified for OTR sessions.
- // Instead, they are synced to the main profile's setting.
- if (is_incognito_)
- return false;
-
- // Put |in_value| in a scoped pointer to ensure that it gets cleaned up
- // properly if we don't pass on the ownership.
- scoped_ptr<base::Value> value(in_value);
- {
- base::AutoReset<bool> auto_reset(&updating_preferences_, true);
-
- // |DefaultProvider| should not send any notifications when holding
- // |lock_|. |DictionaryPrefUpdate| destructor and
- // |PrefService::SetInteger()| send out notifications. As a response, the
- // upper layers may call |GetAllContentSettingRules| which acquires |lock_|
- // again.
- DictionaryPrefUpdate update(prefs_, prefs::kDefaultContentSettings);
- base::DictionaryValue* default_settings_dictionary = update.Get();
- base::AutoLock lock(lock_);
- if (value.get() == NULL ||
- ValueToContentSetting(value.get()) == kDefaultSettings[content_type]) {
- // If |value| is NULL we need to reset the default setting the the
- // hardcoded default.
- default_settings_[content_type].reset(
- new base::FundamentalValue(kDefaultSettings[content_type]));
-
- // Remove the corresponding pref entry since the hardcoded default value
- // is used.
- default_settings_dictionary->RemoveWithoutPathExpansion(
- GetTypeName(content_type), NULL);
- } else {
- default_settings_[content_type].reset(value->DeepCopy());
- // Transfer ownership of |value| to the |default_settings_dictionary|.
- default_settings_dictionary->SetWithoutPathExpansion(
- GetTypeName(content_type), value.release());
- }
- }
-
- NotifyObservers(ContentSettingsPattern(),
- ContentSettingsPattern(),
- content_type,
- std::string());
-
- return true;
-}
-
-RuleIterator* DefaultProvider::GetRuleIterator(
- ContentSettingsType content_type,
- const ResourceIdentifier& resource_identifier,
- bool incognito) const {
- base::AutoLock lock(lock_);
- if (resource_identifier.empty()) {
- ValueMap::const_iterator it(default_settings_.find(content_type));
- if (it != default_settings_.end()) {
- return new DefaultRuleIterator(it->second.get());
- }
- NOTREACHED();
- }
- return new EmptyRuleIterator();
-}
-
-void DefaultProvider::ClearAllContentSettingsRules(
- ContentSettingsType content_type) {
- // TODO(markusheintz): This method is only called when the
- // |DesktopNotificationService| calls |ClearAllSettingsForType| method on the
- // |HostContentSettingsMap|. Don't implement this method yet, otherwise the
- // default notification settings will be cleared as well.
-}
-
-void DefaultProvider::ShutdownOnUIThread() {
- DCHECK(CalledOnValidThread());
- DCHECK(prefs_);
- RemoveAllObservers();
- pref_change_registrar_.RemoveAll();
- prefs_ = NULL;
-}
-
-void DefaultProvider::OnPreferenceChanged(const std::string& name) {
- DCHECK(CalledOnValidThread());
- if (updating_preferences_)
- return;
-
- if (name == prefs::kDefaultContentSettings) {
- ReadDefaultSettings(true);
- } else {
- NOTREACHED() << "Unexpected preference observed";
- return;
- }
-
- NotifyObservers(ContentSettingsPattern(),
- ContentSettingsPattern(),
- CONTENT_SETTINGS_TYPE_DEFAULT,
- std::string());
-}
-
-void DefaultProvider::ReadDefaultSettings(bool overwrite) {
- base::AutoLock lock(lock_);
- const base::DictionaryValue* default_settings_dictionary =
- prefs_->GetDictionary(prefs::kDefaultContentSettings);
-
- if (overwrite)
- default_settings_.clear();
-
- // Careful: The returned value could be NULL if the pref has never been set.
- if (default_settings_dictionary)
- GetSettingsFromDictionary(default_settings_dictionary);
-
- ForceDefaultsToBeExplicit();
-}
-
-void DefaultProvider::ForceDefaultsToBeExplicit() {
- for (int i = 0; i < CONTENT_SETTINGS_NUM_TYPES; ++i) {
- ContentSettingsType type = ContentSettingsType(i);
- if (!default_settings_[type].get() &&
- kDefaultSettings[i] != CONTENT_SETTING_DEFAULT) {
- default_settings_[type].reset(
- new base::FundamentalValue(kDefaultSettings[i]));
- }
- }
-}
-
-void DefaultProvider::GetSettingsFromDictionary(
- const base::DictionaryValue* dictionary) {
- for (base::DictionaryValue::Iterator i(*dictionary);
- !i.IsAtEnd(); i.Advance()) {
- const std::string& content_type(i.key());
- for (size_t type = 0; type < CONTENT_SETTINGS_NUM_TYPES; ++type) {
- if (content_type == GetTypeName(ContentSettingsType(type))) {
- int int_value = CONTENT_SETTING_DEFAULT;
- bool is_integer = i.value().GetAsInteger(&int_value);
- DCHECK(is_integer);
- default_settings_[ContentSettingsType(type)].reset(
- new base::FundamentalValue(int_value));
- break;
- }
- }
- }
- // Migrate obsolete cookie prompt mode.
- if (ValueToContentSetting(
- default_settings_[CONTENT_SETTINGS_TYPE_COOKIES].get()) ==
- CONTENT_SETTING_ASK) {
- default_settings_[CONTENT_SETTINGS_TYPE_COOKIES].reset(
- new base::FundamentalValue(CONTENT_SETTING_BLOCK));
- }
-}
-
-} // namespace content_settings

Powered by Google App Engine
This is Rietveld 408576698