summaryrefslogtreecommitdiffstats
path: root/chrome/browser/bookmarks/bookmark_model.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/bookmarks/bookmark_model.cc')
-rw-r--r--chrome/browser/bookmarks/bookmark_model.cc40
1 files changed, 40 insertions, 0 deletions
diff --git a/chrome/browser/bookmarks/bookmark_model.cc b/chrome/browser/bookmarks/bookmark_model.cc
index 5385810..f32ac74 100644
--- a/chrome/browser/bookmarks/bookmark_model.cc
+++ b/chrome/browser/bookmarks/bookmark_model.cc
@@ -248,6 +248,46 @@ void BookmarkModel::SetTitle(const BookmarkNode* node, const string16& title) {
BookmarkNodeChanged(this, node));
}
+void BookmarkModel::SetURL(const BookmarkNode* node, const GURL& url) {
+ if (!node) {
+ NOTREACHED();
+ return;
+ }
+
+ // We cannot change the URL of a folder.
+ if (node->is_folder()) {
+ NOTREACHED();
+ return;
+ }
+
+ if (url == node->GetURL())
+ return;
+
+ AsMutable(node)->InvalidateFavicon();
+ CancelPendingFavIconLoadRequests(AsMutable(node));
+
+ {
+ AutoLock url_lock(url_lock_);
+ NodesOrderedByURLSet::iterator i = nodes_ordered_by_url_set_.find(
+ AsMutable(node));
+ DCHECK(i != nodes_ordered_by_url_set_.end());
+ // i points to the first node with the URL, advance until we find the
+ // node we're removing.
+ while (*i != node)
+ ++i;
+ nodes_ordered_by_url_set_.erase(i);
+
+ AsMutable(node)->SetURL(url);
+ nodes_ordered_by_url_set_.insert(AsMutable(node));
+ }
+
+ if (store_.get())
+ store_->ScheduleSave();
+
+ FOR_EACH_OBSERVER(BookmarkModelObserver, observers_,
+ BookmarkNodeChanged(this, node));
+}
+
void BookmarkModel::GetNodesByURL(const GURL& url,
std::vector<const BookmarkNode*>* nodes) {
AutoLock url_lock(url_lock_);