Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(155)

Side by Side Diff: chrome/browser/sync/glue/bookmark_change_processor.cc

Issue 896073002: Prevent Meta Info from being overwritten due to reordering of entries. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/sync/glue/bookmark_change_processor.h" 5 #include "chrome/browser/sync/glue/bookmark_change_processor.h"
6 6
7 #include <map> 7 #include <map>
8 #include <stack> 8 #include <stack>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 826 matching lines...) Expand 10 before | Expand all | Expand 10 after
837 BookmarkChangeProcessor::GetBookmarkMetaInfo( 837 BookmarkChangeProcessor::GetBookmarkMetaInfo(
838 const syncer::BaseNode* sync_node) { 838 const syncer::BaseNode* sync_node) {
839 const sync_pb::BookmarkSpecifics& specifics = 839 const sync_pb::BookmarkSpecifics& specifics =
840 sync_node->GetBookmarkSpecifics(); 840 sync_node->GetBookmarkSpecifics();
841 scoped_ptr<BookmarkNode::MetaInfoMap> meta_info_map( 841 scoped_ptr<BookmarkNode::MetaInfoMap> meta_info_map(
842 new BookmarkNode::MetaInfoMap); 842 new BookmarkNode::MetaInfoMap);
843 for (int i = 0; i < specifics.meta_info_size(); ++i) { 843 for (int i = 0; i < specifics.meta_info_size(); ++i) {
844 (*meta_info_map)[specifics.meta_info(i).key()] = 844 (*meta_info_map)[specifics.meta_info(i).key()] =
845 specifics.meta_info(i).value(); 845 specifics.meta_info(i).value();
846 } 846 }
847 // Verifies that all entries had unique keys.
848 DCHECK(meta_info_map->size() == (size_t)specifics.meta_info_size());
Nicolas Zea 2015/02/04 22:46:21 nit: style guide says to use static_cast (here and
stanisc 2015/02/05 01:40:15 Done.
847 return meta_info_map.Pass(); 849 return meta_info_map.Pass();
848 } 850 }
849 851
850 // static 852 // static
851 void BookmarkChangeProcessor::SetSyncNodeMetaInfo( 853 void BookmarkChangeProcessor::SetSyncNodeMetaInfo(
852 const BookmarkNode* node, 854 const BookmarkNode* node,
853 syncer::WriteNode* sync_node) { 855 syncer::WriteNode* sync_node) {
854 sync_pb::BookmarkSpecifics specifics = sync_node->GetBookmarkSpecifics(); 856 sync_pb::BookmarkSpecifics specifics = sync_node->GetBookmarkSpecifics();
857 const BookmarkNode::MetaInfoMap* meta_info_map = node->GetMetaInfoMap();
858
859 // Compare specifics meta info to node meta info before making the change.
860 // Please note that the original specifics meta info is unordered while
861 // meta_info_map is ordered by key. Setting the meta info blindly into
862 // the specifics might cause an unnecessary change.
863 size_t size = meta_info_map ? meta_info_map->size() : 0;
864 if ((size_t)specifics.meta_info_size() == size) {
865 size_t index = 0;
866 for (; index < size; index++) {
867 const sync_pb::MetaInfo& meta_info = specifics.meta_info(index);
868 BookmarkNode::MetaInfoMap::const_iterator it =
869 meta_info_map->find(meta_info.key());
870 if (it == meta_info_map->end() || it->second != meta_info.value()) {
871 // One of original meta info entries is missing in |meta_info_map| or
872 // different.
873 break;
874 }
875 }
876 if (index == size) {
877 // The original meta info from the sync model is already equivalent to
878 // |meta_info_map|.
879 return;
880 }
881 }
882
883 // Clear and reset meta info in bookmark specifics.
855 specifics.clear_meta_info(); 884 specifics.clear_meta_info();
856 const BookmarkNode::MetaInfoMap* meta_info_map = node->GetMetaInfoMap();
857 if (meta_info_map) { 885 if (meta_info_map) {
858 for (BookmarkNode::MetaInfoMap::const_iterator it = meta_info_map->begin(); 886 for (BookmarkNode::MetaInfoMap::const_iterator it = meta_info_map->begin();
859 it != meta_info_map->end(); ++it) { 887 it != meta_info_map->end(); ++it) {
860 sync_pb::MetaInfo* meta_info = specifics.add_meta_info(); 888 sync_pb::MetaInfo* meta_info = specifics.add_meta_info();
861 meta_info->set_key(it->first); 889 meta_info->set_key(it->first);
862 meta_info->set_value(it->second); 890 meta_info->set_value(it->second);
863 } 891 }
864 } 892 }
893
865 sync_node->SetBookmarkSpecifics(specifics); 894 sync_node->SetBookmarkSpecifics(specifics);
866 } 895 }
867 896
868 // static 897 // static
869 void BookmarkChangeProcessor::ApplyBookmarkFavicon( 898 void BookmarkChangeProcessor::ApplyBookmarkFavicon(
870 const BookmarkNode* bookmark_node, 899 const BookmarkNode* bookmark_node,
871 Profile* profile, 900 Profile* profile,
872 const GURL& icon_url, 901 const GURL& icon_url,
873 const scoped_refptr<base::RefCountedMemory>& bitmap_data) { 902 const scoped_refptr<base::RefCountedMemory>& bitmap_data) {
874 HistoryService* history = HistoryServiceFactory::GetForProfile( 903 HistoryService* history = HistoryServiceFactory::GetForProfile(
(...skipping 30 matching lines...) Expand all
905 updated_specifics.set_icon_url(bookmark_node->icon_url().spec()); 934 updated_specifics.set_icon_url(bookmark_node->icon_url().spec());
906 sync_node->SetBookmarkSpecifics(updated_specifics); 935 sync_node->SetBookmarkSpecifics(updated_specifics);
907 } 936 }
908 } 937 }
909 938
910 bool BookmarkChangeProcessor::CanSyncNode(const BookmarkNode* node) { 939 bool BookmarkChangeProcessor::CanSyncNode(const BookmarkNode* node) {
911 return bookmark_model_->client()->CanSyncNode(node); 940 return bookmark_model_->client()->CanSyncNode(node);
912 } 941 }
913 942
914 } // namespace browser_sync 943 } // namespace browser_sync
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698