Chromium Code Reviews| Index: components/enhanced_bookmarks/enhanced_bookmark_model.cc |
| diff --git a/components/enhanced_bookmarks/enhanced_bookmark_model.cc b/components/enhanced_bookmarks/enhanced_bookmark_model.cc |
| index a20e38bac31b494cd8b63e2ff329fd38d645477e..486a2aae09fb4b14e129ae2dd326739bee35e6ea 100644 |
| --- a/components/enhanced_bookmarks/enhanced_bookmark_model.cc |
| +++ b/components/enhanced_bookmarks/enhanced_bookmark_model.cc |
| @@ -13,6 +13,7 @@ |
| #include "components/bookmarks/browser/bookmark_model.h" |
| #include "components/bookmarks/browser/bookmark_node.h" |
| #include "components/enhanced_bookmarks/proto/metadata.pb.h" |
| +#include "ui/base/models/tree_node_iterator.h" |
| #include "url/gurl.h" |
| namespace { |
| @@ -21,11 +22,10 @@ const char* kBookmarkBarId = "f_bookmarks_bar"; |
| const char* kIdKey = "stars.id"; |
| const char* kImageDataKey = "stars.imageData"; |
| const char* kNoteKey = "stars.note"; |
| +const char* kOldIdKey = "stars.oldId"; |
| const char* kPageDataKey = "stars.pageData"; |
| -const char* kUserEditKey = "stars.userEdit"; |
| const char* kVersionKey = "stars.version"; |
| -const char* kFolderPrefix = "ebf_"; |
| const char* kBookmarkPrefix = "ebc_"; |
| // Helper method for working with bookmark metainfo. |
| @@ -62,13 +62,9 @@ bool PopulateImageData(const image::collections::ImageData_ImageInfo& info, |
| // Generate a random remote id, with a prefix that depends on whether the node |
| // is a folder or a bookmark. |
| -std::string GenerateRemoteId(bool is_folder) { |
| +std::string GenerateRemoteId() { |
| std::stringstream random_id; |
| - // Add prefix depending on whether the node is a folder or not. |
| - if (is_folder) |
| - random_id << kFolderPrefix; |
| - else |
| - random_id << kBookmarkPrefix; |
| + random_id << kBookmarkPrefix; |
| // Generate 32 digit hex string random suffix. |
| random_id << std::hex << std::setfill('0') << std::setw(16); |
| @@ -82,16 +78,23 @@ namespace enhanced_bookmarks { |
| EnhancedBookmarkModel::EnhancedBookmarkModel(BookmarkModel* bookmark_model, |
| const std::string& version) |
| : bookmark_model_(bookmark_model), version_(version) { |
| + bookmark_model_->AddObserver(this); |
| + if (bookmark_model_->loaded()) |
| + InitializeIdMap(); |
| } |
| EnhancedBookmarkModel::~EnhancedBookmarkModel() { |
| } |
| +void EnhancedBookmarkModel::ShutDown() { |
| + bookmark_model_->RemoveObserver(this); |
| + bookmark_model_ = NULL; |
| +} |
| + |
| // Moves |node| to |new_parent| and inserts it at the given |index|. |
| void EnhancedBookmarkModel::Move(const BookmarkNode* node, |
| const BookmarkNode* new_parent, |
| int index) { |
| - // TODO(rfevang): Update meta info placement fields. |
| bookmark_model_->Move(node, new_parent, index); |
| } |
| @@ -100,12 +103,7 @@ const BookmarkNode* EnhancedBookmarkModel::AddFolder( |
| const BookmarkNode* parent, |
| int index, |
| const base::string16& title) { |
| - BookmarkNode::MetaInfoMap meta_info; |
| - meta_info[kIdKey] = GenerateRemoteId(true); |
| - |
| - // TODO(rfevang): Set meta info placement fields. |
| - return bookmark_model_->AddFolderWithMetaInfo( |
| - parent, index, title, &meta_info); |
| + return bookmark_model_->AddFolder(parent, index, title); |
| } |
| // Adds a url at the specified position. |
| @@ -116,9 +114,7 @@ const BookmarkNode* EnhancedBookmarkModel::AddURL( |
| const GURL& url, |
| const base::Time& creation_time) { |
| BookmarkNode::MetaInfoMap meta_info; |
| - meta_info[kIdKey] = GenerateRemoteId(false); |
| - |
| - // TODO(rfevang): Set meta info placement fields. |
| + meta_info[kIdKey] = GenerateRemoteId(); |
| return bookmark_model_->AddURLWithCreationTimeAndMetaInfo( |
| parent, index, title, url, creation_time, &meta_info); |
| } |
| @@ -127,24 +123,23 @@ std::string EnhancedBookmarkModel::GetRemoteId(const BookmarkNode* node) { |
| if (node == bookmark_model_->bookmark_bar_node()) |
| return kBookmarkBarId; |
| - // Permanent nodes other than the bookmarks bar don't have ids. |
| - DCHECK(!bookmark_model_->is_permanent_node(node)); |
| - |
| std::string id; |
| - if (!node->GetMetaInfo(kIdKey, &id) || id.empty()) |
| - return SetRemoteId(node); |
| + if (!node->GetMetaInfo(kIdKey, &id)) |
| + return std::string(); |
| return id; |
| } |
| -std::string EnhancedBookmarkModel::SetRemoteId(const BookmarkNode* node) { |
| - std::string remote_id = GenerateRemoteId(node->is_folder()); |
| - SetMetaInfo(node, kIdKey, remote_id, false); |
| - return remote_id; |
| +const BookmarkNode* EnhancedBookmarkModel::BookmarkForRemoteId( |
| + const std::string& remote_id) { |
| + IdToNodeMap::iterator it = id_map_.find(remote_id); |
| + if (it != id_map_.end()) |
| + return it->second; |
| + return NULL; |
| } |
| void EnhancedBookmarkModel::SetDescription(const BookmarkNode* node, |
| const std::string& description) { |
| - SetMetaInfo(node, kNoteKey, description, true); |
| + SetMetaInfo(node, kNoteKey, description); |
| } |
| std::string EnhancedBookmarkModel::GetDescription(const BookmarkNode* node) { |
| @@ -189,9 +184,7 @@ bool EnhancedBookmarkModel::SetOriginalImage(const BookmarkNode* node, |
| std::string encoded; |
| base::Base64Encode(output, &encoded); |
| - SetMetaInfo(node, kImageDataKey, encoded, true); |
| - // Ensure that the bookmark has a stars.id, to trigger the server processing. |
| - GetRemoteId(node); |
| + SetMetaInfo(node, kImageDataKey, encoded); |
| return true; |
| } |
| @@ -251,10 +244,97 @@ void EnhancedBookmarkModel::SetVersionSuffix( |
| version_suffix_ = version_suffix; |
| } |
| +void EnhancedBookmarkModel::BookmarkModelChanged() { |
| +} |
| + |
| +void EnhancedBookmarkModel::BookmarkModelLoaded(BookmarkModel* model, |
| + bool ids_reassigned) { |
| + InitializeIdMap(); |
| +} |
| + |
| +void EnhancedBookmarkModel::BookmarkNodeAdded(BookmarkModel* model, |
| + const BookmarkNode* parent, |
| + int index) { |
| + AddToIdMap(parent->GetChild(index)); |
| + ResetDuplicateRemoteIds(); |
| +} |
| + |
| +void EnhancedBookmarkModel::BookmarkNodeRemoved( |
| + BookmarkModel* model, |
| + const BookmarkNode* parent, |
| + int old_index, |
| + const BookmarkNode* node, |
| + const std::set<GURL>& removed_urls) { |
| + std::string remote_id = GetRemoteId(node); |
| + id_map_.erase(remote_id); |
| +} |
| + |
| +void EnhancedBookmarkModel::OnWillChangeBookmarkMetaInfo( |
| + BookmarkModel* model, |
| + const BookmarkNode* node) { |
| + prev_remote_id_ = GetRemoteId(node); |
| +} |
| + |
| +void EnhancedBookmarkModel::BookmarkMetaInfoChanged(BookmarkModel* model, |
| + const BookmarkNode* node) { |
| + std::string remote_id = GetRemoteId(node); |
| + if (remote_id != prev_remote_id_) { |
| + id_map_.erase(prev_remote_id_); |
| + if (!remote_id.empty()) { |
| + AddToIdMap(node); |
| + ResetDuplicateRemoteIds(); |
| + } |
| + } |
| +} |
| + |
| +void EnhancedBookmarkModel::BookmarkAllUserNodesRemoved( |
| + BookmarkModel* model, |
| + const std::set<GURL>& removed_urls) { |
| + id_map_.clear(); |
| + // Re-initialize so non-user nodes with remote ids are present in the map. |
| + InitializeIdMap(); |
| +} |
| + |
| +void EnhancedBookmarkModel::InitializeIdMap() { |
| + ui::TreeNodeIterator<const BookmarkNode> iterator( |
| + bookmark_model_->root_node()); |
| + while (iterator.has_next()) { |
| + AddToIdMap(iterator.Next()); |
| + } |
| + ResetDuplicateRemoteIds(); |
| +} |
| + |
| +void EnhancedBookmarkModel::AddToIdMap(const BookmarkNode* node) { |
| + std::string remote_id = GetRemoteId(node); |
| + if (remote_id.empty()) |
| + return; |
| + |
| + // Try to insert the node. |
| + std::pair<IdToNodeMap::iterator, bool> result = |
| + id_map_.insert(make_pair(remote_id, node)); |
| + if (!result.second) { |
| + // Some node already had the same remote id, so add both nodes to the |
| + // to-be-reset set. |
| + nodes_to_reset_[result.first->second] = remote_id; |
| + nodes_to_reset_[node] = remote_id; |
|
noyau (Ping after 24h)
2014/09/17 08:24:35
Don't you need to remove the node you found in the
Rune Fevang
2014/09/17 22:51:04
It needs to stay there in case there are more dupl
noyau (Ping after 24h)
2014/09/18 08:43:21
Acknowledged.
|
| + } |
| +} |
| + |
| +void EnhancedBookmarkModel::ResetDuplicateRemoteIds() { |
| + for (NodeToIdMap::iterator it = nodes_to_reset_.begin(); |
| + it != nodes_to_reset_.end(); |
| + ++it) { |
| + BookmarkNode::MetaInfoMap meta_info; |
| + meta_info[kIdKey] = ""; |
| + meta_info[kOldIdKey] = it->second; |
| + SetMultipleMetaInfo(it->first, meta_info); |
| + } |
| + nodes_to_reset_.clear(); |
| +} |
| + |
| void EnhancedBookmarkModel::SetMetaInfo(const BookmarkNode* node, |
| const std::string& field, |
| - const std::string& value, |
| - bool user_edit) { |
| + const std::string& value) { |
| DCHECK(!bookmark_model_->is_permanent_node(node)); |
| BookmarkNode::MetaInfoMap meta_info; |
| @@ -269,7 +349,6 @@ void EnhancedBookmarkModel::SetMetaInfo(const BookmarkNode* node, |
| meta_info[field] = value; |
| meta_info[kVersionKey] = GetVersionString(); |
| - meta_info[kUserEditKey] = user_edit ? "true" : "false"; |
| bookmark_model_->SetNodeMetaInfoMap(node, meta_info); |
| } |
| @@ -279,6 +358,37 @@ std::string EnhancedBookmarkModel::GetVersionString() { |
| return version_ + '/' + version_suffix_; |
| } |
| +void EnhancedBookmarkModel::SetMultipleMetaInfo( |
| + const BookmarkNode* node, |
| + BookmarkNode::MetaInfoMap meta_info) { |
| + DCHECK(!bookmark_model_->is_permanent_node(node)); |
| + |
| + // Don't update anything if every value is already set correctly. |
| + if (node->GetMetaInfoMap()) { |
| + bool changed = false; |
| + const BookmarkNode::MetaInfoMap* old_meta_info = node->GetMetaInfoMap(); |
| + for (BookmarkNode::MetaInfoMap::iterator it = meta_info.begin(); |
| + it != meta_info.end(); |
| + ++it) { |
| + BookmarkNode::MetaInfoMap::const_iterator old_field = |
| + old_meta_info->find(it->first); |
| + if (old_field == old_meta_info->end() || |
| + old_field->second == it->second) { |
| + changed = true; |
| + break; |
| + } |
| + } |
| + if (!changed) |
| + return; |
| + |
| + // Fill in the values that aren't changing |
| + meta_info.insert(old_meta_info->begin(), old_meta_info->end()); |
| + } |
| + |
| + meta_info[kVersionKey] = GetVersionString(); |
| + bookmark_model_->SetNodeMetaInfoMap(node, meta_info); |
| +} |
| + |
| bool EnhancedBookmarkModel::SetAllImages(const BookmarkNode* node, |
| const GURL& image_url, |
| int image_width, |