| 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..d3041f4d16d8140bbfbb2f7f19e58148427c6041 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,45 @@ 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 must only be either extension or app specfics.
|
| + 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 +88,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() {}
|
|
|
|
|