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

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: Addressed CR feedback 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
« no previous file with comments | « no previous file | chrome/browser/sync/profile_sync_service_bookmark_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 827 matching lines...) Expand 10 before | Expand all | Expand 10 after
838 BookmarkChangeProcessor::GetBookmarkMetaInfo( 838 BookmarkChangeProcessor::GetBookmarkMetaInfo(
839 const syncer::BaseNode* sync_node) { 839 const syncer::BaseNode* sync_node) {
840 const sync_pb::BookmarkSpecifics& specifics = 840 const sync_pb::BookmarkSpecifics& specifics =
841 sync_node->GetBookmarkSpecifics(); 841 sync_node->GetBookmarkSpecifics();
842 scoped_ptr<BookmarkNode::MetaInfoMap> meta_info_map( 842 scoped_ptr<BookmarkNode::MetaInfoMap> meta_info_map(
843 new BookmarkNode::MetaInfoMap); 843 new BookmarkNode::MetaInfoMap);
844 for (int i = 0; i < specifics.meta_info_size(); ++i) { 844 for (int i = 0; i < specifics.meta_info_size(); ++i) {
845 (*meta_info_map)[specifics.meta_info(i).key()] = 845 (*meta_info_map)[specifics.meta_info(i).key()] =
846 specifics.meta_info(i).value(); 846 specifics.meta_info(i).value();
847 } 847 }
848 // Verifies that all entries had unique keys.
849 DCHECK_EQ(static_cast<size_t>(specifics.meta_info_size()),
850 meta_info_map->size());
848 return meta_info_map.Pass(); 851 return meta_info_map.Pass();
849 } 852 }
850 853
851 // static 854 // static
852 void BookmarkChangeProcessor::SetSyncNodeMetaInfo( 855 void BookmarkChangeProcessor::SetSyncNodeMetaInfo(
853 const BookmarkNode* node, 856 const BookmarkNode* node,
854 syncer::WriteNode* sync_node) { 857 syncer::WriteNode* sync_node) {
855 sync_pb::BookmarkSpecifics specifics = sync_node->GetBookmarkSpecifics(); 858 sync_pb::BookmarkSpecifics specifics = sync_node->GetBookmarkSpecifics();
859 const BookmarkNode::MetaInfoMap* meta_info_map = node->GetMetaInfoMap();
860
861 // Compare specifics meta info to node meta info before making the change.
862 // Please note that the original specifics meta info is unordered while
863 // meta_info_map is ordered by key. Setting the meta info blindly into
864 // the specifics might cause an unnecessary change.
865 size_t size = meta_info_map ? meta_info_map->size() : 0;
866 if (static_cast<size_t>(specifics.meta_info_size()) == size) {
867 size_t index = 0;
868 for (; index < size; index++) {
869 const sync_pb::MetaInfo& meta_info = specifics.meta_info(index);
870 BookmarkNode::MetaInfoMap::const_iterator it =
871 meta_info_map->find(meta_info.key());
872 if (it == meta_info_map->end() || it->second != meta_info.value()) {
873 // One of original meta info entries is missing in |meta_info_map| or
874 // different.
875 break;
876 }
877 }
878 if (index == size) {
879 // The original meta info from the sync model is already equivalent to
880 // |meta_info_map|.
881 return;
882 }
883 }
884
885 // Clear and reset meta info in bookmark specifics.
856 specifics.clear_meta_info(); 886 specifics.clear_meta_info();
857 const BookmarkNode::MetaInfoMap* meta_info_map = node->GetMetaInfoMap();
858 if (meta_info_map) { 887 if (meta_info_map) {
859 for (BookmarkNode::MetaInfoMap::const_iterator it = meta_info_map->begin(); 888 for (BookmarkNode::MetaInfoMap::const_iterator it = meta_info_map->begin();
860 it != meta_info_map->end(); ++it) { 889 it != meta_info_map->end(); ++it) {
861 sync_pb::MetaInfo* meta_info = specifics.add_meta_info(); 890 sync_pb::MetaInfo* meta_info = specifics.add_meta_info();
862 meta_info->set_key(it->first); 891 meta_info->set_key(it->first);
863 meta_info->set_value(it->second); 892 meta_info->set_value(it->second);
864 } 893 }
865 } 894 }
895
866 sync_node->SetBookmarkSpecifics(specifics); 896 sync_node->SetBookmarkSpecifics(specifics);
867 } 897 }
868 898
869 // static 899 // static
870 void BookmarkChangeProcessor::ApplyBookmarkFavicon( 900 void BookmarkChangeProcessor::ApplyBookmarkFavicon(
871 const BookmarkNode* bookmark_node, 901 const BookmarkNode* bookmark_node,
872 Profile* profile, 902 Profile* profile,
873 const GURL& icon_url, 903 const GURL& icon_url,
874 const scoped_refptr<base::RefCountedMemory>& bitmap_data) { 904 const scoped_refptr<base::RefCountedMemory>& bitmap_data) {
875 HistoryService* history = HistoryServiceFactory::GetForProfile( 905 HistoryService* history = HistoryServiceFactory::GetForProfile(
(...skipping 30 matching lines...) Expand all
906 updated_specifics.set_icon_url(bookmark_node->icon_url().spec()); 936 updated_specifics.set_icon_url(bookmark_node->icon_url().spec());
907 sync_node->SetBookmarkSpecifics(updated_specifics); 937 sync_node->SetBookmarkSpecifics(updated_specifics);
908 } 938 }
909 } 939 }
910 940
911 bool BookmarkChangeProcessor::CanSyncNode(const BookmarkNode* node) { 941 bool BookmarkChangeProcessor::CanSyncNode(const BookmarkNode* node) {
912 return bookmark_model_->client()->CanSyncNode(node); 942 return bookmark_model_->client()->CanSyncNode(node);
913 } 943 }
914 944
915 } // namespace browser_sync 945 } // namespace browser_sync
OLDNEW
« no previous file with comments | « no previous file | chrome/browser/sync/profile_sync_service_bookmark_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698