diff options
6 files changed, 81 insertions, 2 deletions
diff --git a/components/bookmarks/browser/bookmark_model.cc b/components/bookmarks/browser/bookmark_model.cc index f89f851..5fadefb 100644 --- a/components/bookmarks/browser/bookmark_model.cc +++ b/components/bookmarks/browser/bookmark_model.cc @@ -435,6 +435,10 @@ void BookmarkModel::DeleteNodeMetaInfo(const BookmarkNode* node, BookmarkMetaInfoChanged(this, node)); } +void BookmarkModel::AddNonClonedKey(const std::string& key) { + non_cloned_keys_.insert(key); +} + void BookmarkModel::SetNodeSyncTransactionVersion( const BookmarkNode* node, int64 sync_transaction_version) { diff --git a/components/bookmarks/browser/bookmark_model.h b/components/bookmarks/browser/bookmark_model.h index 4133fbd..1388e5b 100644 --- a/components/bookmarks/browser/bookmark_model.h +++ b/components/bookmarks/browser/bookmark_model.h @@ -283,6 +283,16 @@ class BookmarkModel : public KeyedService { void DeleteNodeMetaInfo(const BookmarkNode* node, const std::string& key); + // Adds |key| to the set of meta info keys that are not copied when a node is + // cloned. + void AddNonClonedKey(const std::string& key); + + // Returns the set of meta info keys that should not be copied when a node is + // cloned. + const std::set<std::string>& non_cloned_keys() const { + return non_cloned_keys_; + } + // Sets the sync transaction version of |node|. void SetNodeSyncTransactionVersion(const BookmarkNode* node, int64 sync_transaction_version); @@ -432,6 +442,8 @@ class BookmarkModel : public KeyedService { scoped_ptr<bookmarks::BookmarkExpandedStateTracker> expanded_state_tracker_; + std::set<std::string> non_cloned_keys_; + DISALLOW_COPY_AND_ASSIGN(BookmarkModel); }; diff --git a/components/bookmarks/browser/bookmark_utils.cc b/components/bookmarks/browser/bookmark_utils.cc index c04dc33..3a5c124 100644 --- a/components/bookmarks/browser/bookmark_utils.cc +++ b/components/bookmarks/browser/bookmark_utils.cc @@ -44,6 +44,11 @@ void CloneBookmarkNodeImpl(BookmarkModel* model, const BookmarkNode* parent, int index_to_add_at, bool reset_node_times) { + // Make sure to not copy non clonable keys. + BookmarkNode::MetaInfoMap meta_info_map = element.meta_info_map; + for (const std::string& key : model->non_cloned_keys()) + meta_info_map.erase(key); + if (element.is_url) { Time date_added = reset_node_times ? Time::Now() : element.date_added; DCHECK(!date_added.is_null()); @@ -53,10 +58,10 @@ void CloneBookmarkNodeImpl(BookmarkModel* model, element.title, element.url, date_added, - &element.meta_info_map); + &meta_info_map); } else { const BookmarkNode* cloned_node = model->AddFolderWithMetaInfo( - parent, index_to_add_at, element.title, &element.meta_info_map); + parent, index_to_add_at, element.title, &meta_info_map); if (!reset_node_times) { DCHECK(!element.date_folder_modified.is_null()); model->SetDateFolderModified(cloned_node, element.date_folder_modified); diff --git a/components/bookmarks/browser/bookmark_utils_unittest.cc b/components/bookmarks/browser/bookmark_utils_unittest.cc index 1a48edd..e36829c 100644 --- a/components/bookmarks/browser/bookmark_utils_unittest.cc +++ b/components/bookmarks/browser/bookmark_utils_unittest.cc @@ -522,6 +522,57 @@ TEST_F(BookmarkUtilsTest, CloneMetaInfo) { EXPECT_EQ("someothervalue", value); } +// Verifies that meta info fields in the non cloned set are not copied when +// cloning a bookmark. +TEST_F(BookmarkUtilsTest, CloneBookmarkResetsNonClonedKey) { + TestBookmarkClient client; + scoped_ptr<BookmarkModel> model(client.CreateModel()); + model->AddNonClonedKey("foo"); + const BookmarkNode* parent = model->other_node(); + const BookmarkNode* node = model->AddURL( + parent, 0, ASCIIToUTF16("title"), GURL("http://www.google.com")); + model->SetNodeMetaInfo(node, "foo", "ignored value"); + model->SetNodeMetaInfo(node, "bar", "kept value"); + std::vector<BookmarkNodeData::Element> elements; + BookmarkNodeData::Element node_data(node); + elements.push_back(node_data); + + // Cloning a bookmark should clear the non cloned key. + CloneBookmarkNode(model.get(), elements, parent, 0, true); + ASSERT_EQ(2, parent->child_count()); + std::string value; + EXPECT_FALSE(parent->GetChild(0)->GetMetaInfo("foo", &value)); + + // Other keys should still be cloned. + EXPECT_TRUE(parent->GetChild(0)->GetMetaInfo("bar", &value)); + EXPECT_EQ("kept value", value); +} + +// Verifies that meta info fields in the non cloned set are not copied when +// cloning a folder. +TEST_F(BookmarkUtilsTest, CloneFolderResetsNonClonedKey) { + TestBookmarkClient client; + scoped_ptr<BookmarkModel> model(client.CreateModel()); + model->AddNonClonedKey("foo"); + const BookmarkNode* parent = model->other_node(); + const BookmarkNode* node = model->AddFolder(parent, 0, ASCIIToUTF16("title")); + model->SetNodeMetaInfo(node, "foo", "ignored value"); + model->SetNodeMetaInfo(node, "bar", "kept value"); + std::vector<BookmarkNodeData::Element> elements; + BookmarkNodeData::Element node_data(node); + elements.push_back(node_data); + + // Cloning a folder should clear the non cloned key. + CloneBookmarkNode(model.get(), elements, parent, 0, true); + ASSERT_EQ(2, parent->child_count()); + std::string value; + EXPECT_FALSE(parent->GetChild(0)->GetMetaInfo("foo", &value)); + + // Other keys should still be cloned. + EXPECT_TRUE(parent->GetChild(0)->GetMetaInfo("bar", &value)); + EXPECT_EQ("kept value", value); +} + TEST_F(BookmarkUtilsTest, RemoveAllBookmarks) { TestBookmarkClient client; // Load a model with an extra node that is not editable. diff --git a/components/enhanced_bookmarks/enhanced_bookmark_model.cc b/components/enhanced_bookmarks/enhanced_bookmark_model.cc index e9b8bae..1046e64 100644 --- a/components/enhanced_bookmarks/enhanced_bookmark_model.cc +++ b/components/enhanced_bookmarks/enhanced_bookmark_model.cc @@ -91,6 +91,7 @@ EnhancedBookmarkModel::EnhancedBookmarkModel(BookmarkModel* bookmark_model, version_(version), weak_ptr_factory_(this) { bookmark_model_->AddObserver(this); + bookmark_model_->AddNonClonedKey(kIdKey); if (bookmark_model_->loaded()) { InitializeIdMap(); loaded_ = true; diff --git a/components/enhanced_bookmarks/enhanced_bookmark_model_unittest.cc b/components/enhanced_bookmarks/enhanced_bookmark_model_unittest.cc index 90855bb..c6662da 100644 --- a/components/enhanced_bookmarks/enhanced_bookmark_model_unittest.cc +++ b/components/enhanced_bookmarks/enhanced_bookmark_model_unittest.cc @@ -764,3 +764,9 @@ TEST_F(EnhancedBookmarkModelTest, bookmark_model_->Remove(gp, gp->GetIndexOf(parent)); EXPECT_FALSE(model_->BookmarkForRemoteId(remote_id)); } + +TEST_F(EnhancedBookmarkModelTest, AddsRemoteIdToNonClonedKeys) { + const std::set<std::string>& non_cloned_keys = + bookmark_model_->non_cloned_keys(); + EXPECT_TRUE(non_cloned_keys.find("stars.id") != non_cloned_keys.end()); +} |