Index: chrome/browser/extensions/settings/setting_sync_data.cc |
diff --git a/chrome/browser/extensions/settings/setting_sync_data.cc b/chrome/browser/extensions/settings/setting_sync_data.cc |
index 68e62876b1709e1078de07fef5376762c6a3a0b3..42a2e40975d8ab0ee4b71f95c37b65acc0e90ea9 100644 |
--- a/chrome/browser/extensions/settings/setting_sync_data.cc |
+++ b/chrome/browser/extensions/settings/setting_sync_data.cc |
@@ -7,7 +7,9 @@ |
#include "base/json/json_reader.h" |
#include "base/json/json_writer.h" |
#include "chrome/browser/sync/api/sync_data.h" |
+#include "chrome/browser/sync/protocol/app_setting_specifics.pb.h" |
#include "chrome/browser/sync/protocol/extension_setting_specifics.pb.h" |
+#include "chrome/browser/sync/protocol/sync.pb.h" |
namespace extensions { |
@@ -24,30 +26,46 @@ SettingSyncData::SettingSyncData( |
void SettingSyncData::Init( |
SyncChange::SyncChangeType change_type, const SyncData& sync_data) { |
DCHECK(!internal_.get()); |
- sync_pb::ExtensionSettingSpecifics specifics = |
- sync_data.GetSpecifics().GetExtension(sync_pb::extension_setting); |
- Value* value = |
- base::JSONReader().JsonToValue(specifics.value(), false, false); |
- if (!value) { |
+ sync_pb::EntitySpecifics specifics = sync_data.GetSpecifics(); |
+ // The data can only be either extension or app specfics. Assert this in |
akalin
2012/02/27 23:42:10
can only be either -> must be either
specfics -> s
not at google - send to devlin
2012/02/27 23:45:46
Done.
|
+ // debug mode. |
+ DCHECK_NE(specifics.HasExtension(sync_pb::extension_setting), |
+ specifics.HasExtension(sync_pb::app_setting)); |
+ if (specifics.HasExtension(sync_pb::extension_setting)) { |
+ InitFromExtensionSettingSpecifics( |
+ change_type, |
+ specifics.GetExtension(sync_pb::extension_setting)); |
+ } else if (specifics.HasExtension(sync_pb::app_setting)) { |
+ InitFromExtensionSettingSpecifics( |
+ change_type, |
+ specifics.GetExtension(sync_pb::app_setting).extension_setting()); |
+ } |
+} |
+ |
+void SettingSyncData::InitFromExtensionSettingSpecifics( |
+ SyncChange::SyncChangeType change_type, |
+ const sync_pb::ExtensionSettingSpecifics& specifics) { |
+ DCHECK(!internal_.get()); |
+ scoped_ptr<Value> value( |
+ base::JSONReader().JsonToValue(specifics.value(), false, false)); |
+ if (!value.get()) { |
LOG(WARNING) << "Specifics for " << specifics.extension_id() << "/" << |
specifics.key() << " had bad JSON for value: " << specifics.value(); |
- value = new DictionaryValue(); |
+ value.reset(new DictionaryValue()); |
} |
internal_ = new Internal( |
change_type, |
specifics.extension_id(), |
specifics.key(), |
- value); |
+ value.Pass()); |
} |
SettingSyncData::SettingSyncData( |
SyncChange::SyncChangeType change_type, |
const std::string& extension_id, |
const std::string& key, |
- Value* value) |
- : internal_(new Internal(change_type, extension_id, key, value)) { |
- CHECK(value); |
-} |
+ scoped_ptr<Value> value) |
+ : internal_(new Internal(change_type, extension_id, key, value.Pass())) {} |
SettingSyncData::~SettingSyncData() {} |
@@ -71,11 +89,13 @@ SettingSyncData::Internal::Internal( |
SyncChange::SyncChangeType change_type, |
const std::string& extension_id, |
const std::string& key, |
- Value* value) |
+ scoped_ptr<Value> value) |
: change_type_(change_type), |
extension_id_(extension_id), |
key_(key), |
- value_(value) {} |
+ value_(value.Pass()) { |
+ DCHECK(value_.get()); |
+} |
SettingSyncData::Internal::~Internal() {} |