11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved.
21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be
31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file.
41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/content_settings/content_settings_override_provider.h"
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <string>
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/auto_reset.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/prefs/pref_service.h"
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/prefs/scoped_user_pref_update.h"
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/values.h"
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/content_settings/content_settings_utils.h"
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/common/pref_names.h"
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/content_settings/core/browser/content_settings_rule.h"
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/content_settings/core/common/content_settings.h"
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/content_settings/core/common/content_settings_pattern.h"
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/pref_registry/pref_registry_syncable.h"
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/browser/browser_thread.h"
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciusing content::BrowserThread;
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace content_settings {
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace {
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass OverrideRuleIterator : public RuleIterator {
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public:
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  explicit OverrideRuleIterator(bool is_allowed) : is_done_(is_allowed) {}
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual bool HasNext() const OVERRIDE { return !is_done_; }
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual Rule Next() OVERRIDE {
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    DCHECK(!is_done_);
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    is_done_ = true;
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return Rule(ContentSettingsPattern::Wildcard(),
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                ContentSettingsPattern::Wildcard(),
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                new base::FundamentalValue(CONTENT_SETTING_BLOCK));
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private:
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool is_done_;
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// static
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid OverrideProvider::RegisterProfilePrefs(
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    user_prefs::PrefRegistrySyncable* registry) {
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  registry->RegisterDictionaryPref(
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      prefs::kOverrideContentSettings,
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciOverrideProvider::OverrideProvider(PrefService* prefs, bool incognito)
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : prefs_(prefs), is_incognito_(incognito) {
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(prefs_);
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Read global overrides.
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ReadOverrideSettings();
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciOverrideProvider::~OverrideProvider() {
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciRuleIterator* OverrideProvider::GetRuleIterator(
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ContentSettingsType content_type,
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const ResourceIdentifier& resource_identifier,
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    bool incognito) const {
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::AutoLock lock(lock_);
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (resource_identifier.empty()) {
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return new OverrideRuleIterator(allowed_settings_[content_type]);
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return new EmptyRuleIterator();
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid OverrideProvider::ClearAllContentSettingsRules(
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ContentSettingsType content_type) {
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool OverrideProvider::SetWebsiteSetting(
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const ContentSettingsPattern& primary_pattern,
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const ContentSettingsPattern& secondary_pattern,
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ContentSettingsType content_type,
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const ResourceIdentifier& resource_identifier,
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    base::Value* in_value) {
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return false;
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid OverrideProvider::ShutdownOnUIThread() {
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(prefs_);
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  prefs_ = NULL;
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid OverrideProvider::SetOverrideSetting(ContentSettingsType content_type,
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                          bool enabled) {
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK_CURRENTLY_ON(BrowserThread::UI);
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(prefs_);
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Disallow incognito to change the state.
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(!is_incognito_);
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::AutoLock lock(lock_);
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DictionaryPrefUpdate update(prefs_, prefs::kOverrideContentSettings);
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::DictionaryValue* default_settings_dictionary = update.Get();
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (enabled) {
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    allowed_settings_[content_type] = true;
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    default_settings_dictionary->RemoveWithoutPathExpansion(
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        GetTypeName(content_type), NULL);
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  } else {
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    allowed_settings_[content_type] = false;
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    default_settings_dictionary->SetWithoutPathExpansion(
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        GetTypeName(content_type), new base::FundamentalValue(true));
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool OverrideProvider::IsEnabled(ContentSettingsType content_type) const {
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::AutoLock lock(lock_);
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return allowed_settings_[content_type];
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid OverrideProvider::ReadOverrideSettings() {
1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK_CURRENTLY_ON(BrowserThread::UI);
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const base::DictionaryValue* blocked_settings_dictionary =
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      prefs_->GetDictionary(prefs::kOverrideContentSettings);
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (int type = 0; type < CONTENT_SETTINGS_NUM_TYPES; ++type) {
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ContentSettingsType content_setting = ContentSettingsType(type);
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    allowed_settings_[content_setting] =
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        !blocked_settings_dictionary->HasKey(GetTypeName(content_setting));
1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace content_settings
135