Home | History | Annotate | Download | only in content_settings
      1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CHROME_BROWSER_CONTENT_SETTINGS_CONTENT_SETTINGS_POLICY_PROVIDER_H_
      6 #define CHROME_BROWSER_CONTENT_SETTINGS_CONTENT_SETTINGS_POLICY_PROVIDER_H_
      7 #pragma once
      8 
      9 // A content settings provider that takes its settings out of policies.
     10 
     11 #include <vector>
     12 
     13 #include "base/basictypes.h"
     14 #include "base/synchronization/lock.h"
     15 #include "base/tuple.h"
     16 #include "chrome/browser/content_settings/content_settings_base_provider.h"
     17 #include "chrome/browser/content_settings/content_settings_provider.h"
     18 #include "chrome/browser/prefs/pref_change_registrar.h"
     19 #include "content/common/notification_observer.h"
     20 #include "content/common/notification_registrar.h"
     21 
     22 class ContentSettingsDetails;
     23 class DictionaryValue;
     24 class PrefService;
     25 class Profile;
     26 
     27 namespace content_settings {
     28 
     29 class PolicyDefaultProvider : public DefaultProviderInterface,
     30                               public NotificationObserver {
     31  public:
     32   explicit PolicyDefaultProvider(Profile* profile);
     33   virtual ~PolicyDefaultProvider();
     34 
     35   // DefaultContentSettingsProvider implementation.
     36   virtual ContentSetting ProvideDefaultSetting(
     37       ContentSettingsType content_type) const;
     38   virtual void UpdateDefaultSetting(ContentSettingsType content_type,
     39                                     ContentSetting setting);
     40   virtual void ResetToDefaults();
     41   virtual bool DefaultSettingIsManaged(ContentSettingsType content_type) const;
     42 
     43   static void RegisterUserPrefs(PrefService* prefs);
     44 
     45   // NotificationObserver implementation.
     46   virtual void Observe(NotificationType type,
     47                        const NotificationSource& source,
     48                        const NotificationDetails& details);
     49 
     50  private:
     51   // Informs observers that content settings have changed. Make sure that
     52   // |lock_| is not held when calling this, as listeners will usually call one
     53   // of the GetSettings functions in response, which would then lead to a
     54   // mutex deadlock.
     55   void NotifyObservers(const ContentSettingsDetails& details);
     56 
     57   void UnregisterObservers();
     58 
     59   // Reads the policy managed default settings.
     60   void ReadManagedDefaultSettings();
     61 
     62   // Reads the policy controlled default settings for a specific content type.
     63   void UpdateManagedDefaultSetting(ContentSettingsType content_type);
     64 
     65   // Copies of the pref data, so that we can read it on the IO thread.
     66   ContentSettings managed_default_content_settings_;
     67 
     68   Profile* profile_;
     69 
     70   // Whether this settings map is for an OTR session.
     71   bool is_off_the_record_;
     72 
     73   // Used around accesses to the managed_default_content_settings_ object to
     74   // guarantee thread safety.
     75   mutable base::Lock lock_;
     76 
     77   PrefChangeRegistrar pref_change_registrar_;
     78   NotificationRegistrar notification_registrar_;
     79 
     80   DISALLOW_COPY_AND_ASSIGN(PolicyDefaultProvider);
     81 };
     82 
     83 // PolicyProvider that provider managed content-settings.
     84 class PolicyProvider : public BaseProvider,
     85                        public NotificationObserver {
     86  public:
     87   explicit PolicyProvider(Profile* profile);
     88   ~PolicyProvider();
     89   static void RegisterUserPrefs(PrefService* prefs);
     90 
     91   // BaseProvider Implementation
     92   virtual void Init();
     93 
     94   // ProviderInterface Implementation
     95   virtual bool ContentSettingsTypeIsManaged(
     96       ContentSettingsType content_type);
     97 
     98   virtual void SetContentSetting(
     99       const ContentSettingsPattern& requesting_pattern,
    100       const ContentSettingsPattern& embedding_pattern,
    101       ContentSettingsType content_type,
    102       const ResourceIdentifier& resource_identifier,
    103       ContentSetting content_setting);
    104 
    105   virtual ContentSetting GetContentSetting(
    106       const GURL& requesting_url,
    107       const GURL& embedding_url,
    108       ContentSettingsType content_type,
    109       const ResourceIdentifier& resource_identifier) const;
    110 
    111   virtual void ClearAllContentSettingsRules(
    112       ContentSettingsType content_type);
    113 
    114   virtual void ResetToDefaults();
    115 
    116   // NotificationObserver implementation.
    117   virtual void Observe(NotificationType type,
    118                        const NotificationSource& source,
    119                        const NotificationDetails& details);
    120  private:
    121   typedef Tuple5<
    122       ContentSettingsPattern,
    123       ContentSettingsPattern,
    124       ContentSettingsType,
    125       content_settings::ProviderInterface::ResourceIdentifier,
    126       ContentSetting> ContentSettingsRule;
    127 
    128   typedef std::vector<ContentSettingsRule> ContentSettingsRules;
    129 
    130   void ReadManagedContentSettings(bool overwrite);
    131 
    132   void GetContentSettingsFromPreferences(PrefService* prefs,
    133                                          ContentSettingsRules* rules);
    134 
    135   void ReadManagedContentSettingsTypes(
    136       ContentSettingsType content_type);
    137 
    138   void NotifyObservers(const ContentSettingsDetails& details);
    139 
    140   void UnregisterObservers();
    141 
    142   Profile* profile_;
    143 
    144   bool content_type_is_managed_[CONTENT_SETTINGS_NUM_TYPES];
    145 
    146   PrefChangeRegistrar pref_change_registrar_;
    147   NotificationRegistrar notification_registrar_;
    148 
    149   DISALLOW_COPY_AND_ASSIGN(PolicyProvider);
    150 };
    151 
    152 }  // namespace content_settings
    153 
    154 #endif  // CHROME_BROWSER_CONTENT_SETTINGS_CONTENT_SETTINGS_POLICY_PROVIDER_H_
    155