summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--components/bookmarks/browser/bookmark_model.cc4
-rw-r--r--components/bookmarks/browser/bookmark_model.h12
-rw-r--r--components/bookmarks/browser/bookmark_utils.cc9
-rw-r--r--components/bookmarks/browser/bookmark_utils_unittest.cc51
-rw-r--r--components/enhanced_bookmarks/enhanced_bookmark_model.cc1
-rw-r--r--components/enhanced_bookmarks/enhanced_bookmark_model_unittest.cc6
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());
+}