| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "components/bookmarks/browser/bookmark_model.h" | 5 #include "components/bookmarks/browser/bookmark_model.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <functional> | 8 #include <functional> |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 122 loaded_signal_(base::WaitableEvent::ResetPolicy::MANUAL, | 122 loaded_signal_(base::WaitableEvent::ResetPolicy::MANUAL, |
| 123 base::WaitableEvent::InitialState::NOT_SIGNALED), | 123 base::WaitableEvent::InitialState::NOT_SIGNALED), |
| 124 extensive_changes_(0), | 124 extensive_changes_(0), |
| 125 undo_delegate_(nullptr), | 125 undo_delegate_(nullptr), |
| 126 empty_undo_delegate_(new EmptyUndoDelegate) { | 126 empty_undo_delegate_(new EmptyUndoDelegate) { |
| 127 DCHECK(client_); | 127 DCHECK(client_); |
| 128 client_->Init(this); | 128 client_->Init(this); |
| 129 } | 129 } |
| 130 | 130 |
| 131 BookmarkModel::~BookmarkModel() { | 131 BookmarkModel::~BookmarkModel() { |
| 132 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, | 132 for (BookmarkModelObserver& observer : observers_) |
| 133 BookmarkModelBeingDeleted(this)); | 133 observer.BookmarkModelBeingDeleted(this); |
| 134 | 134 |
| 135 if (store_.get()) { | 135 if (store_.get()) { |
| 136 // The store maintains a reference back to us. We need to tell it we're gone | 136 // The store maintains a reference back to us. We need to tell it we're gone |
| 137 // so that it doesn't try and invoke a method back on us again. | 137 // so that it doesn't try and invoke a method back on us again. |
| 138 store_->BookmarkModelDeleted(); | 138 store_->BookmarkModelDeleted(); |
| 139 } | 139 } |
| 140 } | 140 } |
| 141 | 141 |
| 142 void BookmarkModel::Shutdown() { | 142 void BookmarkModel::Shutdown() { |
| 143 if (loaded_) | 143 if (loaded_) |
| (...skipping 27 matching lines...) Expand all Loading... |
| 171 void BookmarkModel::AddObserver(BookmarkModelObserver* observer) { | 171 void BookmarkModel::AddObserver(BookmarkModelObserver* observer) { |
| 172 observers_.AddObserver(observer); | 172 observers_.AddObserver(observer); |
| 173 } | 173 } |
| 174 | 174 |
| 175 void BookmarkModel::RemoveObserver(BookmarkModelObserver* observer) { | 175 void BookmarkModel::RemoveObserver(BookmarkModelObserver* observer) { |
| 176 observers_.RemoveObserver(observer); | 176 observers_.RemoveObserver(observer); |
| 177 } | 177 } |
| 178 | 178 |
| 179 void BookmarkModel::BeginExtensiveChanges() { | 179 void BookmarkModel::BeginExtensiveChanges() { |
| 180 if (++extensive_changes_ == 1) { | 180 if (++extensive_changes_ == 1) { |
| 181 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, | 181 for (BookmarkModelObserver& observer : observers_) |
| 182 ExtensiveBookmarkChangesBeginning(this)); | 182 observer.ExtensiveBookmarkChangesBeginning(this); |
| 183 } | 183 } |
| 184 } | 184 } |
| 185 | 185 |
| 186 void BookmarkModel::EndExtensiveChanges() { | 186 void BookmarkModel::EndExtensiveChanges() { |
| 187 --extensive_changes_; | 187 --extensive_changes_; |
| 188 DCHECK_GE(extensive_changes_, 0); | 188 DCHECK_GE(extensive_changes_, 0); |
| 189 if (extensive_changes_ == 0) { | 189 if (extensive_changes_ == 0) { |
| 190 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, | 190 for (BookmarkModelObserver& observer : observers_) |
| 191 ExtensiveBookmarkChangesEnded(this)); | 191 observer.ExtensiveBookmarkChangesEnded(this); |
| 192 } | 192 } |
| 193 } | 193 } |
| 194 | 194 |
| 195 void BookmarkModel::BeginGroupedChanges() { | 195 void BookmarkModel::BeginGroupedChanges() { |
| 196 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, | 196 for (BookmarkModelObserver& observer : observers_) |
| 197 GroupedBookmarkChangesBeginning(this)); | 197 observer.GroupedBookmarkChangesBeginning(this); |
| 198 } | 198 } |
| 199 | 199 |
| 200 void BookmarkModel::EndGroupedChanges() { | 200 void BookmarkModel::EndGroupedChanges() { |
| 201 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, | 201 for (BookmarkModelObserver& observer : observers_) |
| 202 GroupedBookmarkChangesEnded(this)); | 202 observer.GroupedBookmarkChangesEnded(this); |
| 203 } | 203 } |
| 204 | 204 |
| 205 void BookmarkModel::Remove(const BookmarkNode* node) { | 205 void BookmarkModel::Remove(const BookmarkNode* node) { |
| 206 DCHECK(loaded_); | 206 DCHECK(loaded_); |
| 207 DCHECK(node); | 207 DCHECK(node); |
| 208 DCHECK(!is_root_node(node)); | 208 DCHECK(!is_root_node(node)); |
| 209 RemoveAndDeleteNode(AsMutable(node)); | 209 RemoveAndDeleteNode(AsMutable(node)); |
| 210 } | 210 } |
| 211 | 211 |
| 212 void BookmarkModel::RemoveAllUserBookmarks() { | 212 void BookmarkModel::RemoveAllUserBookmarks() { |
| 213 std::set<GURL> removed_urls; | 213 std::set<GURL> removed_urls; |
| 214 struct RemoveNodeData { | 214 struct RemoveNodeData { |
| 215 const BookmarkNode* parent; | 215 const BookmarkNode* parent; |
| 216 int index; | 216 int index; |
| 217 std::unique_ptr<BookmarkNode> node; | 217 std::unique_ptr<BookmarkNode> node; |
| 218 }; | 218 }; |
| 219 std::vector<RemoveNodeData> removed_node_data_list; | 219 std::vector<RemoveNodeData> removed_node_data_list; |
| 220 | 220 |
| 221 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, | 221 for (BookmarkModelObserver& observer : observers_) |
| 222 OnWillRemoveAllUserBookmarks(this)); | 222 observer.OnWillRemoveAllUserBookmarks(this); |
| 223 | 223 |
| 224 BeginExtensiveChanges(); | 224 BeginExtensiveChanges(); |
| 225 // Skip deleting permanent nodes. Permanent bookmark nodes are the root and | 225 // Skip deleting permanent nodes. Permanent bookmark nodes are the root and |
| 226 // its immediate children. For removing all non permanent nodes just remove | 226 // its immediate children. For removing all non permanent nodes just remove |
| 227 // all children of non-root permanent nodes. | 227 // all children of non-root permanent nodes. |
| 228 { | 228 { |
| 229 base::AutoLock url_lock(url_lock_); | 229 base::AutoLock url_lock(url_lock_); |
| 230 for (int i = 0; i < root_.child_count(); ++i) { | 230 for (int i = 0; i < root_.child_count(); ++i) { |
| 231 const BookmarkNode* permanent_node = root_.GetChild(i); | 231 const BookmarkNode* permanent_node = root_.GetChild(i); |
| 232 | 232 |
| 233 if (!client_->CanBeEditedByUser(permanent_node)) | 233 if (!client_->CanBeEditedByUser(permanent_node)) |
| 234 continue; | 234 continue; |
| 235 | 235 |
| 236 for (int j = permanent_node->child_count() - 1; j >= 0; --j) { | 236 for (int j = permanent_node->child_count() - 1; j >= 0; --j) { |
| 237 std::unique_ptr<BookmarkNode> node = RemoveNodeAndGetRemovedUrls( | 237 std::unique_ptr<BookmarkNode> node = RemoveNodeAndGetRemovedUrls( |
| 238 AsMutable(permanent_node->GetChild(j)), &removed_urls); | 238 AsMutable(permanent_node->GetChild(j)), &removed_urls); |
| 239 removed_node_data_list.push_back({permanent_node, j, std::move(node)}); | 239 removed_node_data_list.push_back({permanent_node, j, std::move(node)}); |
| 240 } | 240 } |
| 241 } | 241 } |
| 242 } | 242 } |
| 243 EndExtensiveChanges(); | 243 EndExtensiveChanges(); |
| 244 if (store_.get()) | 244 if (store_.get()) |
| 245 store_->ScheduleSave(); | 245 store_->ScheduleSave(); |
| 246 | 246 |
| 247 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, | 247 for (BookmarkModelObserver& observer : observers_) |
| 248 BookmarkAllUserNodesRemoved(this, removed_urls)); | 248 observer.BookmarkAllUserNodesRemoved(this, removed_urls); |
| 249 | 249 |
| 250 BeginGroupedChanges(); | 250 BeginGroupedChanges(); |
| 251 for (auto& removed_node_data : removed_node_data_list) { | 251 for (auto& removed_node_data : removed_node_data_list) { |
| 252 undo_delegate()->OnBookmarkNodeRemoved(this, removed_node_data.parent, | 252 undo_delegate()->OnBookmarkNodeRemoved(this, removed_node_data.parent, |
| 253 removed_node_data.index, | 253 removed_node_data.index, |
| 254 std::move(removed_node_data.node)); | 254 std::move(removed_node_data.node)); |
| 255 } | 255 } |
| 256 EndGroupedChanges(); | 256 EndGroupedChanges(); |
| 257 } | 257 } |
| 258 | 258 |
| (...skipping 28 matching lines...) Expand all Loading... |
| 287 | 287 |
| 288 BookmarkNode* mutable_old_parent = AsMutable(old_parent); | 288 BookmarkNode* mutable_old_parent = AsMutable(old_parent); |
| 289 std::unique_ptr<BookmarkNode> owned_node = | 289 std::unique_ptr<BookmarkNode> owned_node = |
| 290 mutable_old_parent->Remove(AsMutable(node)); | 290 mutable_old_parent->Remove(AsMutable(node)); |
| 291 BookmarkNode* mutable_new_parent = AsMutable(new_parent); | 291 BookmarkNode* mutable_new_parent = AsMutable(new_parent); |
| 292 mutable_new_parent->Add(std::move(owned_node), index); | 292 mutable_new_parent->Add(std::move(owned_node), index); |
| 293 | 293 |
| 294 if (store_.get()) | 294 if (store_.get()) |
| 295 store_->ScheduleSave(); | 295 store_->ScheduleSave(); |
| 296 | 296 |
| 297 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, | 297 for (BookmarkModelObserver& observer : observers_) |
| 298 BookmarkNodeMoved(this, old_parent, old_index, | 298 observer.BookmarkNodeMoved(this, old_parent, old_index, new_parent, index); |
| 299 new_parent, index)); | |
| 300 } | 299 } |
| 301 | 300 |
| 302 void BookmarkModel::Copy(const BookmarkNode* node, | 301 void BookmarkModel::Copy(const BookmarkNode* node, |
| 303 const BookmarkNode* new_parent, | 302 const BookmarkNode* new_parent, |
| 304 int index) { | 303 int index) { |
| 305 if (!loaded_ || !node || !IsValidIndex(new_parent, index, true) || | 304 if (!loaded_ || !node || !IsValidIndex(new_parent, index, true) || |
| 306 is_root_node(new_parent) || is_permanent_node(node)) { | 305 is_root_node(new_parent) || is_permanent_node(node)) { |
| 307 NOTREACHED(); | 306 NOTREACHED(); |
| 308 return; | 307 return; |
| 309 } | 308 } |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 345 DCHECK(node); | 344 DCHECK(node); |
| 346 | 345 |
| 347 if (node->GetTitle() == title) | 346 if (node->GetTitle() == title) |
| 348 return; | 347 return; |
| 349 | 348 |
| 350 if (is_permanent_node(node) && !client_->CanSetPermanentNodeTitle(node)) { | 349 if (is_permanent_node(node) && !client_->CanSetPermanentNodeTitle(node)) { |
| 351 NOTREACHED(); | 350 NOTREACHED(); |
| 352 return; | 351 return; |
| 353 } | 352 } |
| 354 | 353 |
| 355 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, | 354 for (BookmarkModelObserver& observer : observers_) |
| 356 OnWillChangeBookmarkNode(this, node)); | 355 observer.OnWillChangeBookmarkNode(this, node); |
| 357 | 356 |
| 358 // The title index doesn't support changing the title, instead we remove then | 357 // The title index doesn't support changing the title, instead we remove then |
| 359 // add it back. | 358 // add it back. |
| 360 index_->Remove(node); | 359 index_->Remove(node); |
| 361 AsMutable(node)->SetTitle(title); | 360 AsMutable(node)->SetTitle(title); |
| 362 index_->Add(node); | 361 index_->Add(node); |
| 363 | 362 |
| 364 if (store_.get()) | 363 if (store_.get()) |
| 365 store_->ScheduleSave(); | 364 store_->ScheduleSave(); |
| 366 | 365 |
| 367 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, | 366 for (BookmarkModelObserver& observer : observers_) |
| 368 BookmarkNodeChanged(this, node)); | 367 observer.BookmarkNodeChanged(this, node); |
| 369 } | 368 } |
| 370 | 369 |
| 371 void BookmarkModel::SetURL(const BookmarkNode* node, const GURL& url) { | 370 void BookmarkModel::SetURL(const BookmarkNode* node, const GURL& url) { |
| 372 DCHECK(node && !node->is_folder()); | 371 DCHECK(node && !node->is_folder()); |
| 373 | 372 |
| 374 if (node->url() == url) | 373 if (node->url() == url) |
| 375 return; | 374 return; |
| 376 | 375 |
| 377 BookmarkNode* mutable_node = AsMutable(node); | 376 BookmarkNode* mutable_node = AsMutable(node); |
| 378 mutable_node->InvalidateFavicon(); | 377 mutable_node->InvalidateFavicon(); |
| 379 CancelPendingFaviconLoadRequests(mutable_node); | 378 CancelPendingFaviconLoadRequests(mutable_node); |
| 380 | 379 |
| 381 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, | 380 for (BookmarkModelObserver& observer : observers_) |
| 382 OnWillChangeBookmarkNode(this, node)); | 381 observer.OnWillChangeBookmarkNode(this, node); |
| 383 | 382 |
| 384 { | 383 { |
| 385 base::AutoLock url_lock(url_lock_); | 384 base::AutoLock url_lock(url_lock_); |
| 386 RemoveNodeFromInternalMaps(mutable_node); | 385 RemoveNodeFromInternalMaps(mutable_node); |
| 387 mutable_node->set_url(url); | 386 mutable_node->set_url(url); |
| 388 AddNodeToInternalMaps(mutable_node); | 387 AddNodeToInternalMaps(mutable_node); |
| 389 } | 388 } |
| 390 | 389 |
| 391 if (store_.get()) | 390 if (store_.get()) |
| 392 store_->ScheduleSave(); | 391 store_->ScheduleSave(); |
| 393 | 392 |
| 394 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, | 393 for (BookmarkModelObserver& observer : observers_) |
| 395 BookmarkNodeChanged(this, node)); | 394 observer.BookmarkNodeChanged(this, node); |
| 396 } | 395 } |
| 397 | 396 |
| 398 void BookmarkModel::SetNodeMetaInfo(const BookmarkNode* node, | 397 void BookmarkModel::SetNodeMetaInfo(const BookmarkNode* node, |
| 399 const std::string& key, | 398 const std::string& key, |
| 400 const std::string& value) { | 399 const std::string& value) { |
| 401 std::string old_value; | 400 std::string old_value; |
| 402 if (node->GetMetaInfo(key, &old_value) && old_value == value) | 401 if (node->GetMetaInfo(key, &old_value) && old_value == value) |
| 403 return; | 402 return; |
| 404 | 403 |
| 405 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, | 404 for (BookmarkModelObserver& observer : observers_) |
| 406 OnWillChangeBookmarkMetaInfo(this, node)); | 405 observer.OnWillChangeBookmarkMetaInfo(this, node); |
| 407 | 406 |
| 408 if (AsMutable(node)->SetMetaInfo(key, value) && store_.get()) | 407 if (AsMutable(node)->SetMetaInfo(key, value) && store_.get()) |
| 409 store_->ScheduleSave(); | 408 store_->ScheduleSave(); |
| 410 | 409 |
| 411 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, | 410 for (BookmarkModelObserver& observer : observers_) |
| 412 BookmarkMetaInfoChanged(this, node)); | 411 observer.BookmarkMetaInfoChanged(this, node); |
| 413 } | 412 } |
| 414 | 413 |
| 415 void BookmarkModel::SetNodeMetaInfoMap( | 414 void BookmarkModel::SetNodeMetaInfoMap( |
| 416 const BookmarkNode* node, | 415 const BookmarkNode* node, |
| 417 const BookmarkNode::MetaInfoMap& meta_info_map) { | 416 const BookmarkNode::MetaInfoMap& meta_info_map) { |
| 418 const BookmarkNode::MetaInfoMap* old_meta_info_map = node->GetMetaInfoMap(); | 417 const BookmarkNode::MetaInfoMap* old_meta_info_map = node->GetMetaInfoMap(); |
| 419 if ((!old_meta_info_map && meta_info_map.empty()) || | 418 if ((!old_meta_info_map && meta_info_map.empty()) || |
| 420 (old_meta_info_map && meta_info_map == *old_meta_info_map)) | 419 (old_meta_info_map && meta_info_map == *old_meta_info_map)) |
| 421 return; | 420 return; |
| 422 | 421 |
| 423 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, | 422 for (BookmarkModelObserver& observer : observers_) |
| 424 OnWillChangeBookmarkMetaInfo(this, node)); | 423 observer.OnWillChangeBookmarkMetaInfo(this, node); |
| 425 | 424 |
| 426 AsMutable(node)->SetMetaInfoMap(meta_info_map); | 425 AsMutable(node)->SetMetaInfoMap(meta_info_map); |
| 427 if (store_.get()) | 426 if (store_.get()) |
| 428 store_->ScheduleSave(); | 427 store_->ScheduleSave(); |
| 429 | 428 |
| 430 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, | 429 for (BookmarkModelObserver& observer : observers_) |
| 431 BookmarkMetaInfoChanged(this, node)); | 430 observer.BookmarkMetaInfoChanged(this, node); |
| 432 } | 431 } |
| 433 | 432 |
| 434 void BookmarkModel::DeleteNodeMetaInfo(const BookmarkNode* node, | 433 void BookmarkModel::DeleteNodeMetaInfo(const BookmarkNode* node, |
| 435 const std::string& key) { | 434 const std::string& key) { |
| 436 const BookmarkNode::MetaInfoMap* meta_info_map = node->GetMetaInfoMap(); | 435 const BookmarkNode::MetaInfoMap* meta_info_map = node->GetMetaInfoMap(); |
| 437 if (!meta_info_map || meta_info_map->find(key) == meta_info_map->end()) | 436 if (!meta_info_map || meta_info_map->find(key) == meta_info_map->end()) |
| 438 return; | 437 return; |
| 439 | 438 |
| 440 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, | 439 for (BookmarkModelObserver& observer : observers_) |
| 441 OnWillChangeBookmarkMetaInfo(this, node)); | 440 observer.OnWillChangeBookmarkMetaInfo(this, node); |
| 442 | 441 |
| 443 if (AsMutable(node)->DeleteMetaInfo(key) && store_.get()) | 442 if (AsMutable(node)->DeleteMetaInfo(key) && store_.get()) |
| 444 store_->ScheduleSave(); | 443 store_->ScheduleSave(); |
| 445 | 444 |
| 446 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, | 445 for (BookmarkModelObserver& observer : observers_) |
| 447 BookmarkMetaInfoChanged(this, node)); | 446 observer.BookmarkMetaInfoChanged(this, node); |
| 448 } | 447 } |
| 449 | 448 |
| 450 void BookmarkModel::AddNonClonedKey(const std::string& key) { | 449 void BookmarkModel::AddNonClonedKey(const std::string& key) { |
| 451 non_cloned_keys_.insert(key); | 450 non_cloned_keys_.insert(key); |
| 452 } | 451 } |
| 453 | 452 |
| 454 void BookmarkModel::SetNodeSyncTransactionVersion( | 453 void BookmarkModel::SetNodeSyncTransactionVersion( |
| 455 const BookmarkNode* node, | 454 const BookmarkNode* node, |
| 456 int64_t sync_transaction_version) { | 455 int64_t sync_transaction_version) { |
| 457 DCHECK(client_->CanSyncNode(node)); | 456 DCHECK(client_->CanSyncNode(node)); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 485 if (icon_url == node->icon_url()) | 484 if (icon_url == node->icon_url()) |
| 486 to_update.insert(node); | 485 to_update.insert(node); |
| 487 } | 486 } |
| 488 } | 487 } |
| 489 | 488 |
| 490 for (const BookmarkNode* node : to_update) { | 489 for (const BookmarkNode* node : to_update) { |
| 491 // Rerequest the favicon. | 490 // Rerequest the favicon. |
| 492 BookmarkNode* mutable_node = AsMutable(node); | 491 BookmarkNode* mutable_node = AsMutable(node); |
| 493 mutable_node->InvalidateFavicon(); | 492 mutable_node->InvalidateFavicon(); |
| 494 CancelPendingFaviconLoadRequests(mutable_node); | 493 CancelPendingFaviconLoadRequests(mutable_node); |
| 495 FOR_EACH_OBSERVER(BookmarkModelObserver, | 494 for (BookmarkModelObserver& observer : observers_) |
| 496 observers_, | 495 observer.BookmarkNodeFaviconChanged(this, node); |
| 497 BookmarkNodeFaviconChanged(this, node)); | |
| 498 } | 496 } |
| 499 } | 497 } |
| 500 | 498 |
| 501 void BookmarkModel::SetDateAdded(const BookmarkNode* node, Time date_added) { | 499 void BookmarkModel::SetDateAdded(const BookmarkNode* node, Time date_added) { |
| 502 DCHECK(node && !is_permanent_node(node)); | 500 DCHECK(node && !is_permanent_node(node)); |
| 503 | 501 |
| 504 if (node->date_added() == date_added) | 502 if (node->date_added() == date_added) |
| 505 return; | 503 return; |
| 506 | 504 |
| 507 AsMutable(node)->set_date_added(date_added); | 505 AsMutable(node)->set_date_added(date_added); |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 643 } | 641 } |
| 644 | 642 |
| 645 void BookmarkModel::SortChildren(const BookmarkNode* parent) { | 643 void BookmarkModel::SortChildren(const BookmarkNode* parent) { |
| 646 DCHECK(client_->CanBeEditedByUser(parent)); | 644 DCHECK(client_->CanBeEditedByUser(parent)); |
| 647 | 645 |
| 648 if (!parent || !parent->is_folder() || is_root_node(parent) || | 646 if (!parent || !parent->is_folder() || is_root_node(parent) || |
| 649 parent->child_count() <= 1) { | 647 parent->child_count() <= 1) { |
| 650 return; | 648 return; |
| 651 } | 649 } |
| 652 | 650 |
| 653 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, | 651 for (BookmarkModelObserver& observer : observers_) |
| 654 OnWillReorderBookmarkNode(this, parent)); | 652 observer.OnWillReorderBookmarkNode(this, parent); |
| 655 | 653 |
| 656 UErrorCode error = U_ZERO_ERROR; | 654 UErrorCode error = U_ZERO_ERROR; |
| 657 std::unique_ptr<icu::Collator> collator(icu::Collator::createInstance(error)); | 655 std::unique_ptr<icu::Collator> collator(icu::Collator::createInstance(error)); |
| 658 if (U_FAILURE(error)) | 656 if (U_FAILURE(error)) |
| 659 collator.reset(NULL); | 657 collator.reset(NULL); |
| 660 BookmarkNode* mutable_parent = AsMutable(parent); | 658 BookmarkNode* mutable_parent = AsMutable(parent); |
| 661 std::sort(mutable_parent->children().begin(), | 659 std::sort(mutable_parent->children().begin(), |
| 662 mutable_parent->children().end(), | 660 mutable_parent->children().end(), |
| 663 SortComparator(collator.get())); | 661 SortComparator(collator.get())); |
| 664 | 662 |
| 665 if (store_.get()) | 663 if (store_.get()) |
| 666 store_->ScheduleSave(); | 664 store_->ScheduleSave(); |
| 667 | 665 |
| 668 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, | 666 for (BookmarkModelObserver& observer : observers_) |
| 669 BookmarkNodeChildrenReordered(this, parent)); | 667 observer.BookmarkNodeChildrenReordered(this, parent); |
| 670 } | 668 } |
| 671 | 669 |
| 672 void BookmarkModel::ReorderChildren( | 670 void BookmarkModel::ReorderChildren( |
| 673 const BookmarkNode* parent, | 671 const BookmarkNode* parent, |
| 674 const std::vector<const BookmarkNode*>& ordered_nodes) { | 672 const std::vector<const BookmarkNode*>& ordered_nodes) { |
| 675 DCHECK(client_->CanBeEditedByUser(parent)); | 673 DCHECK(client_->CanBeEditedByUser(parent)); |
| 676 | 674 |
| 677 // Ensure that all children in |parent| are in |ordered_nodes|. | 675 // Ensure that all children in |parent| are in |ordered_nodes|. |
| 678 DCHECK_EQ(static_cast<size_t>(parent->child_count()), ordered_nodes.size()); | 676 DCHECK_EQ(static_cast<size_t>(parent->child_count()), ordered_nodes.size()); |
| 679 for (const BookmarkNode* node : ordered_nodes) | 677 for (const BookmarkNode* node : ordered_nodes) |
| 680 DCHECK_EQ(parent, node->parent()); | 678 DCHECK_EQ(parent, node->parent()); |
| 681 | 679 |
| 682 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, | 680 for (BookmarkModelObserver& observer : observers_) |
| 683 OnWillReorderBookmarkNode(this, parent)); | 681 observer.OnWillReorderBookmarkNode(this, parent); |
| 684 | 682 |
| 685 if (ordered_nodes.size() > 1) { | 683 if (ordered_nodes.size() > 1) { |
| 686 std::map<const BookmarkNode*, int> order; | 684 std::map<const BookmarkNode*, int> order; |
| 687 for (size_t i = 0; i < ordered_nodes.size(); ++i) | 685 for (size_t i = 0; i < ordered_nodes.size(); ++i) |
| 688 order[ordered_nodes[i]] = i; | 686 order[ordered_nodes[i]] = i; |
| 689 | 687 |
| 690 std::vector<std::unique_ptr<BookmarkNode>> new_children( | 688 std::vector<std::unique_ptr<BookmarkNode>> new_children( |
| 691 ordered_nodes.size()); | 689 ordered_nodes.size()); |
| 692 BookmarkNode* mutable_parent = AsMutable(parent); | 690 BookmarkNode* mutable_parent = AsMutable(parent); |
| 693 for (auto& child : mutable_parent->children()) { | 691 for (auto& child : mutable_parent->children()) { |
| 694 size_t new_location = order[child.get()]; | 692 size_t new_location = order[child.get()]; |
| 695 new_children[new_location] = std::move(child); | 693 new_children[new_location] = std::move(child); |
| 696 } | 694 } |
| 697 mutable_parent->children().swap(new_children); | 695 mutable_parent->children().swap(new_children); |
| 698 | 696 |
| 699 if (store_.get()) | 697 if (store_.get()) |
| 700 store_->ScheduleSave(); | 698 store_->ScheduleSave(); |
| 701 } | 699 } |
| 702 | 700 |
| 703 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, | 701 for (BookmarkModelObserver& observer : observers_) |
| 704 BookmarkNodeChildrenReordered(this, parent)); | 702 observer.BookmarkNodeChildrenReordered(this, parent); |
| 705 } | 703 } |
| 706 | 704 |
| 707 void BookmarkModel::SetDateFolderModified(const BookmarkNode* parent, | 705 void BookmarkModel::SetDateFolderModified(const BookmarkNode* parent, |
| 708 const Time time) { | 706 const Time time) { |
| 709 DCHECK(parent); | 707 DCHECK(parent); |
| 710 AsMutable(parent)->set_date_folder_modified(time); | 708 AsMutable(parent)->set_date_folder_modified(time); |
| 711 | 709 |
| 712 if (store_.get()) | 710 if (store_.get()) |
| 713 store_->ScheduleSave(); | 711 store_->ScheduleSave(); |
| 714 } | 712 } |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 767 BookmarkNode* node_ptr = node.get(); | 765 BookmarkNode* node_ptr = node.get(); |
| 768 AddNode(AsMutable(parent), index, std::move(node)); | 766 AddNode(AsMutable(parent), index, std::move(node)); |
| 769 | 767 |
| 770 // We might be restoring a folder node that have already contained a set of | 768 // We might be restoring a folder node that have already contained a set of |
| 771 // child nodes. We need to notify all of them. | 769 // child nodes. We need to notify all of them. |
| 772 NotifyNodeAddedForAllDescendents(node_ptr); | 770 NotifyNodeAddedForAllDescendents(node_ptr); |
| 773 } | 771 } |
| 774 | 772 |
| 775 void BookmarkModel::NotifyNodeAddedForAllDescendents(const BookmarkNode* node) { | 773 void BookmarkModel::NotifyNodeAddedForAllDescendents(const BookmarkNode* node) { |
| 776 for (int i = 0; i < node->child_count(); ++i) { | 774 for (int i = 0; i < node->child_count(); ++i) { |
| 777 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, | 775 for (BookmarkModelObserver& observer : observers_) |
| 778 BookmarkNodeAdded(this, node, i)); | 776 observer.BookmarkNodeAdded(this, node, i); |
| 779 NotifyNodeAddedForAllDescendents(node->GetChild(i)); | 777 NotifyNodeAddedForAllDescendents(node->GetChild(i)); |
| 780 } | 778 } |
| 781 } | 779 } |
| 782 | 780 |
| 783 bool BookmarkModel::IsBookmarkedNoLock(const GURL& url) { | 781 bool BookmarkModel::IsBookmarkedNoLock(const GURL& url) { |
| 784 BookmarkNode tmp_node(url); | 782 BookmarkNode tmp_node(url); |
| 785 return (nodes_ordered_by_url_set_.find(&tmp_node) != | 783 return (nodes_ordered_by_url_set_.find(&tmp_node) != |
| 786 nodes_ordered_by_url_set_.end()); | 784 nodes_ordered_by_url_set_.end()); |
| 787 } | 785 } |
| 788 | 786 |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 893 loaded_ = true; | 891 loaded_ = true; |
| 894 | 892 |
| 895 loaded_signal_.Signal(); | 893 loaded_signal_.Signal(); |
| 896 | 894 |
| 897 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/467179 | 895 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/467179 |
| 898 // is fixed. | 896 // is fixed. |
| 899 tracked_objects::ScopedTracker tracking_profile6( | 897 tracked_objects::ScopedTracker tracking_profile6( |
| 900 FROM_HERE_WITH_EXPLICIT_FUNCTION("467179 BookmarkModel::DoneLoading6")); | 898 FROM_HERE_WITH_EXPLICIT_FUNCTION("467179 BookmarkModel::DoneLoading6")); |
| 901 | 899 |
| 902 // Notify our direct observers. | 900 // Notify our direct observers. |
| 903 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, | 901 for (BookmarkModelObserver& observer : observers_) |
| 904 BookmarkModelLoaded(this, details->ids_reassigned())); | 902 observer.BookmarkModelLoaded(this, details->ids_reassigned()); |
| 905 } | 903 } |
| 906 | 904 |
| 907 void BookmarkModel::RemoveAndDeleteNode(BookmarkNode* node_ptr) { | 905 void BookmarkModel::RemoveAndDeleteNode(BookmarkNode* node_ptr) { |
| 908 std::unique_ptr<BookmarkNode> node; | 906 std::unique_ptr<BookmarkNode> node; |
| 909 | 907 |
| 910 const BookmarkNode* parent = node_ptr->parent(); | 908 const BookmarkNode* parent = node_ptr->parent(); |
| 911 DCHECK(parent); | 909 DCHECK(parent); |
| 912 int index = parent->GetIndexOf(node_ptr); | 910 int index = parent->GetIndexOf(node_ptr); |
| 913 DCHECK_NE(-1, index); | 911 DCHECK_NE(-1, index); |
| 914 | 912 |
| 915 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, | 913 for (BookmarkModelObserver& observer : observers_) |
| 916 OnWillRemoveBookmarks(this, parent, index, node_ptr)); | 914 observer.OnWillRemoveBookmarks(this, parent, index, node_ptr); |
| 917 | 915 |
| 918 std::set<GURL> removed_urls; | 916 std::set<GURL> removed_urls; |
| 919 { | 917 { |
| 920 base::AutoLock url_lock(url_lock_); | 918 base::AutoLock url_lock(url_lock_); |
| 921 node = RemoveNodeAndGetRemovedUrls(node_ptr, &removed_urls); | 919 node = RemoveNodeAndGetRemovedUrls(node_ptr, &removed_urls); |
| 922 } | 920 } |
| 923 | 921 |
| 924 if (store_.get()) | 922 if (store_.get()) |
| 925 store_->ScheduleSave(); | 923 store_->ScheduleSave(); |
| 926 | 924 |
| 927 FOR_EACH_OBSERVER( | 925 for (BookmarkModelObserver& observer : observers_) |
| 928 BookmarkModelObserver, | 926 observer.BookmarkNodeRemoved(this, parent, index, node.get(), removed_urls); |
| 929 observers_, | |
| 930 BookmarkNodeRemoved(this, parent, index, node.get(), removed_urls)); | |
| 931 | 927 |
| 932 undo_delegate()->OnBookmarkNodeRemoved(this, parent, index, std::move(node)); | 928 undo_delegate()->OnBookmarkNodeRemoved(this, parent, index, std::move(node)); |
| 933 } | 929 } |
| 934 | 930 |
| 935 void BookmarkModel::RemoveNodeFromInternalMaps(BookmarkNode* node) { | 931 void BookmarkModel::RemoveNodeFromInternalMaps(BookmarkNode* node) { |
| 936 index_->Remove(node); | 932 index_->Remove(node); |
| 937 // NOTE: this is called in such a way that url_lock_ is already held. As | 933 // NOTE: this is called in such a way that url_lock_ is already held. As |
| 938 // such, this doesn't explicitly grab the lock. | 934 // such, this doesn't explicitly grab the lock. |
| 939 url_lock_.AssertAcquired(); | 935 url_lock_.AssertAcquired(); |
| 940 NodesOrderedByURLSet::iterator i = nodes_ordered_by_url_set_.find(node); | 936 NodesOrderedByURLSet::iterator i = nodes_ordered_by_url_set_.find(node); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 982 parent->Add(std::move(node), index); | 978 parent->Add(std::move(node), index); |
| 983 | 979 |
| 984 if (store_.get()) | 980 if (store_.get()) |
| 985 store_->ScheduleSave(); | 981 store_->ScheduleSave(); |
| 986 | 982 |
| 987 { | 983 { |
| 988 base::AutoLock url_lock(url_lock_); | 984 base::AutoLock url_lock(url_lock_); |
| 989 AddNodeToInternalMaps(node_ptr); | 985 AddNodeToInternalMaps(node_ptr); |
| 990 } | 986 } |
| 991 | 987 |
| 992 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, | 988 for (BookmarkModelObserver& observer : observers_) |
| 993 BookmarkNodeAdded(this, parent, index)); | 989 observer.BookmarkNodeAdded(this, parent, index); |
| 994 | 990 |
| 995 return node_ptr; | 991 return node_ptr; |
| 996 } | 992 } |
| 997 | 993 |
| 998 void BookmarkModel::AddNodeToInternalMaps(BookmarkNode* node) { | 994 void BookmarkModel::AddNodeToInternalMaps(BookmarkNode* node) { |
| 999 url_lock_.AssertAcquired(); | 995 url_lock_.AssertAcquired(); |
| 1000 if (node->is_url()) { | 996 if (node->is_url()) { |
| 1001 index_->Add(node); | 997 index_->Add(node); |
| 1002 nodes_ordered_by_url_set_.insert(node); | 998 nodes_ordered_by_url_set_.insert(node); |
| 1003 } | 999 } |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1077 &BookmarkModel::OnFaviconDataAvailable, | 1073 &BookmarkModel::OnFaviconDataAvailable, |
| 1078 base::Unretained(this), | 1074 base::Unretained(this), |
| 1079 node, | 1075 node, |
| 1080 icon_type), | 1076 icon_type), |
| 1081 &cancelable_task_tracker_); | 1077 &cancelable_task_tracker_); |
| 1082 if (taskId != base::CancelableTaskTracker::kBadTaskId) | 1078 if (taskId != base::CancelableTaskTracker::kBadTaskId) |
| 1083 node->set_favicon_load_task_id(taskId); | 1079 node->set_favicon_load_task_id(taskId); |
| 1084 } | 1080 } |
| 1085 | 1081 |
| 1086 void BookmarkModel::FaviconLoaded(const BookmarkNode* node) { | 1082 void BookmarkModel::FaviconLoaded(const BookmarkNode* node) { |
| 1087 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, | 1083 for (BookmarkModelObserver& observer : observers_) |
| 1088 BookmarkNodeFaviconChanged(this, node)); | 1084 observer.BookmarkNodeFaviconChanged(this, node); |
| 1089 } | 1085 } |
| 1090 | 1086 |
| 1091 void BookmarkModel::CancelPendingFaviconLoadRequests(BookmarkNode* node) { | 1087 void BookmarkModel::CancelPendingFaviconLoadRequests(BookmarkNode* node) { |
| 1092 if (node->favicon_load_task_id() != base::CancelableTaskTracker::kBadTaskId) { | 1088 if (node->favicon_load_task_id() != base::CancelableTaskTracker::kBadTaskId) { |
| 1093 cancelable_task_tracker_.TryCancel(node->favicon_load_task_id()); | 1089 cancelable_task_tracker_.TryCancel(node->favicon_load_task_id()); |
| 1094 node->set_favicon_load_task_id(base::CancelableTaskTracker::kBadTaskId); | 1090 node->set_favicon_load_task_id(base::CancelableTaskTracker::kBadTaskId); |
| 1095 } | 1091 } |
| 1096 } | 1092 } |
| 1097 | 1093 |
| 1098 void BookmarkModel::PopulateNodesByURL(BookmarkNode* node) { | 1094 void BookmarkModel::PopulateNodesByURL(BookmarkNode* node) { |
| (...skipping 25 matching lines...) Expand all Loading... |
| 1124 undo_delegate_ = undo_delegate; | 1120 undo_delegate_ = undo_delegate; |
| 1125 if (undo_delegate_) | 1121 if (undo_delegate_) |
| 1126 undo_delegate_->SetUndoProvider(this); | 1122 undo_delegate_->SetUndoProvider(this); |
| 1127 } | 1123 } |
| 1128 | 1124 |
| 1129 BookmarkUndoDelegate* BookmarkModel::undo_delegate() const { | 1125 BookmarkUndoDelegate* BookmarkModel::undo_delegate() const { |
| 1130 return undo_delegate_ ? undo_delegate_ : empty_undo_delegate_.get(); | 1126 return undo_delegate_ ? undo_delegate_ : empty_undo_delegate_.get(); |
| 1131 } | 1127 } |
| 1132 | 1128 |
| 1133 } // namespace bookmarks | 1129 } // namespace bookmarks |
| OLD | NEW |