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