Index: components/content_settings/core/browser/content_settings_pref_provider.h |
diff --git a/components/content_settings/core/browser/content_settings_pref_provider.h b/components/content_settings/core/browser/content_settings_pref_provider.h |
index 8c26c4d3e774f4865b82af7b53243f566ef8fd01..ec235a9407d9fe4950dcc4fcdc783cedcedbdb9f 100644 |
--- a/components/content_settings/core/browser/content_settings_pref_provider.h |
+++ b/components/content_settings/core/browser/content_settings_pref_provider.h |
@@ -10,6 +10,7 @@ |
#include <vector> |
#include "base/basictypes.h" |
+#include "base/memory/scoped_vector.h" |
#include "base/prefs/pref_change_registrar.h" |
#include "components/content_settings/core/browser/content_settings_observable_provider.h" |
#include "components/content_settings/core/browser/content_settings_utils.h" |
@@ -70,14 +71,20 @@ class PrefProvider : public ObservableProvider { |
// Gains ownership of |clock|. |
void SetClockForTesting(scoped_ptr<base::Clock> clock); |
- ContentSettingsPref* content_settings_pref() { |
- return content_settings_pref_.get(); |
- } |
- |
private: |
+ friend class DeadlockCheckerThread; // For testing. |
+ |
// Migrate the old media setting into new mic/camera content settings. |
void MigrateObsoleteMediaContentSetting(); |
+ // Migrate the settings from the old aggregate dictionary into the new format. |
+ void MigrateAllExceptions(); |
+ |
+ // Writes the contents of the old aggregate dictionary preferences into |
+ // separate dictionaries for content types. If |syncable_only| is true, |
+ // only syncable content types will be written. |
+ void WriteSettingsToNewPreferences(bool syncable_only); |
+ |
// Weak; owned by the Profile and reset in ShutdownOnUIThread. |
PrefService* prefs_; |
@@ -88,9 +95,56 @@ class PrefProvider : public ObservableProvider { |
PrefChangeRegistrar pref_change_registrar_; |
- scoped_ptr<ContentSettingsPref> content_settings_pref_; |
+ ScopedVector<ContentSettingsPref> content_settings_prefs_; |
DISALLOW_COPY_AND_ASSIGN(PrefProvider); |
+ |
+ bool TestAllLocks() const; |
+ |
+ // All functionality regarding reading and writing of preferences has been |
+ // moved to |ContentSettingsPref|, which manages one content type per |
+ // instance. However, for backward compatibility, we need to be able to write |
+ // to the old and deprecated aggregate dictionary preference which maintains |
+ // all content types. Therefore, |ContentSettingsPrefProvider| must still |
+ // retain some of the functionality of |ContentSettingsPref|. The following |
+ // attributes and methods serve this purpose. |
+ // TODO(msramek): Remove this migration code after two stable releases. |
+ struct ContentSettingsPrefEntry { |
+ ContentSettingsPrefEntry(const ContentSettingsPattern primary_pattern, |
+ const ContentSettingsPattern secondary_pattern, |
+ const ResourceIdentifier resource_identifier, |
+ base::Value* value); |
+ ContentSettingsPrefEntry(const ContentSettingsPrefEntry& entry); |
+ ContentSettingsPrefEntry& operator=(const ContentSettingsPrefEntry& entry); |
+ ~ContentSettingsPrefEntry(); |
+ |
+ ContentSettingsPattern primary_pattern; |
+ ContentSettingsPattern secondary_pattern; |
+ ResourceIdentifier resource_identifier; |
+ scoped_ptr<base::Value> value; |
+ }; |
+ |
+ // Stores exceptions read from the old preference before writing them |
+ // to the new one. |
+ ScopedVector<ContentSettingsPrefEntry> |
+ pref_entry_map_[CONTENT_SETTINGS_NUM_TYPES]; |
+ |
+ // Clears |pref_entry_map_|. |
+ void ClearPrefEntryMap(); |
+ |
+ // Guards access to |pref_entry_map_|. |
+ mutable base::Lock old_lock_; |
+ |
+ // Indicates whether the old preferences are updated. |
+ bool updating_old_preferences_; |
+ |
+ // Called when the old preference changes. |
+ void OnOldContentSettingsPatternPairsChanged(); |
+ |
+ // Reads the old preference and writes it to |pref_entry_map_|. |
+ void ReadContentSettingsFromOldPref(); |
+ |
+ base::ThreadChecker thread_checker_; |
}; |
} // namespace content_settings |