15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/content_settings_default_provider.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/auto_reset.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/histogram.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h" 151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/prefs/scoped_user_pref_update.h" 167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/content_settings_utils.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h" 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/content_settings/core/browser/content_settings_rule.h" 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/content_settings/core/common/content_settings.h" 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/content_settings/core/common/content_settings_pattern.h" 22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/pref_registry/pref_registry_syncable.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_details.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_source.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/user_metrics.h" 27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::UserMetricsAction; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The default setting for each content type. 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const ContentSetting kDefaultSettings[] = { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_SETTING_ALLOW, // CONTENT_SETTINGS_TYPE_COOKIES 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_SETTING_ALLOW, // CONTENT_SETTINGS_TYPE_IMAGES 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_SETTING_ALLOW, // CONTENT_SETTINGS_TYPE_JAVASCRIPT 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_SETTING_ALLOW, // CONTENT_SETTINGS_TYPE_PLUGINS 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_SETTING_BLOCK, // CONTENT_SETTINGS_TYPE_POPUPS 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_SETTING_ASK, // CONTENT_SETTINGS_TYPE_GEOLOCATION 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_SETTING_ASK, // CONTENT_SETTINGS_TYPE_NOTIFICATIONS 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_SETTING_DEFAULT, // CONTENT_SETTINGS_TYPE_AUTO_SELECT_CERTIFICATE 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_SETTING_ASK, // CONTENT_SETTINGS_TYPE_FULLSCREEN 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_SETTING_ASK, // CONTENT_SETTINGS_TYPE_MOUSELOCK 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_SETTING_DEFAULT, // CONTENT_SETTINGS_TYPE_MIXEDSCRIPT 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_SETTING_ASK, // CONTENT_SETTINGS_TYPE_MEDIASTREAM 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CONTENT_SETTING_ASK, // CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CONTENT_SETTING_ASK, // CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_SETTING_DEFAULT, // CONTENT_SETTINGS_TYPE_PROTOCOL_HANDLERS 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_SETTING_ASK, // CONTENT_SETTINGS_TYPE_PPAPI_BROKER 527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CONTENT_SETTING_ASK, // CONTENT_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS 53558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch CONTENT_SETTING_ASK, // CONTENT_SETTINGS_TYPE_MIDI_SYSEX 54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CONTENT_SETTING_ASK, // CONTENT_SETTINGS_TYPE_PUSH_MESSAGING 555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CONTENT_SETTING_ALLOW, // CONTENT_SETTINGS_TYPE_SSL_CERT_DECISIONS 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CONTENT_SETTING_ASK, // CONTENT_SETTINGS_TYPE_METRO_SWITCH_TO_DESKTOP 580f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#elif defined(OS_ANDROID) || defined(OS_CHROMEOS) 5968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) CONTENT_SETTING_ASK, // CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_ANDROID) 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CONTENT_SETTING_DEFAULT, // CONTENT_SETTINGS_TYPE_APP_BANNER 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(arraysize(kDefaultSettings) == CONTENT_SETTINGS_NUM_TYPES, 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_settings_incorrect_size); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content_settings { 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DefaultRuleIterator : public RuleIterator { 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit DefaultRuleIterator(const base::Value* value) { 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (value) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value_.reset(value->DeepCopy()); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool HasNext() const OVERRIDE { 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value_.get() != NULL; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual Rule Next() OVERRIDE { 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(value_.get()); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Rule(ContentSettingsPattern::Wildcard(), 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContentSettingsPattern::Wildcard(), 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value_.release()); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> value_; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid DefaultProvider::RegisterProfilePrefs( 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) user_prefs::PrefRegistrySyncable* registry) { 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The registration of the preference prefs::kDefaultContentSettings should 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // also include the default values for default content settings. This allows 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // functional tests to get default content settings by reading the preference 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // prefs::kDefaultContentSettings via pyauto. 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(markusheintz): Write pyauto hooks for the content settings map as 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // content settings should be read from the host content settings map. 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DictionaryValue* default_content_settings = new base::DictionaryValue(); 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) registry->RegisterDictionaryPref( 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) prefs::kDefaultContentSettings, 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) default_content_settings, 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DefaultProvider::DefaultProvider(PrefService* prefs, bool incognito) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : prefs_(prefs), 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_incognito_(incognito), 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) updating_preferences_(false) { 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(prefs_); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Read global defaults. 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReadDefaultSettings(true); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_ENUMERATION( 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ContentSettings.DefaultCookiesSetting", 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValueToContentSetting( 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_settings_[CONTENT_SETTINGS_TYPE_COOKIES].get()), 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_SETTING_NUM_SETTINGS); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_ENUMERATION( 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ContentSettings.DefaultImagesSetting", 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValueToContentSetting( 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_settings_[CONTENT_SETTINGS_TYPE_IMAGES].get()), 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_SETTING_NUM_SETTINGS); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_ENUMERATION( 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ContentSettings.DefaultJavaScriptSetting", 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValueToContentSetting( 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_settings_[CONTENT_SETTINGS_TYPE_JAVASCRIPT].get()), 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_SETTING_NUM_SETTINGS); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_ENUMERATION( 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ContentSettings.DefaultPluginsSetting", 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValueToContentSetting( 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_settings_[CONTENT_SETTINGS_TYPE_PLUGINS].get()), 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_SETTING_NUM_SETTINGS); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_ENUMERATION( 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ContentSettings.DefaultPopupsSetting", 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValueToContentSetting( 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_settings_[CONTENT_SETTINGS_TYPE_POPUPS].get()), 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_SETTING_NUM_SETTINGS); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_ENUMERATION( 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ContentSettings.DefaultLocationSetting", 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValueToContentSetting( 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_settings_[CONTENT_SETTINGS_TYPE_GEOLOCATION].get()), 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_SETTING_NUM_SETTINGS); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_ENUMERATION( 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ContentSettings.DefaultNotificationsSetting", 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValueToContentSetting( 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_settings_[CONTENT_SETTINGS_TYPE_NOTIFICATIONS].get()), 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_SETTING_NUM_SETTINGS); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_ENUMERATION( 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ContentSettings.DefaultMouseCursorSetting", 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValueToContentSetting( 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_settings_[CONTENT_SETTINGS_TYPE_MOUSELOCK].get()), 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_SETTING_NUM_SETTINGS); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_ENUMERATION( 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ContentSettings.DefaultMediaStreamSetting", 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValueToContentSetting( 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_settings_[CONTENT_SETTINGS_TYPE_MEDIASTREAM].get()), 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_SETTING_NUM_SETTINGS); 168558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch UMA_HISTOGRAM_ENUMERATION( 169558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch "ContentSettings.DefaultMIDISysExSetting", 170558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ValueToContentSetting( 171558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch default_settings_[CONTENT_SETTINGS_TYPE_MIDI_SYSEX].get()), 172558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch CONTENT_SETTING_NUM_SETTINGS); 173116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch UMA_HISTOGRAM_ENUMERATION( 174116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch "ContentSettings.DefaultPushMessagingSetting", 175116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ValueToContentSetting( 176116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch default_settings_[CONTENT_SETTINGS_TYPE_PUSH_MESSAGING].get()), 177116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CONTENT_SETTING_NUM_SETTINGS); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pref_change_registrar_.Init(prefs_); 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrefChangeRegistrar::NamedChangeCallback callback = base::Bind( 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &DefaultProvider::OnPreferenceChanged, base::Unretained(this)); 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pref_change_registrar_.Add(prefs::kDefaultContentSettings, callback); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DefaultProvider::~DefaultProvider() { 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DefaultProvider::SetWebsiteSetting( 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ContentSettingsPattern& primary_pattern, 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ContentSettingsPattern& secondary_pattern, 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContentSettingsType content_type, 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ResourceIdentifier& resource_identifier, 1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Value* in_value) { 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(prefs_); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ignore non default settings 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (primary_pattern != ContentSettingsPattern::Wildcard() || 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) secondary_pattern != ContentSettingsPattern::Wildcard()) { 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The default settings may not be directly modified for OTR sessions. 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Instead, they are synced to the main profile's setting. 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_incognito_) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Put |in_value| in a scoped pointer to ensure that it gets cleaned up 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // properly if we don't pass on the ownership. 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Value> value(in_value); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::AutoReset<bool> auto_reset(&updating_preferences_, true); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |DefaultProvider| should not send any notifications when holding 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |lock_|. |DictionaryPrefUpdate| destructor and 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |PrefService::SetInteger()| send out notifications. As a response, the 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // upper layers may call |GetAllContentSettingRules| which acquires |lock_| 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // again. 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryPrefUpdate update(prefs_, prefs::kDefaultContentSettings); 2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DictionaryValue* default_settings_dictionary = update.Get(); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::AutoLock lock(lock_); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (value.get() == NULL || 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValueToContentSetting(value.get()) == kDefaultSettings[content_type]) { 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If |value| is NULL we need to reset the default setting the the 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // hardcoded default. 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_settings_[content_type].reset( 2275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) new base::FundamentalValue(kDefaultSettings[content_type])); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remove the corresponding pref entry since the hardcoded default value 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is used. 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_settings_dictionary->RemoveWithoutPathExpansion( 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetTypeName(content_type), NULL); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_settings_[content_type].reset(value->DeepCopy()); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Transfer ownership of |value| to the |default_settings_dictionary|. 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_settings_dictionary->SetWithoutPathExpansion( 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetTypeName(content_type), value.release()); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyObservers(ContentSettingsPattern(), 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContentSettingsPattern(), 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_type, 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string()); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RuleIterator* DefaultProvider::GetRuleIterator( 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContentSettingsType content_type, 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ResourceIdentifier& resource_identifier, 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool incognito) const { 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::AutoLock lock(lock_); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (resource_identifier.empty()) { 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ValueMap::const_iterator it(default_settings_.find(content_type)); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (it != default_settings_.end()) { 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new DefaultRuleIterator(it->second.get()); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new EmptyRuleIterator(); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DefaultProvider::ClearAllContentSettingsRules( 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContentSettingsType content_type) { 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(markusheintz): This method is only called when the 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |DesktopNotificationService| calls |ClearAllSettingsForType| method on the 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |HostContentSettingsMap|. Don't implement this method yet, otherwise the 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // default notification settings will be cleared as well. 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DefaultProvider::ShutdownOnUIThread() { 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(prefs_); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RemoveAllObservers(); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pref_change_registrar_.RemoveAll(); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs_ = NULL; 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DefaultProvider::OnPreferenceChanged(const std::string& name) { 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (updating_preferences_) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (name == prefs::kDefaultContentSettings) { 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReadDefaultSettings(true); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Unexpected preference observed"; 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifyObservers(ContentSettingsPattern(), 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContentSettingsPattern(), 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_SETTINGS_TYPE_DEFAULT, 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string()); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DefaultProvider::ReadDefaultSettings(bool overwrite) { 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::AutoLock lock(lock_); 3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::DictionaryValue* default_settings_dictionary = 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs_->GetDictionary(prefs::kDefaultContentSettings); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (overwrite) 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_settings_.clear(); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Careful: The returned value could be NULL if the pref has never been set. 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (default_settings_dictionary) 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetSettingsFromDictionary(default_settings_dictionary); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ForceDefaultsToBeExplicit(); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DefaultProvider::ForceDefaultsToBeExplicit() { 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < CONTENT_SETTINGS_NUM_TYPES; ++i) { 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContentSettingsType type = ContentSettingsType(i); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!default_settings_[type].get() && 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kDefaultSettings[i] != CONTENT_SETTING_DEFAULT) { 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_settings_[type].reset( 3195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) new base::FundamentalValue(kDefaultSettings[i])); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DefaultProvider::GetSettingsFromDictionary( 3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::DictionaryValue* dictionary) { 3265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (base::DictionaryValue::Iterator i(*dictionary); 3275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) !i.IsAtEnd(); i.Advance()) { 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& content_type(i.key()); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t type = 0; type < CONTENT_SETTINGS_NUM_TYPES; ++type) { 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (content_type == GetTypeName(ContentSettingsType(type))) { 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int int_value = CONTENT_SETTING_DEFAULT; 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool is_integer = i.value().GetAsInteger(&int_value); 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(is_integer); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_settings_[ContentSettingsType(type)].reset( 3355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) new base::FundamentalValue(int_value)); 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Migrate obsolete cookie prompt mode. 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ValueToContentSetting( 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_settings_[CONTENT_SETTINGS_TYPE_COOKIES].get()) == 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_SETTING_ASK) { 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_settings_[CONTENT_SETTINGS_TYPE_COOKIES].reset( 3455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) new base::FundamentalValue(CONTENT_SETTING_BLOCK)); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content_settings 350