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