Index: chrome/browser/sync/util/cryptographer.cc |
diff --git a/chrome/browser/sync/util/cryptographer.cc b/chrome/browser/sync/util/cryptographer.cc |
index 24f7851f0da8ce63f750d64b25bb1fd670795da5..9b78901cdfec9a91b6bd730ce0eb204de16d9e51 100644 |
--- a/chrome/browser/sync/util/cryptographer.cc |
+++ b/chrome/browser/sync/util/cryptographer.cc |
@@ -16,6 +16,8 @@ const char kNigoriTag[] = "google_chrome_nigori"; |
// assign the same name to a particular triplet. |
const char kNigoriKeyName[] = "nigori-key"; |
+Cryptographer::Observer::~Observer() {} |
+ |
Cryptographer::Cryptographer() |
: default_nigori_(NULL), |
encrypt_everything_(false) { |
@@ -25,6 +27,14 @@ Cryptographer::Cryptographer() |
Cryptographer::~Cryptographer() {} |
+void Cryptographer::AddObserver(Observer* observer) { |
+ observers_.AddObserver(observer); |
+} |
+ |
+void Cryptographer::RemoveObserver(Observer* observer) { |
+ observers_.RemoveObserver(observer); |
+} |
+ |
void Cryptographer::Bootstrap(const std::string& restored_bootstrap_token) { |
if (is_initialized()) { |
NOTREACHED(); |
@@ -274,45 +284,47 @@ syncable::ModelTypeSet Cryptographer::SensitiveTypes() { |
void Cryptographer::UpdateEncryptedTypesFromNigori( |
const sync_pb::NigoriSpecifics& nigori) { |
- encrypted_types_.clear(); |
if (nigori.encrypt_everything()) { |
set_encrypt_everything(); |
return; |
} |
+ |
+ syncable::ModelTypeSet encrypted_types(SensitiveTypes()); |
if (nigori.encrypt_bookmarks()) |
- encrypted_types_.insert(syncable::BOOKMARKS); |
+ encrypted_types.insert(syncable::BOOKMARKS); |
if (nigori.encrypt_preferences()) |
- encrypted_types_.insert(syncable::PREFERENCES); |
+ encrypted_types.insert(syncable::PREFERENCES); |
if (nigori.encrypt_autofill_profile()) |
- encrypted_types_.insert(syncable::AUTOFILL_PROFILE); |
+ encrypted_types.insert(syncable::AUTOFILL_PROFILE); |
if (nigori.encrypt_autofill()) |
- encrypted_types_.insert(syncable::AUTOFILL); |
+ encrypted_types.insert(syncable::AUTOFILL); |
if (nigori.encrypt_themes()) |
- encrypted_types_.insert(syncable::THEMES); |
+ encrypted_types.insert(syncable::THEMES); |
if (nigori.encrypt_typed_urls()) |
- encrypted_types_.insert(syncable::TYPED_URLS); |
+ encrypted_types.insert(syncable::TYPED_URLS); |
if (nigori.encrypt_extension_settings()) |
- encrypted_types_.insert(syncable::EXTENSION_SETTINGS); |
+ encrypted_types.insert(syncable::EXTENSION_SETTINGS); |
if (nigori.encrypt_extensions()) |
- encrypted_types_.insert(syncable::EXTENSIONS); |
+ encrypted_types.insert(syncable::EXTENSIONS); |
if (nigori.encrypt_search_engines()) |
- encrypted_types_.insert(syncable::SEARCH_ENGINES); |
+ encrypted_types.insert(syncable::SEARCH_ENGINES); |
if (nigori.encrypt_sessions()) |
- encrypted_types_.insert(syncable::SESSIONS); |
+ encrypted_types.insert(syncable::SESSIONS); |
if (nigori.encrypt_apps()) |
- encrypted_types_.insert(syncable::APPS); |
+ encrypted_types.insert(syncable::APPS); |
if (nigori.encrypt_app_notifications()) |
- encrypted_types_.insert(syncable::APP_NOTIFICATIONS); |
+ encrypted_types.insert(syncable::APP_NOTIFICATIONS); |
// Note: the initial version with encryption did not support the |
// encrypt_everything field. If anything more than the sensitive types were |
// encrypted, it meant we were encrypting everything. |
- syncable::ModelTypeSet sensitive_types = SensitiveTypes(); |
- encrypted_types_.insert(sensitive_types.begin(), sensitive_types.end()); |
if (!nigori.has_encrypt_everything() && |
- encrypted_types_.size() > sensitive_types.size()) { |
+ encrypted_types.size() > SensitiveTypes().size()) { |
set_encrypt_everything(); |
+ return; |
} |
+ |
+ SetEncryptedTypes(encrypted_types); |
} |
void Cryptographer::UpdateNigoriFromEncryptedTypes( |
@@ -341,22 +353,45 @@ void Cryptographer::UpdateNigoriFromEncryptedTypes( |
} |
void Cryptographer::set_encrypt_everything() { |
+ if (encrypt_everything_) { |
+ DCHECK(encrypted_types_ == syncable::GetAllRealModelTypes()); |
+ return; |
+ } |
encrypt_everything_ = true; |
+ // Change |encrypted_types_| directly to avoid sending more than one |
+ // notification. |
encrypted_types_ = syncable::GetAllRealModelTypes(); |
+ EmitEncryptedTypesChangedNotification(); |
} |
bool Cryptographer::encrypt_everything() const { |
return encrypt_everything_; |
} |
-void Cryptographer::SetEncryptedTypes(syncable::ModelTypeSet new_types) { |
- encrypted_types_.insert(new_types.begin(), new_types.end()); |
-} |
- |
syncable::ModelTypeSet Cryptographer::GetEncryptedTypes() const { |
return encrypted_types_; |
} |
+void Cryptographer::SetEncryptedTypesForTest( |
+ const syncable::ModelTypeSet& encrypted_types) { |
+ SetEncryptedTypes(encrypted_types); |
+} |
+ |
+void Cryptographer::SetEncryptedTypes( |
+ const syncable::ModelTypeSet& encrypted_types) { |
+ if (encrypted_types_ == encrypted_types) { |
+ return; |
+ } |
+ encrypted_types_ = encrypted_types; |
+ EmitEncryptedTypesChangedNotification(); |
+} |
+ |
+void Cryptographer::EmitEncryptedTypesChangedNotification() { |
+ FOR_EACH_OBSERVER( |
+ Observer, observers_, |
+ OnEncryptedTypesChanged(encrypted_types_, encrypt_everything_)); |
+} |
+ |
void Cryptographer::InstallKeys(const std::string& default_key_name, |
const sync_pb::NigoriKeyBag& bag) { |
int key_size = bag.key_size(); |