Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(164)

Side by Side Diff: components/bookmarks/browser/bookmark_model.cc

Issue 1203713002: Limit access to ChromeBookmarkClient to bookmarks code (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@cleanup_bookmark_client
Patch Set: Rebase Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
42 return const_cast<BookmarkPermanentNode*>(node); 42 return const_cast<BookmarkPermanentNode*>(node);
43 } 43 }
44 44
45 // Comparator used when sorting permanent nodes. Nodes that are initially 45 // Comparator used when sorting permanent nodes. Nodes that are initially
46 // visible are sorted before nodes that are initially hidden. 46 // visible are sorted before nodes that are initially hidden.
47 class VisibilityComparator 47 class VisibilityComparator
48 : public std::binary_function<const BookmarkPermanentNode*, 48 : public std::binary_function<const BookmarkPermanentNode*,
49 const BookmarkPermanentNode*, 49 const BookmarkPermanentNode*,
50 bool> { 50 bool> {
51 public: 51 public:
52 explicit VisibilityComparator(BookmarkClient* client) : client_(client) {} 52 explicit VisibilityComparator(BookmarkModel* model) : model_(model) {}
53 53
54 // Returns true if |n1| preceeds |n2|. 54 // Returns true if |n1| preceeds |n2|.
55 bool operator()(const BookmarkPermanentNode* n1, 55 bool operator()(const BookmarkPermanentNode* n1,
56 const BookmarkPermanentNode* n2) { 56 const BookmarkPermanentNode* n2) {
57 bool n1_visible = client_->IsPermanentNodeVisible(n1); 57 bool n1_visible = model_->IsPermanentNodeVisible(n1);
58 bool n2_visible = client_->IsPermanentNodeVisible(n2); 58 bool n2_visible = model_->IsPermanentNodeVisible(n2);
59 return n1_visible != n2_visible && n1_visible; 59 return n1_visible != n2_visible && n1_visible;
60 } 60 }
61 61
62 private: 62 private:
63 BookmarkClient* client_; 63 BookmarkModel* model_;
64 }; 64 };
65 65
66 // Comparator used when sorting bookmarks. Folders are sorted first, then 66 // Comparator used when sorting bookmarks. Folders are sorted first, then
67 // bookmarks. 67 // bookmarks.
68 class SortComparator : public std::binary_function<const BookmarkNode*, 68 class SortComparator : public std::binary_function<const BookmarkNode*,
69 const BookmarkNode*, 69 const BookmarkNode*,
70 bool> { 70 bool> {
71 public: 71 public:
72 explicit SortComparator(icu::Collator* collator) : collator_(collator) {} 72 explicit SortComparator(icu::Collator* collator) : collator_(collator) {}
73 73
(...skipping 15 matching lines...) Expand all
89 }; 89 };
90 90
91 } // namespace 91 } // namespace
92 92
93 // BookmarkModel -------------------------------------------------------------- 93 // BookmarkModel --------------------------------------------------------------
94 94
95 BookmarkModel::BookmarkModel(BookmarkClient* client) 95 BookmarkModel::BookmarkModel(BookmarkClient* client)
96 : client_(client), 96 : client_(client),
97 loaded_(false), 97 loaded_(false),
98 root_(GURL()), 98 root_(GURL()),
99 bookmark_bar_node_(NULL), 99 bookmark_bar_node_(nullptr),
100 other_node_(NULL), 100 other_node_(nullptr),
101 mobile_node_(NULL), 101 mobile_node_(nullptr),
102 managed_node_(nullptr),
103 supervised_node_(nullptr),
102 next_node_id_(1), 104 next_node_id_(1),
103 observers_( 105 observers_(
104 base::ObserverList<BookmarkModelObserver>::NOTIFY_EXISTING_ONLY), 106 base::ObserverList<BookmarkModelObserver>::NOTIFY_EXISTING_ONLY),
105 loaded_signal_(true, false), 107 loaded_signal_(true, false),
106 extensive_changes_(0) { 108 extensive_changes_(0) {
107 DCHECK(client_); 109 DCHECK(client_);
108 } 110 }
109 111
110 BookmarkModel::~BookmarkModel() { 112 BookmarkModel::~BookmarkModel() {
111 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, 113 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_,
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
205 207
206 BeginExtensiveChanges(); 208 BeginExtensiveChanges();
207 // Skip deleting permanent nodes. Permanent bookmark nodes are the root and 209 // Skip deleting permanent nodes. Permanent bookmark nodes are the root and
208 // its immediate children. For removing all non permanent nodes just remove 210 // its immediate children. For removing all non permanent nodes just remove
209 // all children of non-root permanent nodes. 211 // all children of non-root permanent nodes.
210 { 212 {
211 base::AutoLock url_lock(url_lock_); 213 base::AutoLock url_lock(url_lock_);
212 for (int i = 0; i < root_.child_count(); ++i) { 214 for (int i = 0; i < root_.child_count(); ++i) {
213 BookmarkNode* permanent_node = root_.GetChild(i); 215 BookmarkNode* permanent_node = root_.GetChild(i);
214 216
215 if (!client_->CanBeEditedByUser(permanent_node)) 217 if (!CanBeEditedByUser(permanent_node))
216 continue; 218 continue;
217 219
218 for (int j = permanent_node->child_count() - 1; j >= 0; --j) { 220 for (int j = permanent_node->child_count() - 1; j >= 0; --j) {
219 BookmarkNode* child_node = permanent_node->GetChild(j); 221 BookmarkNode* child_node = permanent_node->GetChild(j);
220 removed_nodes.push_back(child_node); 222 removed_nodes.push_back(child_node);
221 RemoveNodeAndGetRemovedUrls(child_node, &removed_urls); 223 RemoveNodeAndGetRemovedUrls(child_node, &removed_urls);
222 } 224 }
223 } 225 }
224 } 226 }
225 EndExtensiveChanges(); 227 EndExtensiveChanges();
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
292 294
293 if (store_.get()) 295 if (store_.get())
294 store_->ScheduleSave(); 296 store_->ScheduleSave();
295 } 297 }
296 298
297 const gfx::Image& BookmarkModel::GetFavicon(const BookmarkNode* node) { 299 const gfx::Image& BookmarkModel::GetFavicon(const BookmarkNode* node) {
298 DCHECK(node); 300 DCHECK(node);
299 if (node->favicon_state() == BookmarkNode::INVALID_FAVICON) { 301 if (node->favicon_state() == BookmarkNode::INVALID_FAVICON) {
300 BookmarkNode* mutable_node = AsMutable(node); 302 BookmarkNode* mutable_node = AsMutable(node);
301 LoadFavicon(mutable_node, 303 LoadFavicon(mutable_node,
302 client_->PreferTouchIcon() ? favicon_base::TOUCH_ICON 304 PreferTouchIcon() ? favicon_base::TOUCH_ICON
303 : favicon_base::FAVICON); 305 : favicon_base::FAVICON);
304 } 306 }
305 return node->favicon(); 307 return node->favicon();
306 } 308 }
307 309
308 favicon_base::IconType BookmarkModel::GetFaviconType(const BookmarkNode* node) { 310 favicon_base::IconType BookmarkModel::GetFaviconType(const BookmarkNode* node) {
309 DCHECK(node); 311 DCHECK(node);
310 return node->favicon_type(); 312 return node->favicon_type();
311 } 313 }
312 314
313 void BookmarkModel::SetTitle(const BookmarkNode* node, 315 void BookmarkModel::SetTitle(const BookmarkNode* node,
314 const base::string16& title) { 316 const base::string16& title) {
315 DCHECK(node); 317 DCHECK(node);
316 318
317 if (node->GetTitle() == title) 319 if (node->GetTitle() == title)
318 return; 320 return;
319 321
320 if (is_permanent_node(node) && !client_->CanSetPermanentNodeTitle(node)) { 322 if (is_permanent_node(node) && !CanSetPermanentNodeTitle(node)) {
321 NOTREACHED(); 323 NOTREACHED();
322 return; 324 return;
323 } 325 }
324 326
325 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, 327 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_,
326 OnWillChangeBookmarkNode(this, node)); 328 OnWillChangeBookmarkNode(this, node));
327 329
328 // The title index doesn't support changing the title, instead we remove then 330 // The title index doesn't support changing the title, instead we remove then
329 // add it back. 331 // add it back.
330 index_->Remove(node); 332 index_->Remove(node);
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
417 BookmarkMetaInfoChanged(this, node)); 419 BookmarkMetaInfoChanged(this, node));
418 } 420 }
419 421
420 void BookmarkModel::AddNonClonedKey(const std::string& key) { 422 void BookmarkModel::AddNonClonedKey(const std::string& key) {
421 non_cloned_keys_.insert(key); 423 non_cloned_keys_.insert(key);
422 } 424 }
423 425
424 void BookmarkModel::SetNodeSyncTransactionVersion( 426 void BookmarkModel::SetNodeSyncTransactionVersion(
425 const BookmarkNode* node, 427 const BookmarkNode* node,
426 int64 sync_transaction_version) { 428 int64 sync_transaction_version) {
427 DCHECK(client_->CanSyncNode(node)); 429 DCHECK(CanSyncNode(node));
428 430
429 if (sync_transaction_version == node->sync_transaction_version()) 431 if (sync_transaction_version == node->sync_transaction_version())
430 return; 432 return;
431 433
432 AsMutable(node)->set_sync_transaction_version(sync_transaction_version); 434 AsMutable(node)->set_sync_transaction_version(sync_transaction_version);
433 if (store_.get()) 435 if (store_.get())
434 store_->ScheduleSave(); 436 store_->ScheduleSave();
435 } 437 }
436 438
437 void BookmarkModel::OnFaviconChanged(const std::set<GURL>& urls) { 439 void BookmarkModel::OnFaviconChanged(const std::set<GURL>& urls) {
(...skipping 10 matching lines...) Expand all
448 BookmarkNode* node = AsMutable(nodes[i]); 450 BookmarkNode* node = AsMutable(nodes[i]);
449 node->InvalidateFavicon(); 451 node->InvalidateFavicon();
450 CancelPendingFaviconLoadRequests(node); 452 CancelPendingFaviconLoadRequests(node);
451 FOR_EACH_OBSERVER(BookmarkModelObserver, 453 FOR_EACH_OBSERVER(BookmarkModelObserver,
452 observers_, 454 observers_,
453 BookmarkNodeFaviconChanged(this, node)); 455 BookmarkNodeFaviconChanged(this, node));
454 } 456 }
455 } 457 }
456 } 458 }
457 459
460 bool BookmarkModel::CanSyncNode(const BookmarkNode* node) {
461 return !bookmarks::IsDescendantOf(node, managed_node_) &&
462 !bookmarks::IsDescendantOf(node, supervised_node_);
463 }
464
465 bool BookmarkModel::CanBeEditedByUser(const BookmarkNode* node) {
466 return !bookmarks::IsDescendantOf(node, managed_node_) &&
467 !bookmarks::IsDescendantOf(node, supervised_node_);
468 }
469
470 bool BookmarkModel::IsPermanentNodeVisible(const BookmarkPermanentNode* node) {
471 DCHECK(IsTopLevelPermanentNode(node));
472 if (node == supervised_node_ || node == managed_node_)
473 return false;
474 #if !defined(OS_IOS)
475 return node->type() != BookmarkNode::MOBILE;
476 #else
477 return node->type() == BookmarkNode::MOBILE;
478 #endif
479 }
480
481 void BookmarkModel::RecordAction(const base::UserMetricsAction& action) {
482 client_->RecordAction(action);
483 }
484
458 void BookmarkModel::SetDateAdded(const BookmarkNode* node, Time date_added) { 485 void BookmarkModel::SetDateAdded(const BookmarkNode* node, Time date_added) {
459 DCHECK(node && !is_permanent_node(node)); 486 DCHECK(node && !is_permanent_node(node));
460 487
461 if (node->date_added() == date_added) 488 if (node->date_added() == date_added)
462 return; 489 return;
463 490
464 AsMutable(node)->set_date_added(date_added); 491 AsMutable(node)->set_date_added(date_added);
465 492
466 // Syncing might result in dates newer than the folder's last modified date. 493 // Syncing might result in dates newer than the folder's last modified date.
467 if (date_added > node->parent()->date_folder_modified()) { 494 if (date_added > node->parent()->date_folder_modified()) {
(...skipping 16 matching lines...) Expand all
484 } 511 }
485 512
486 const BookmarkNode* BookmarkModel::GetMostRecentlyAddedUserNodeForURL( 513 const BookmarkNode* BookmarkModel::GetMostRecentlyAddedUserNodeForURL(
487 const GURL& url) { 514 const GURL& url) {
488 std::vector<const BookmarkNode*> nodes; 515 std::vector<const BookmarkNode*> nodes;
489 GetNodesByURL(url, &nodes); 516 GetNodesByURL(url, &nodes);
490 std::sort(nodes.begin(), nodes.end(), &MoreRecentlyAdded); 517 std::sort(nodes.begin(), nodes.end(), &MoreRecentlyAdded);
491 518
492 // Look for the first node that the user can edit. 519 // Look for the first node that the user can edit.
493 for (size_t i = 0; i < nodes.size(); ++i) { 520 for (size_t i = 0; i < nodes.size(); ++i) {
494 if (client_->CanBeEditedByUser(nodes[i])) 521 if (CanBeEditedByUser(nodes[i]))
495 return nodes[i]; 522 return nodes[i];
496 } 523 }
497 524
498 return NULL; 525 return nullptr;
499 } 526 }
500 527
501 bool BookmarkModel::HasBookmarks() { 528 bool BookmarkModel::HasBookmarks() {
502 base::AutoLock url_lock(url_lock_); 529 base::AutoLock url_lock(url_lock_);
503 return !nodes_ordered_by_url_set_.empty(); 530 return !nodes_ordered_by_url_set_.empty();
504 } 531 }
505 532
506 bool BookmarkModel::IsBookmarked(const GURL& url) { 533 bool BookmarkModel::IsBookmarked(const GURL& url) {
507 base::AutoLock url_lock(url_lock_); 534 base::AutoLock url_lock(url_lock_);
508 return IsBookmarkedNoLock(url); 535 return IsBookmarkedNoLock(url);
509 } 536 }
510 537
511 void BookmarkModel::GetBookmarks( 538 void BookmarkModel::GetBookmarks(
512 std::vector<BookmarkModel::URLAndTitle>* bookmarks) { 539 std::vector<BookmarkModel::URLAndTitle>* bookmarks) {
513 base::AutoLock url_lock(url_lock_); 540 base::AutoLock url_lock(url_lock_);
514 const GURL* last_url = NULL; 541 const GURL* last_url = nullptr;
515 for (NodesOrderedByURLSet::iterator i = nodes_ordered_by_url_set_.begin(); 542 for (NodesOrderedByURLSet::iterator i = nodes_ordered_by_url_set_.begin();
516 i != nodes_ordered_by_url_set_.end(); ++i) { 543 i != nodes_ordered_by_url_set_.end(); ++i) {
517 const GURL* url = &((*i)->url()); 544 const GURL* url = &((*i)->url());
518 // Only add unique URLs. 545 // Only add unique URLs.
519 if (!last_url || *url != *last_url) { 546 if (!last_url || *url != *last_url) {
520 BookmarkModel::URLAndTitle bookmark; 547 BookmarkModel::URLAndTitle bookmark;
521 bookmark.url = *url; 548 bookmark.url = *url;
522 bookmark.title = (*i)->GetTitle(); 549 bookmark.title = (*i)->GetTitle();
523 bookmarks->push_back(bookmark); 550 bookmarks->push_back(bookmark);
524 } 551 }
525 last_url = url; 552 last_url = url;
526 } 553 }
527 } 554 }
528 555
529 void BookmarkModel::BlockTillLoaded() { 556 void BookmarkModel::BlockTillLoaded() {
530 loaded_signal_.Wait(); 557 loaded_signal_.Wait();
531 } 558 }
532 559
533 const BookmarkNode* BookmarkModel::AddFolder(const BookmarkNode* parent, 560 const BookmarkNode* BookmarkModel::AddFolder(const BookmarkNode* parent,
534 int index, 561 int index,
535 const base::string16& title) { 562 const base::string16& title) {
536 return AddFolderWithMetaInfo(parent, index, title, NULL); 563 return AddFolderWithMetaInfo(parent, index, title, nullptr);
537 } 564 }
538 const BookmarkNode* BookmarkModel::AddFolderWithMetaInfo( 565 const BookmarkNode* BookmarkModel::AddFolderWithMetaInfo(
539 const BookmarkNode* parent, 566 const BookmarkNode* parent,
540 int index, 567 int index,
541 const base::string16& title, 568 const base::string16& title,
542 const BookmarkNode::MetaInfoMap* meta_info) { 569 const BookmarkNode::MetaInfoMap* meta_info) {
543 if (!loaded_ || is_root_node(parent) || !IsValidIndex(parent, index, true)) { 570 if (!loaded_ || is_root_node(parent) || !IsValidIndex(parent, index, true)) {
544 // Can't add to the root. 571 // Can't add to the root.
545 NOTREACHED(); 572 NOTREACHED();
546 return NULL; 573 return nullptr;
547 } 574 }
548 575
549 BookmarkNode* new_node = new BookmarkNode(generate_next_node_id(), GURL()); 576 BookmarkNode* new_node = new BookmarkNode(generate_next_node_id(), GURL());
550 new_node->set_date_folder_modified(Time::Now()); 577 new_node->set_date_folder_modified(Time::Now());
551 // Folders shouldn't have line breaks in their titles. 578 // Folders shouldn't have line breaks in their titles.
552 new_node->SetTitle(title); 579 new_node->SetTitle(title);
553 new_node->set_type(BookmarkNode::FOLDER); 580 new_node->set_type(BookmarkNode::FOLDER);
554 if (meta_info) 581 if (meta_info)
555 new_node->SetMetaInfoMap(*meta_info); 582 new_node->SetMetaInfoMap(*meta_info);
556 583
557 return AddNode(AsMutable(parent), index, new_node); 584 return AddNode(AsMutable(parent), index, new_node);
558 } 585 }
559 586
560 const BookmarkNode* BookmarkModel::AddURL(const BookmarkNode* parent, 587 const BookmarkNode* BookmarkModel::AddURL(const BookmarkNode* parent,
561 int index, 588 int index,
562 const base::string16& title, 589 const base::string16& title,
563 const GURL& url) { 590 const GURL& url) {
564 return AddURLWithCreationTimeAndMetaInfo( 591 return AddURLWithCreationTimeAndMetaInfo(
565 parent, 592 parent,
566 index, 593 index,
567 base::CollapseWhitespace(title, false), 594 base::CollapseWhitespace(title, false),
568 url, 595 url,
569 Time::Now(), 596 Time::Now(),
570 NULL); 597 nullptr);
571 } 598 }
572 599
573 const BookmarkNode* BookmarkModel::AddURLWithCreationTimeAndMetaInfo( 600 const BookmarkNode* BookmarkModel::AddURLWithCreationTimeAndMetaInfo(
574 const BookmarkNode* parent, 601 const BookmarkNode* parent,
575 int index, 602 int index,
576 const base::string16& title, 603 const base::string16& title,
577 const GURL& url, 604 const GURL& url,
578 const Time& creation_time, 605 const Time& creation_time,
579 const BookmarkNode::MetaInfoMap* meta_info) { 606 const BookmarkNode::MetaInfoMap* meta_info) {
580 if (!loaded_ || !url.is_valid() || is_root_node(parent) || 607 if (!loaded_ || !url.is_valid() || is_root_node(parent) ||
581 !IsValidIndex(parent, index, true)) { 608 !IsValidIndex(parent, index, true)) {
582 NOTREACHED(); 609 NOTREACHED();
583 return NULL; 610 return nullptr;
584 } 611 }
585 612
586 // Syncing may result in dates newer than the last modified date. 613 // Syncing may result in dates newer than the last modified date.
587 if (creation_time > parent->date_folder_modified()) 614 if (creation_time > parent->date_folder_modified())
588 SetDateFolderModified(parent, creation_time); 615 SetDateFolderModified(parent, creation_time);
589 616
590 BookmarkNode* new_node = new BookmarkNode(generate_next_node_id(), url); 617 BookmarkNode* new_node = new BookmarkNode(generate_next_node_id(), url);
591 new_node->SetTitle(title); 618 new_node->SetTitle(title);
592 new_node->set_date_added(creation_time); 619 new_node->set_date_added(creation_time);
593 new_node->set_type(BookmarkNode::URL); 620 new_node->set_type(BookmarkNode::URL);
594 if (meta_info) 621 if (meta_info)
595 new_node->SetMetaInfoMap(*meta_info); 622 new_node->SetMetaInfoMap(*meta_info);
596 623
597 return AddNode(AsMutable(parent), index, new_node); 624 return AddNode(AsMutable(parent), index, new_node);
598 } 625 }
599 626
600 void BookmarkModel::SortChildren(const BookmarkNode* parent) { 627 void BookmarkModel::SortChildren(const BookmarkNode* parent) {
601 DCHECK(client_->CanBeEditedByUser(parent)); 628 DCHECK(CanBeEditedByUser(parent));
602 629
603 if (!parent || !parent->is_folder() || is_root_node(parent) || 630 if (!parent || !parent->is_folder() || is_root_node(parent) ||
604 parent->child_count() <= 1) { 631 parent->child_count() <= 1) {
605 return; 632 return;
606 } 633 }
607 634
608 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, 635 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_,
609 OnWillReorderBookmarkNode(this, parent)); 636 OnWillReorderBookmarkNode(this, parent));
610 637
611 UErrorCode error = U_ZERO_ERROR; 638 UErrorCode error = U_ZERO_ERROR;
612 scoped_ptr<icu::Collator> collator(icu::Collator::createInstance(error)); 639 scoped_ptr<icu::Collator> collator(icu::Collator::createInstance(error));
613 if (U_FAILURE(error)) 640 if (U_FAILURE(error))
614 collator.reset(NULL); 641 collator.reset(nullptr);
615 BookmarkNode* mutable_parent = AsMutable(parent); 642 BookmarkNode* mutable_parent = AsMutable(parent);
616 std::sort(mutable_parent->children().begin(), 643 std::sort(mutable_parent->children().begin(),
617 mutable_parent->children().end(), 644 mutable_parent->children().end(),
618 SortComparator(collator.get())); 645 SortComparator(collator.get()));
619 646
620 if (store_.get()) 647 if (store_.get())
621 store_->ScheduleSave(); 648 store_->ScheduleSave();
622 649
623 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, 650 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_,
624 BookmarkNodeChildrenReordered(this, parent)); 651 BookmarkNodeChildrenReordered(this, parent));
625 } 652 }
626 653
627 void BookmarkModel::ReorderChildren( 654 void BookmarkModel::ReorderChildren(
628 const BookmarkNode* parent, 655 const BookmarkNode* parent,
629 const std::vector<const BookmarkNode*>& ordered_nodes) { 656 const std::vector<const BookmarkNode*>& ordered_nodes) {
630 DCHECK(client_->CanBeEditedByUser(parent)); 657 DCHECK(CanBeEditedByUser(parent));
631 658
632 // Ensure that all children in |parent| are in |ordered_nodes|. 659 // Ensure that all children in |parent| are in |ordered_nodes|.
633 DCHECK_EQ(static_cast<size_t>(parent->child_count()), ordered_nodes.size()); 660 DCHECK_EQ(static_cast<size_t>(parent->child_count()), ordered_nodes.size());
634 for (size_t i = 0; i < ordered_nodes.size(); ++i) 661 for (size_t i = 0; i < ordered_nodes.size(); ++i)
635 DCHECK_EQ(parent, ordered_nodes[i]->parent()); 662 DCHECK_EQ(parent, ordered_nodes[i]->parent());
636 663
637 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, 664 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_,
638 OnWillReorderBookmarkNode(this, parent)); 665 OnWillReorderBookmarkNode(this, parent));
639 666
640 AsMutable(parent)->SetChildren( 667 AsMutable(parent)->SetChildren(
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
678 index_->GetBookmarksMatching(text, max_count, matching_algorithm, matches); 705 index_->GetBookmarksMatching(text, max_count, matching_algorithm, matches);
679 } 706 }
680 707
681 void BookmarkModel::ClearStore() { 708 void BookmarkModel::ClearStore() {
682 store_.reset(); 709 store_.reset();
683 } 710 }
684 711
685 void BookmarkModel::SetPermanentNodeVisible(BookmarkNode::Type type, 712 void BookmarkModel::SetPermanentNodeVisible(BookmarkNode::Type type,
686 bool value) { 713 bool value) {
687 BookmarkPermanentNode* node = AsMutable(PermanentNode(type)); 714 BookmarkPermanentNode* node = AsMutable(PermanentNode(type));
688 node->set_visible(value || client_->IsPermanentNodeVisible(node)); 715 node->set_visible(value || IsPermanentNodeVisible(node));
689 } 716 }
690 717
691 const BookmarkPermanentNode* BookmarkModel::PermanentNode( 718 const BookmarkPermanentNode* BookmarkModel::PermanentNode(
692 BookmarkNode::Type type) { 719 BookmarkNode::Type type) {
693 DCHECK(loaded_); 720 DCHECK(loaded_);
694 switch (type) { 721 switch (type) {
695 case BookmarkNode::BOOKMARK_BAR: 722 case BookmarkNode::BOOKMARK_BAR:
696 return bookmark_bar_node_; 723 return bookmark_bar_node_;
697 case BookmarkNode::OTHER_NODE: 724 case BookmarkNode::OTHER_NODE:
698 return other_node_; 725 return other_node_;
699 case BookmarkNode::MOBILE: 726 case BookmarkNode::MOBILE:
700 return mobile_node_; 727 return mobile_node_;
701 default: 728 default:
702 NOTREACHED(); 729 NOTREACHED();
703 return NULL; 730 return nullptr;
704 } 731 }
705 } 732 }
706 733
707 bool BookmarkModel::IsBookmarkedNoLock(const GURL& url) { 734 bool BookmarkModel::IsBookmarkedNoLock(const GURL& url) {
708 BookmarkNode tmp_node(url); 735 BookmarkNode tmp_node(url);
709 return (nodes_ordered_by_url_set_.find(&tmp_node) != 736 return (nodes_ordered_by_url_set_.find(&tmp_node) !=
710 nodes_ordered_by_url_set_.end()); 737 nodes_ordered_by_url_set_.end());
711 } 738 }
712 739
713 void BookmarkModel::RemoveNode(BookmarkNode* node, 740 void BookmarkModel::RemoveNode(BookmarkNode* node,
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
782 for (size_t i = 0; i < extra_nodes.size(); ++i) 809 for (size_t i = 0; i < extra_nodes.size(); ++i)
783 root_children.push_back(extra_nodes[i]); 810 root_children.push_back(extra_nodes[i]);
784 811
785 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/467179 812 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/467179
786 // is fixed. 813 // is fixed.
787 tracked_objects::ScopedTracker tracking_profile4( 814 tracked_objects::ScopedTracker tracking_profile4(
788 FROM_HERE_WITH_EXPLICIT_FUNCTION("467179 BookmarkModel::DoneLoading4")); 815 FROM_HERE_WITH_EXPLICIT_FUNCTION("467179 BookmarkModel::DoneLoading4"));
789 816
790 std::stable_sort(root_children.begin(), 817 std::stable_sort(root_children.begin(),
791 root_children.end(), 818 root_children.end(),
792 VisibilityComparator(client_)); 819 VisibilityComparator(this));
793 for (size_t i = 0; i < root_children.size(); ++i) 820 for (size_t i = 0; i < root_children.size(); ++i)
794 root_.Add(root_children[i], static_cast<int>(i)); 821 root_.Add(root_children[i], static_cast<int>(i));
795 822
796 root_.SetMetaInfoMap(details->model_meta_info_map()); 823 root_.SetMetaInfoMap(details->model_meta_info_map());
797 root_.set_sync_transaction_version(details->model_sync_transaction_version()); 824 root_.set_sync_transaction_version(details->model_sync_transaction_version());
798 825
799 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/467179 826 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/467179
800 // is fixed. 827 // is fixed.
801 tracked_objects::ScopedTracker tracking_profile5( 828 tracked_objects::ScopedTracker tracking_profile5(
802 FROM_HERE_WITH_EXPLICIT_FUNCTION("467179 BookmarkModel::DoneLoading5")); 829 FROM_HERE_WITH_EXPLICIT_FUNCTION("467179 BookmarkModel::DoneLoading5"));
803 830
804 { 831 {
805 base::AutoLock url_lock(url_lock_); 832 base::AutoLock url_lock(url_lock_);
806 // Update nodes_ordered_by_url_set_ from the nodes. 833 // Update nodes_ordered_by_url_set_ from the nodes.
807 PopulateNodesByURL(&root_); 834 PopulateNodesByURL(&root_);
808 } 835 }
809 836
810 loaded_ = true; 837 loaded_ = true;
811 838
812 loaded_signal_.Signal(); 839 loaded_signal_.Signal();
813 840
814 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/467179 841 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/467179
815 // is fixed. 842 // is fixed.
816 tracked_objects::ScopedTracker tracking_profile6( 843 tracked_objects::ScopedTracker tracking_profile6(
817 FROM_HERE_WITH_EXPLICIT_FUNCTION("467179 BookmarkModel::DoneLoading6")); 844 FROM_HERE_WITH_EXPLICIT_FUNCTION("467179 BookmarkModel::DoneLoading6"));
818 845
819 // Notify our direct observers. 846 // Notify our direct observers.
820 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, 847 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_,
821 BookmarkModelLoaded(this, details->ids_reassigned())); 848 BookmarkModelLoaded(this, details->ids_reassigned()));
849
850 // Notify client.
851 client_->DoneLoading(managed_node_, supervised_node_);
822 } 852 }
823 853
824 void BookmarkModel::RemoveAndDeleteNode(BookmarkNode* delete_me) { 854 void BookmarkModel::RemoveAndDeleteNode(BookmarkNode* delete_me) {
825 scoped_ptr<BookmarkNode> node(delete_me); 855 scoped_ptr<BookmarkNode> node(delete_me);
826 856
827 const BookmarkNode* parent = node->parent(); 857 const BookmarkNode* parent = node->parent();
828 DCHECK(parent); 858 DCHECK(parent);
829 int index = parent->GetIndexOf(node.get()); 859 int index = parent->GetIndexOf(node.get());
830 DCHECK_NE(-1, index); 860 DCHECK_NE(-1, index);
831 861
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
923 } 953 }
924 954
925 BookmarkPermanentNode* BookmarkModel::CreatePermanentNode( 955 BookmarkPermanentNode* BookmarkModel::CreatePermanentNode(
926 BookmarkNode::Type type) { 956 BookmarkNode::Type type) {
927 DCHECK(type == BookmarkNode::BOOKMARK_BAR || 957 DCHECK(type == BookmarkNode::BOOKMARK_BAR ||
928 type == BookmarkNode::OTHER_NODE || 958 type == BookmarkNode::OTHER_NODE ||
929 type == BookmarkNode::MOBILE); 959 type == BookmarkNode::MOBILE);
930 BookmarkPermanentNode* node = 960 BookmarkPermanentNode* node =
931 new BookmarkPermanentNode(generate_next_node_id()); 961 new BookmarkPermanentNode(generate_next_node_id());
932 node->set_type(type); 962 node->set_type(type);
933 node->set_visible(client_->IsPermanentNodeVisible(node)); 963 node->set_visible(IsPermanentNodeVisible(node));
934 964
935 int title_id; 965 int title_id;
936 switch (type) { 966 switch (type) {
937 case BookmarkNode::BOOKMARK_BAR: 967 case BookmarkNode::BOOKMARK_BAR:
938 title_id = IDS_BOOKMARK_BAR_FOLDER_NAME; 968 title_id = IDS_BOOKMARK_BAR_FOLDER_NAME;
939 break; 969 break;
940 case BookmarkNode::OTHER_NODE: 970 case BookmarkNode::OTHER_NODE:
941 title_id = IDS_BOOKMARK_BAR_OTHER_FOLDER_NAME; 971 title_id = IDS_BOOKMARK_BAR_OTHER_FOLDER_NAME;
942 break; 972 break;
943 case BookmarkNode::MOBILE: 973 case BookmarkNode::MOBILE:
(...skipping 15 matching lines...) Expand all
959 DCHECK(node); 989 DCHECK(node);
960 node->set_favicon_load_task_id(base::CancelableTaskTracker::kBadTaskId); 990 node->set_favicon_load_task_id(base::CancelableTaskTracker::kBadTaskId);
961 node->set_favicon_state(BookmarkNode::LOADED_FAVICON); 991 node->set_favicon_state(BookmarkNode::LOADED_FAVICON);
962 if (!image_result.image.IsEmpty()) { 992 if (!image_result.image.IsEmpty()) {
963 node->set_favicon_type(icon_type); 993 node->set_favicon_type(icon_type);
964 node->set_favicon(image_result.image); 994 node->set_favicon(image_result.image);
965 node->set_icon_url(image_result.icon_url); 995 node->set_icon_url(image_result.icon_url);
966 FaviconLoaded(node); 996 FaviconLoaded(node);
967 } else if (icon_type == favicon_base::TOUCH_ICON) { 997 } else if (icon_type == favicon_base::TOUCH_ICON) {
968 // Couldn't load the touch icon, fallback to the regular favicon. 998 // Couldn't load the touch icon, fallback to the regular favicon.
969 DCHECK(client_->PreferTouchIcon()); 999 DCHECK(PreferTouchIcon());
970 LoadFavicon(node, favicon_base::FAVICON); 1000 LoadFavicon(node, favicon_base::FAVICON);
971 } 1001 }
972 } 1002 }
973 1003
974 void BookmarkModel::LoadFavicon(BookmarkNode* node, 1004 void BookmarkModel::LoadFavicon(BookmarkNode* node,
975 favicon_base::IconType icon_type) { 1005 favicon_base::IconType icon_type) {
976 if (node->is_folder()) 1006 if (node->is_folder())
977 return; 1007 return;
978 1008
979 DCHECK(node->url().is_valid()); 1009 DCHECK(node->url().is_valid());
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1018 } 1048 }
1019 1049
1020 scoped_ptr<BookmarkLoadDetails> BookmarkModel::CreateLoadDetails( 1050 scoped_ptr<BookmarkLoadDetails> BookmarkModel::CreateLoadDetails(
1021 const std::string& accept_languages) { 1051 const std::string& accept_languages) {
1022 BookmarkPermanentNode* bb_node = 1052 BookmarkPermanentNode* bb_node =
1023 CreatePermanentNode(BookmarkNode::BOOKMARK_BAR); 1053 CreatePermanentNode(BookmarkNode::BOOKMARK_BAR);
1024 BookmarkPermanentNode* other_node = 1054 BookmarkPermanentNode* other_node =
1025 CreatePermanentNode(BookmarkNode::OTHER_NODE); 1055 CreatePermanentNode(BookmarkNode::OTHER_NODE);
1026 BookmarkPermanentNode* mobile_node = 1056 BookmarkPermanentNode* mobile_node =
1027 CreatePermanentNode(BookmarkNode::MOBILE); 1057 CreatePermanentNode(BookmarkNode::MOBILE);
1058 // Create the managed_node and supervised_node with a temporary id of 0 now.
1059 // They will be populated and assigned property ids by the LoadExtraCallback
1060 // returned by GetLoadExtraNodesCallback(). Ownership of the node is
1061 // transferred to the closure.
1062 scoped_ptr<BookmarkPermanentNode> managed_node(new BookmarkPermanentNode(0));
1063 scoped_ptr<BookmarkPermanentNode> supervised_node(
1064 new BookmarkPermanentNode(0));
1028 return scoped_ptr<BookmarkLoadDetails>(new BookmarkLoadDetails( 1065 return scoped_ptr<BookmarkLoadDetails>(new BookmarkLoadDetails(
1029 bb_node, 1066 bb_node, other_node, mobile_node,
1030 other_node, 1067 client_->GetLoadExtraNodesCallback(
1031 mobile_node, 1068 managed_node.Pass(), supervised_node.Pass(),
1032 client_->GetLoadExtraNodesCallback(), 1069 base::Bind(&BookmarkModel::OnExtraNodeLoaded,
1033 new BookmarkIndex(client_, accept_languages), 1070 base::Unretained(this))),
1034 next_node_id_)); 1071 new BookmarkIndex(client_, accept_languages), next_node_id_));
1072 }
1073
1074 void BookmarkModel::OnExtraNodeLoaded(BookmarkPermanentNode* managed_node,
1075 BookmarkPermanentNode* supervised_node) {
1076 managed_node_ = managed_node;
1077 supervised_node_ = supervised_node;
1078 }
1079
1080 bool BookmarkModel::IsTopLevelPermanentNode(const BookmarkPermanentNode* node) {
1081 return node->type() == BookmarkNode::BOOKMARK_BAR ||
1082 node->type() == BookmarkNode::OTHER_NODE ||
1083 node->type() == BookmarkNode::MOBILE ||
1084 node == supervised_node_ ||
1085 node == managed_node_;
1086 }
1087
1088 bool BookmarkModel::CanSetPermanentNodeTitle(const BookmarkNode* node) {
1089 // The |managed_node_| can have its title updated if the user signs in or
1090 // out, since the name of the managed domain can appear in it.
1091 // Also, both |managed_node_| and |supervised_node_| can have their title
1092 // updated on locale changes (crbug.com/459448).
1093 return (!bookmarks::IsDescendantOf(node, managed_node_) &&
1094 !bookmarks::IsDescendantOf(node, supervised_node_)) ||
1095 node == managed_node_ || node == supervised_node_;
1096 }
1097
1098 bool BookmarkModel::PreferTouchIcon() {
1099 #if !defined(OS_IOS)
1100 return false;
1101 #else
1102 return true;
1103 #endif
1035 } 1104 }
1036 1105
1037 } // namespace bookmarks 1106 } // namespace bookmarks
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698