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