15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file.
45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifndef CHROME_BROWSER_PREFS_PREF_HASH_FILTER_H_
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define CHROME_BROWSER_PREFS_PREF_HASH_FILTER_H_
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <map>
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <set>
10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include <vector>
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/basictypes.h"
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/callback.h"
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/compiler_specific.h"
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/containers/scoped_ptr_hash_map.h"
16f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/prefs/interceptable_pref_filter.h"
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/prefs/tracked/tracked_preference.h"
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class PrefHashStore;
21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class PrefService;
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class PrefStore;
23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class TrackedPreferenceValidationDelegate;
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace base {
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class DictionaryValue;
27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class Time;
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class Value;
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace base
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace user_prefs {
32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class PrefRegistrySyncable;
33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}  // namespace user_prefs
34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Intercepts preference values as they are loaded from disk and verifies them
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// using a PrefHashStore. Keeps the PrefHashStore contents up to date as values
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// are changed.
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class PrefHashFilter : public InterceptablePrefFilter {
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  enum EnforcementLevel {
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    NO_ENFORCEMENT,
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ENFORCE_ON_LOAD
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  };
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  enum PrefTrackingStrategy {
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Atomic preferences are tracked as a whole.
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    TRACKING_STRATEGY_ATOMIC,
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Split preferences are dictionaries for which each top-level entry is
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // tracked independently. Note: preferences using this strategy must be kept
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // in sync with TrackedSplitPreferences in histograms.xml.
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    TRACKING_STRATEGY_SPLIT,
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  };
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  struct TrackedPreferenceMetadata {
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    size_t reporting_id;
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const char* name;
57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EnforcementLevel enforcement_level;
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefTrackingStrategy strategy;
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  };
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Constructs a PrefHashFilter tracking the specified |tracked_preferences|
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // using |pref_hash_store| to check/store hashes. An optional |delegate| is
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // notified of the status of each preference as it is checked.
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // If |on_reset_on_load| is provided, it will be invoked if a reset occurs in
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // FilterOnLoad.
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // |reporting_ids_count| is the count of all possible IDs (possibly greater
67f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // than |tracked_preferences.size()|). If |report_super_mac_validity| is true,
68f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // the state of the super MAC will be reported via UMA during
69f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // FinalizeFilterOnLoad.
70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PrefHashFilter(
71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      scoped_ptr<PrefHashStore> pref_hash_store,
72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      const std::vector<TrackedPreferenceMetadata>& tracked_preferences,
735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      const base::Closure& on_reset_on_load,
74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      TrackedPreferenceValidationDelegate* delegate,
75f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      size_t reporting_ids_count,
76f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      bool report_super_mac_validity);
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual ~PrefHashFilter();
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Registers required user preferences.
81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Retrieves the time of the last reset event, if any, for the provided user
84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // preferences. If no reset has occurred, Returns a null |Time|.
85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  static base::Time GetResetTime(PrefService* user_prefs);
86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Clears the time of the last reset event, if any, for the provided user
88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // preferences.
89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  static void ClearResetTime(PrefService* user_prefs);
90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Initializes the PrefHashStore with hashes of the tracked preferences in
92f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // |pref_store_contents|. |pref_store_contents| will be the |storage| passed
93f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // to PrefHashStore::BeginTransaction().
94f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void Initialize(base::DictionaryValue* pref_store_contents);
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // PrefFilter remaining implementation.
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void FilterUpdate(const std::string& path) OVERRIDE;
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void FilterSerializeData(
99f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      base::DictionaryValue* pref_store_contents) OVERRIDE;
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // InterceptablePrefFilter implementation.
103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void FinalizeFilterOnLoad(
104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      const PostFilterOnLoadCallback& post_filter_on_load_callback,
105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      scoped_ptr<base::DictionaryValue> pref_store_contents,
106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      bool prefs_altered) OVERRIDE;
107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Callback to be invoked only once (and subsequently reset) on the next
109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // FilterOnLoad event. It will be allowed to modify the |prefs| handed to
110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // FilterOnLoad before handing them back to this PrefHashFilter.
111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  FilterOnLoadInterceptor filter_on_load_interceptor_;
112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // A map of paths to TrackedPreferences; this map owns this individual
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // TrackedPreference objects.
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  typedef base::ScopedPtrHashMap<std::string, TrackedPreference>
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      TrackedPreferencesMap;
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // A map from changed paths to their corresponding TrackedPreferences (which
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // aren't owned by this map).
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  typedef std::map<std::string, const TrackedPreference*> ChangedPathsMap;
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<PrefHashStore> pref_hash_store_;
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Invoked if a reset occurs in a call to FilterOnLoad.
1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const base::Closure on_reset_on_load_;
1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TrackedPreferencesMap tracked_paths_;
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The set of all paths whose value has changed since the last call to
1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // FilterSerializeData.
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ChangedPathsMap changed_paths_;
1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
132f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Whether to report the validity of the super MAC at load time (via UMA).
133f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  bool report_super_mac_validity_;
134f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(PrefHashFilter);
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif  // CHROME_BROWSER_PREFS_PREF_HASH_FILTER_H_
139