15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 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)#ifndef CHROME_BROWSER_CONTENT_SETTINGS_CONTENT_SETTINGS_DEFAULT_PROVIDER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_CONTENT_SETTINGS_CONTENT_SETTINGS_DEFAULT_PROVIDER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/linked_ptr.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_change_registrar.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/lock.h"
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/content_settings/core/browser/content_settings_observable_provider.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrefService;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace user_prefs {
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class PrefRegistrySyncable;
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content_settings {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Provider that provides default content settings based on
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// user prefs. If no default values are set by the user we use the hard coded
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// default values.
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DefaultProvider : public ObservableProvider {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DefaultProvider(PrefService* prefs,
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  bool incognito);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~DefaultProvider();
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ProviderInterface implementations.
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual RuleIterator* GetRuleIterator(
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ContentSettingsType content_type,
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const ResourceIdentifier& resource_identifier,
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool incognito) const OVERRIDE;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool SetWebsiteSetting(
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const ContentSettingsPattern& primary_pattern,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const ContentSettingsPattern& secondary_pattern,
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ContentSettingsType content_type,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const ResourceIdentifier& resource_identifier,
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Value* value) OVERRIDE;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ClearAllContentSettingsRules(
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ContentSettingsType content_type) OVERRIDE;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ShutdownOnUIThread() OVERRIDE;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the fields of |settings| based on the values in |dictionary|.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetSettingsFromDictionary(const base::DictionaryValue* dictionary);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Forces the default settings to be explicitly set instead of themselves
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // being CONTENT_SETTING_DEFAULT.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ForceDefaultsToBeExplicit();
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reads the default settings from the preferences service. If |overwrite| is
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // true and the preference is missing, the local copy will be cleared as well.
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReadDefaultSettings(bool overwrite);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Called on prefs change.
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnPreferenceChanged(const std::string& pref_name);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef linked_ptr<base::Value> ValuePtr;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::map<ContentSettingsType, ValuePtr> ValueMap;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Copies of the pref data, so that we can read it on the IO thread.
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ValueMap default_settings_;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefService* prefs_;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Whether this settings map is for an Incognito session.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_incognito_;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used around accesses to the |default_content_settings_| object to guarantee
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // thread safety.
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mutable base::Lock lock_;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefChangeRegistrar pref_change_registrar_;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Whether we are currently updating preferences, this is used to ignore
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // notifications from the preferences service that we triggered ourself.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool updating_preferences_;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DefaultProvider);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content_settings
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_CONTENT_SETTINGS_CONTENT_SETTINGS_DEFAULT_PROVIDER_H_
96