Index: components/sync/engine_impl/loopback_server/persistent_unique_client_entity.cc |
diff --git a/components/sync/engine_impl/loopback_server/persistent_unique_client_entity.cc b/components/sync/engine_impl/loopback_server/persistent_unique_client_entity.cc |
index 9a2b8725b17d1d4c877cc6e15c0a33f6ad4df74e..c2bdcf730d09ab3ec9ed6623ef29f6c77211185b 100644 |
--- a/components/sync/engine_impl/loopback_server/persistent_unique_client_entity.cc |
+++ b/components/sync/engine_impl/loopback_server/persistent_unique_client_entity.cc |
@@ -5,6 +5,9 @@ |
#include "components/sync/engine_impl/loopback_server/persistent_unique_client_entity.h" |
#include "base/guid.h" |
+#include "base/rand_util.h" |
+#include "base/strings/string_number_conversions.h" |
+#include "components/sync/base/hash_util.h" |
#include "components/sync/engine_impl/loopback_server/persistent_permanent_entity.h" |
#include "components/sync/protocol/sync.pb.h" |
@@ -31,13 +34,21 @@ PersistentUniqueClientEntity::PersistentUniqueClientEntity( |
PersistentUniqueClientEntity::~PersistentUniqueClientEntity() {} |
// static |
-std::unique_ptr<LoopbackServerEntity> PersistentUniqueClientEntity::Create( |
+std::unique_ptr<LoopbackServerEntity> |
+PersistentUniqueClientEntity::CreateFromEntity( |
const sync_pb::SyncEntity& client_entity) { |
- CHECK(client_entity.has_client_defined_unique_tag()) |
- << "A PersistentUniqueClientEntity must have a client-defined unique " |
- "tag."; |
ModelType model_type = GetModelTypeFromSpecifics(client_entity.specifics()); |
- string id = EffectiveIdForClientTaggedEntity(client_entity); |
+ CHECK_NE(client_entity.has_client_defined_unique_tag(), |
+ syncer::CommitOnlyTypes().Has(model_type)) |
+ << "A UniqueClientEntity should have a client-defined unique tag iff it " |
+ "is not a CommitOnly type."; |
+ // Without model type specific logic for each CommitOnly type, we cannot infer |
+ // a reasonable tag from the specifics. We need uniqueness for how the server |
+ // holds onto all objects, so simply make a new tag from a random number. |
+ string effective_tag = client_entity.has_client_defined_unique_tag() |
+ ? client_entity.client_defined_unique_tag() |
+ : base::Uint64ToString(base::RandUint64()); |
+ string id = LoopbackServerEntity::CreateId(model_type, effective_tag); |
return std::unique_ptr<LoopbackServerEntity>(new PersistentUniqueClientEntity( |
id, model_type, client_entity.version(), client_entity.name(), |
client_entity.client_defined_unique_tag(), client_entity.specifics(), |
@@ -45,11 +56,17 @@ std::unique_ptr<LoopbackServerEntity> PersistentUniqueClientEntity::Create( |
} |
// static |
-std::string PersistentUniqueClientEntity::EffectiveIdForClientTaggedEntity( |
- const sync_pb::SyncEntity& entity) { |
- return LoopbackServerEntity::CreateId( |
- GetModelTypeFromSpecifics(entity.specifics()), |
- entity.client_defined_unique_tag()); |
+std::unique_ptr<LoopbackServerEntity> |
+PersistentUniqueClientEntity::CreateFromEntitySpecifics( |
+ const string& name, |
+ const sync_pb::EntitySpecifics& entity_specifics) { |
+ ModelType model_type = GetModelTypeFromSpecifics(entity_specifics); |
+ string client_defined_unique_tag = GenerateSyncableHash(model_type, name); |
+ string id = |
+ LoopbackServerEntity::CreateId(model_type, client_defined_unique_tag); |
+ return std::unique_ptr<LoopbackServerEntity>(new PersistentUniqueClientEntity( |
+ id, model_type, 0, name, client_defined_unique_tag, entity_specifics, |
+ 1337, 1337)); |
} |
bool PersistentUniqueClientEntity::RequiresParentId() const { |