Index: chrome/browser/sync/glue/bookmark_change_processor.cc |
diff --git a/chrome/browser/sync/glue/bookmark_change_processor.cc b/chrome/browser/sync/glue/bookmark_change_processor.cc |
index 430843d95eab4d50ba8be7e103c9ca4b03081f12..ce9ae91de18d85b762da2e7d1434b3645969fca8 100644 |
--- a/chrome/browser/sync/glue/bookmark_change_processor.cc |
+++ b/chrome/browser/sync/glue/bookmark_change_processor.cc |
@@ -845,6 +845,9 @@ BookmarkChangeProcessor::GetBookmarkMetaInfo( |
(*meta_info_map)[specifics.meta_info(i).key()] = |
specifics.meta_info(i).value(); |
} |
+ // Verifies that all entries had unique keys. |
+ DCHECK_EQ(static_cast<size_t>(specifics.meta_info_size()), |
+ meta_info_map->size()); |
return meta_info_map.Pass(); |
} |
@@ -853,8 +856,34 @@ void BookmarkChangeProcessor::SetSyncNodeMetaInfo( |
const BookmarkNode* node, |
syncer::WriteNode* sync_node) { |
sync_pb::BookmarkSpecifics specifics = sync_node->GetBookmarkSpecifics(); |
- specifics.clear_meta_info(); |
const BookmarkNode::MetaInfoMap* meta_info_map = node->GetMetaInfoMap(); |
+ |
+ // Compare specifics meta info to node meta info before making the change. |
+ // Please note that the original specifics meta info is unordered while |
+ // meta_info_map is ordered by key. Setting the meta info blindly into |
+ // the specifics might cause an unnecessary change. |
+ size_t size = meta_info_map ? meta_info_map->size() : 0; |
+ if (static_cast<size_t>(specifics.meta_info_size()) == size) { |
+ size_t index = 0; |
+ for (; index < size; index++) { |
+ const sync_pb::MetaInfo& meta_info = specifics.meta_info(index); |
+ BookmarkNode::MetaInfoMap::const_iterator it = |
+ meta_info_map->find(meta_info.key()); |
+ if (it == meta_info_map->end() || it->second != meta_info.value()) { |
+ // One of original meta info entries is missing in |meta_info_map| or |
+ // different. |
+ break; |
+ } |
+ } |
+ if (index == size) { |
+ // The original meta info from the sync model is already equivalent to |
+ // |meta_info_map|. |
+ return; |
+ } |
+ } |
+ |
+ // Clear and reset meta info in bookmark specifics. |
+ specifics.clear_meta_info(); |
if (meta_info_map) { |
for (BookmarkNode::MetaInfoMap::const_iterator it = meta_info_map->begin(); |
it != meta_info_map->end(); ++it) { |
@@ -863,6 +892,7 @@ void BookmarkChangeProcessor::SetSyncNodeMetaInfo( |
meta_info->set_value(it->second); |
} |
} |
+ |
sync_node->SetBookmarkSpecifics(specifics); |
} |