Chromium Code Reviews| 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 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| 11 #include "base/bind_helpers.h" | 11 #include "base/bind_helpers.h" |
| 12 #include "base/i18n/string_compare.h" | 12 #include "base/i18n/string_compare.h" |
| 13 #include "base/logging.h" | 13 #include "base/logging.h" |
| 14 #include "base/macros.h" | 14 #include "base/macros.h" |
| 15 #include "base/strings/string_util.h" | 15 #include "base/strings/string_util.h" |
| 16 #include "base/values.h" | |
| 16 #include "components/bookmarks/browser/bookmark_expanded_state_tracker.h" | 17 #include "components/bookmarks/browser/bookmark_expanded_state_tracker.h" |
| 17 #include "components/bookmarks/browser/bookmark_index.h" | 18 #include "components/bookmarks/browser/bookmark_index.h" |
| 18 #include "components/bookmarks/browser/bookmark_match.h" | 19 #include "components/bookmarks/browser/bookmark_match.h" |
| 19 #include "components/bookmarks/browser/bookmark_model_observer.h" | 20 #include "components/bookmarks/browser/bookmark_model_observer.h" |
| 20 #include "components/bookmarks/browser/bookmark_node_data.h" | 21 #include "components/bookmarks/browser/bookmark_node_data.h" |
| 21 #include "components/bookmarks/browser/bookmark_storage.h" | 22 #include "components/bookmarks/browser/bookmark_storage.h" |
| 22 #include "components/bookmarks/browser/bookmark_utils.h" | 23 #include "components/bookmarks/browser/bookmark_utils.h" |
| 24 #include "components/bookmarks/browser/managed_bookmarks_tracker.h" | |
| 23 #include "components/favicon_base/favicon_types.h" | 25 #include "components/favicon_base/favicon_types.h" |
| 24 #include "grit/components_strings.h" | 26 #include "grit/components_strings.h" |
| 25 #include "ui/base/l10n/l10n_util.h" | 27 #include "ui/base/l10n/l10n_util.h" |
| 26 #include "ui/gfx/favicon_size.h" | 28 #include "ui/gfx/favicon_size.h" |
| 27 | 29 |
| 28 using base::Time; | 30 using base::Time; |
| 29 using bookmarks::BookmarkLoadDetails; | 31 using bookmarks::BookmarkLoadDetails; |
| 30 using bookmarks::BookmarkStorage; | 32 using bookmarks::BookmarkStorage; |
| 31 | 33 |
| 32 namespace { | 34 namespace { |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 91 | 93 |
| 92 // BookmarkModel -------------------------------------------------------------- | 94 // BookmarkModel -------------------------------------------------------------- |
| 93 | 95 |
| 94 BookmarkModel::BookmarkModel(BookmarkClient* client, bool index_urls) | 96 BookmarkModel::BookmarkModel(BookmarkClient* client, bool index_urls) |
| 95 : client_(client), | 97 : client_(client), |
| 96 loaded_(false), | 98 loaded_(false), |
| 97 root_(GURL()), | 99 root_(GURL()), |
| 98 bookmark_bar_node_(NULL), | 100 bookmark_bar_node_(NULL), |
| 99 other_node_(NULL), | 101 other_node_(NULL), |
| 100 mobile_node_(NULL), | 102 mobile_node_(NULL), |
| 103 managed_node_(NULL), | |
| 101 next_node_id_(1), | 104 next_node_id_(1), |
| 102 observers_(ObserverList<BookmarkModelObserver>::NOTIFY_EXISTING_ONLY), | 105 observers_(ObserverList<BookmarkModelObserver>::NOTIFY_EXISTING_ONLY), |
| 103 index_urls_(index_urls), | 106 index_urls_(index_urls), |
| 104 loaded_signal_(true, false), | 107 loaded_signal_(true, false), |
| 105 extensive_changes_(0) { | 108 extensive_changes_(0) { |
| 106 DCHECK(client_); | 109 DCHECK(client_); |
| 107 } | 110 } |
| 108 | 111 |
| 109 BookmarkModel::~BookmarkModel() { | 112 BookmarkModel::~BookmarkModel() { |
| 110 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, | 113 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 134 const scoped_refptr<base::SequencedTaskRunner>& ui_task_runner) { | 137 const scoped_refptr<base::SequencedTaskRunner>& ui_task_runner) { |
| 135 if (store_.get()) { | 138 if (store_.get()) { |
| 136 // If the store is non-null, it means Load was already invoked. Load should | 139 // If the store is non-null, it means Load was already invoked. Load should |
| 137 // only be invoked once. | 140 // only be invoked once. |
| 138 NOTREACHED(); | 141 NOTREACHED(); |
| 139 return; | 142 return; |
| 140 } | 143 } |
| 141 | 144 |
| 142 expanded_state_tracker_.reset( | 145 expanded_state_tracker_.reset( |
| 143 new BookmarkExpandedStateTracker(this, pref_service)); | 146 new BookmarkExpandedStateTracker(this, pref_service)); |
| 147 managed_bookmarks_tracker_.reset( | |
| 148 new ManagedBookmarksTracker(this, pref_service)); | |
| 144 | 149 |
| 145 // Load the bookmarks. BookmarkStorage notifies us when done. | 150 // Load the bookmarks. BookmarkStorage notifies us when done. |
| 146 store_ = new BookmarkStorage(this, profile_path, io_task_runner.get()); | 151 store_ = new BookmarkStorage(this, profile_path, io_task_runner.get()); |
| 147 store_->LoadBookmarks(CreateLoadDetails(accept_languages), ui_task_runner); | 152 store_->LoadBookmarks( |
| 153 CreateLoadDetails(accept_languages), | |
| 154 managed_bookmarks_tracker_->GetInitialManagedBookmarks(), | |
| 155 ui_task_runner); | |
| 156 } | |
| 157 | |
| 158 bool BookmarkModel::IsManaged(const BookmarkNode* node) const { | |
| 159 DCHECK(loaded_); | |
| 160 while (node && node != managed_node()) | |
| 161 node = node->parent(); | |
| 162 return node == managed_node(); | |
| 148 } | 163 } |
| 149 | 164 |
| 150 const BookmarkNode* BookmarkModel::GetParentForNewNodes() { | 165 const BookmarkNode* BookmarkModel::GetParentForNewNodes() { |
| 151 std::vector<const BookmarkNode*> nodes = | 166 std::vector<const BookmarkNode*> nodes = |
| 152 bookmark_utils::GetMostRecentlyModifiedFolders(this, 1); | 167 bookmark_utils::GetMostRecentlyModifiedFolders(this, 1); |
| 153 DCHECK(!nodes.empty()); // This list is always padded with default folders. | 168 DCHECK(!nodes.empty()); // This list is always padded with default folders. |
| 154 return nodes[0]; | 169 return nodes[0]; |
| 155 } | 170 } |
| 156 | 171 |
| 157 void BookmarkModel::AddObserver(BookmarkModelObserver* observer) { | 172 void BookmarkModel::AddObserver(BookmarkModelObserver* observer) { |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 204 OnWillRemoveAllBookmarks(this)); | 219 OnWillRemoveAllBookmarks(this)); |
| 205 | 220 |
| 206 BeginExtensiveChanges(); | 221 BeginExtensiveChanges(); |
| 207 // Skip deleting permanent nodes. Permanent bookmark nodes are the root and | 222 // Skip deleting permanent nodes. Permanent bookmark nodes are the root and |
| 208 // its immediate children. For removing all non permanent nodes just remove | 223 // its immediate children. For removing all non permanent nodes just remove |
| 209 // all children of non-root permanent nodes. | 224 // all children of non-root permanent nodes. |
| 210 { | 225 { |
| 211 base::AutoLock url_lock(url_lock_); | 226 base::AutoLock url_lock(url_lock_); |
| 212 for (int i = 0; i < root_.child_count(); ++i) { | 227 for (int i = 0; i < root_.child_count(); ++i) { |
| 213 BookmarkNode* permanent_node = root_.GetChild(i); | 228 BookmarkNode* permanent_node = root_.GetChild(i); |
| 229 | |
| 230 // The managed bookmarks can't be removed. | |
|
sky
2014/05/30 22:31:37
Not removing managed bookmarks makes this function
Joao da Silva
2014/06/01 13:32:07
Agreed, I'll rename in a subsequent CL.
| |
| 231 if (permanent_node == managed_node()) | |
| 232 continue; | |
| 233 | |
| 214 for (int j = permanent_node->child_count() - 1; j >= 0; --j) { | 234 for (int j = permanent_node->child_count() - 1; j >= 0; --j) { |
| 215 BookmarkNode* child_node = permanent_node->GetChild(j); | 235 BookmarkNode* child_node = permanent_node->GetChild(j); |
| 216 removed_nodes.push_back(child_node); | 236 removed_nodes.push_back(child_node); |
| 217 RemoveNodeAndGetRemovedUrls(child_node, &removed_urls); | 237 RemoveNodeAndGetRemovedUrls(child_node, &removed_urls); |
| 218 } | 238 } |
| 219 } | 239 } |
| 220 } | 240 } |
| 221 EndExtensiveChanges(); | 241 EndExtensiveChanges(); |
| 222 if (store_.get()) | 242 if (store_.get()) |
| 223 store_->ScheduleSave(); | 243 store_->ScheduleSave(); |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 311 | 331 |
| 312 void BookmarkModel::SetTitle(const BookmarkNode* node, | 332 void BookmarkModel::SetTitle(const BookmarkNode* node, |
| 313 const base::string16& title) { | 333 const base::string16& title) { |
| 314 if (!node) { | 334 if (!node) { |
| 315 NOTREACHED(); | 335 NOTREACHED(); |
| 316 return; | 336 return; |
| 317 } | 337 } |
| 318 if (node->GetTitle() == title) | 338 if (node->GetTitle() == title) |
| 319 return; | 339 return; |
| 320 | 340 |
| 321 if (is_permanent_node(node)) { | 341 // The managed node can change its title. |
|
sky
2014/05/30 22:31:37
Why do we want to allow the managed nodes title to
Joao da Silva
2014/06/01 13:32:07
This was the UX decision when we first introduced
| |
| 342 if (is_permanent_node(node) && node != managed_node()) { | |
| 322 NOTREACHED(); | 343 NOTREACHED(); |
| 323 return; | 344 return; |
| 324 } | 345 } |
| 325 | 346 |
| 326 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, | 347 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, |
| 327 OnWillChangeBookmarkNode(this, node)); | 348 OnWillChangeBookmarkNode(this, node)); |
| 328 | 349 |
| 329 // The title index doesn't support changing the title, instead we remove then | 350 // The title index doesn't support changing the title, instead we remove then |
| 330 // add it back. | 351 // add it back. |
| 331 index_->Remove(node); | 352 index_->Remove(node); |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 423 if (AsMutable(node)->DeleteMetaInfo(key) && store_.get()) | 444 if (AsMutable(node)->DeleteMetaInfo(key) && store_.get()) |
| 424 store_->ScheduleSave(); | 445 store_->ScheduleSave(); |
| 425 | 446 |
| 426 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, | 447 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, |
| 427 BookmarkMetaInfoChanged(this, node)); | 448 BookmarkMetaInfoChanged(this, node)); |
| 428 } | 449 } |
| 429 | 450 |
| 430 void BookmarkModel::SetNodeSyncTransactionVersion( | 451 void BookmarkModel::SetNodeSyncTransactionVersion( |
| 431 const BookmarkNode* node, | 452 const BookmarkNode* node, |
| 432 int64 sync_transaction_version) { | 453 int64 sync_transaction_version) { |
| 454 if (IsManaged(node)) { | |
| 455 NOTREACHED(); | |
| 456 return; | |
| 457 } | |
| 433 if (sync_transaction_version == node->sync_transaction_version()) | 458 if (sync_transaction_version == node->sync_transaction_version()) |
| 434 return; | 459 return; |
| 435 | 460 |
| 436 AsMutable(node)->set_sync_transaction_version(sync_transaction_version); | 461 AsMutable(node)->set_sync_transaction_version(sync_transaction_version); |
| 437 if (store_.get()) | 462 if (store_.get()) |
| 438 store_->ScheduleSave(); | 463 store_->ScheduleSave(); |
| 439 } | 464 } |
| 440 | 465 |
| 441 void BookmarkModel::OnFaviconChanged(const std::set<GURL>& urls) { | 466 void BookmarkModel::OnFaviconChanged(const std::set<GURL>& urls) { |
| 442 // Ignore events if |Load| has not been called yet. | 467 // Ignore events if |Load| has not been called yet. |
| (...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 611 | 636 |
| 612 return AddNode(AsMutable(parent), index, new_node); | 637 return AddNode(AsMutable(parent), index, new_node); |
| 613 } | 638 } |
| 614 | 639 |
| 615 void BookmarkModel::SortChildren(const BookmarkNode* parent) { | 640 void BookmarkModel::SortChildren(const BookmarkNode* parent) { |
| 616 if (!parent || !parent->is_folder() || is_root_node(parent) || | 641 if (!parent || !parent->is_folder() || is_root_node(parent) || |
| 617 parent->child_count() <= 1) { | 642 parent->child_count() <= 1) { |
| 618 return; | 643 return; |
| 619 } | 644 } |
| 620 | 645 |
| 646 if (IsManaged(parent)) { | |
|
sky
2014/05/30 22:31:37
Should this be a DCHECK? Same with 673 and 454.
Joao da Silva
2014/06/01 13:32:07
Done.
| |
| 647 NOTREACHED(); | |
| 648 return; | |
| 649 } | |
| 650 | |
| 621 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, | 651 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, |
| 622 OnWillReorderBookmarkNode(this, parent)); | 652 OnWillReorderBookmarkNode(this, parent)); |
| 623 | 653 |
| 624 UErrorCode error = U_ZERO_ERROR; | 654 UErrorCode error = U_ZERO_ERROR; |
| 625 scoped_ptr<icu::Collator> collator(icu::Collator::createInstance(error)); | 655 scoped_ptr<icu::Collator> collator(icu::Collator::createInstance(error)); |
| 626 if (U_FAILURE(error)) | 656 if (U_FAILURE(error)) |
| 627 collator.reset(NULL); | 657 collator.reset(NULL); |
| 628 BookmarkNode* mutable_parent = AsMutable(parent); | 658 BookmarkNode* mutable_parent = AsMutable(parent); |
| 629 std::sort(mutable_parent->children().begin(), | 659 std::sort(mutable_parent->children().begin(), |
| 630 mutable_parent->children().end(), | 660 mutable_parent->children().end(), |
| 631 SortComparator(collator.get())); | 661 SortComparator(collator.get())); |
| 632 | 662 |
| 633 if (store_.get()) | 663 if (store_.get()) |
| 634 store_->ScheduleSave(); | 664 store_->ScheduleSave(); |
| 635 | 665 |
| 636 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, | 666 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, |
| 637 BookmarkNodeChildrenReordered(this, parent)); | 667 BookmarkNodeChildrenReordered(this, parent)); |
| 638 } | 668 } |
| 639 | 669 |
| 640 void BookmarkModel::ReorderChildren( | 670 void BookmarkModel::ReorderChildren( |
| 641 const BookmarkNode* parent, | 671 const BookmarkNode* parent, |
| 642 const std::vector<const BookmarkNode*>& ordered_nodes) { | 672 const std::vector<const BookmarkNode*>& ordered_nodes) { |
| 673 if (IsManaged(parent)) { | |
| 674 NOTREACHED(); | |
| 675 return; | |
| 676 } | |
| 677 | |
| 643 // Ensure that all children in |parent| are in |ordered_nodes|. | 678 // Ensure that all children in |parent| are in |ordered_nodes|. |
| 644 DCHECK_EQ(static_cast<size_t>(parent->child_count()), ordered_nodes.size()); | 679 DCHECK_EQ(static_cast<size_t>(parent->child_count()), ordered_nodes.size()); |
| 645 for (size_t i = 0; i < ordered_nodes.size(); ++i) | 680 for (size_t i = 0; i < ordered_nodes.size(); ++i) |
| 646 DCHECK_EQ(parent, ordered_nodes[i]->parent()); | 681 DCHECK_EQ(parent, ordered_nodes[i]->parent()); |
| 647 | 682 |
| 648 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, | 683 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, |
| 649 OnWillReorderBookmarkNode(this, parent)); | 684 OnWillReorderBookmarkNode(this, parent)); |
| 650 | 685 |
| 651 AsMutable(parent)->SetChildren( | 686 AsMutable(parent)->SetChildren( |
| 652 *(reinterpret_cast<const std::vector<BookmarkNode*>*>(&ordered_nodes))); | 687 *(reinterpret_cast<const std::vector<BookmarkNode*>*>(&ordered_nodes))); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 694 const BookmarkPermanentNode* BookmarkModel::PermanentNode( | 729 const BookmarkPermanentNode* BookmarkModel::PermanentNode( |
| 695 BookmarkNode::Type type) { | 730 BookmarkNode::Type type) { |
| 696 DCHECK(loaded_); | 731 DCHECK(loaded_); |
| 697 switch (type) { | 732 switch (type) { |
| 698 case BookmarkNode::BOOKMARK_BAR: | 733 case BookmarkNode::BOOKMARK_BAR: |
| 699 return bookmark_bar_node_; | 734 return bookmark_bar_node_; |
| 700 case BookmarkNode::OTHER_NODE: | 735 case BookmarkNode::OTHER_NODE: |
| 701 return other_node_; | 736 return other_node_; |
| 702 case BookmarkNode::MOBILE: | 737 case BookmarkNode::MOBILE: |
| 703 return mobile_node_; | 738 return mobile_node_; |
| 739 case BookmarkNode::MANAGED: | |
| 740 return managed_node_; | |
| 704 default: | 741 default: |
| 705 NOTREACHED(); | 742 NOTREACHED(); |
| 706 return NULL; | 743 return NULL; |
| 707 } | 744 } |
| 708 } | 745 } |
| 709 | 746 |
| 710 bool BookmarkModel::IsBookmarkedNoLock(const GURL& url) { | 747 bool BookmarkModel::IsBookmarkedNoLock(const GURL& url) { |
| 711 BookmarkNode tmp_node(url); | 748 BookmarkNode tmp_node(url); |
| 712 return (nodes_ordered_by_url_set_.find(&tmp_node) != | 749 return (nodes_ordered_by_url_set_.find(&tmp_node) != |
| 713 nodes_ordered_by_url_set_.end()); | 750 nodes_ordered_by_url_set_.end()); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 748 // If bookmarks file changed externally, the IDs may have changed | 785 // If bookmarks file changed externally, the IDs may have changed |
| 749 // externally. In that case, the decoder may have reassigned IDs to make | 786 // externally. In that case, the decoder may have reassigned IDs to make |
| 750 // them unique. So when the file has changed externally, we should save the | 787 // them unique. So when the file has changed externally, we should save the |
| 751 // bookmarks file to persist new IDs. | 788 // bookmarks file to persist new IDs. |
| 752 if (store_.get()) | 789 if (store_.get()) |
| 753 store_->ScheduleSave(); | 790 store_->ScheduleSave(); |
| 754 } | 791 } |
| 755 bookmark_bar_node_ = details->release_bb_node(); | 792 bookmark_bar_node_ = details->release_bb_node(); |
| 756 other_node_ = details->release_other_folder_node(); | 793 other_node_ = details->release_other_folder_node(); |
| 757 mobile_node_ = details->release_mobile_folder_node(); | 794 mobile_node_ = details->release_mobile_folder_node(); |
| 795 managed_node_ = details->release_managed_node(); | |
| 758 index_.reset(details->release_index()); | 796 index_.reset(details->release_index()); |
| 759 | 797 |
| 760 // WARNING: order is important here, various places assume the order is | 798 // WARNING: order is important here, various places assume the order is |
| 761 // constant (but can vary between embedders with the initial visibility | 799 // constant (but can vary between embedders with the initial visibility |
| 762 // of permanent nodes). | 800 // of permanent nodes). |
| 763 BookmarkPermanentNode* root_children[] = { | 801 BookmarkPermanentNode* root_children[] = { |
| 764 bookmark_bar_node_, other_node_, mobile_node_, | 802 bookmark_bar_node_, other_node_, mobile_node_, managed_node_, |
| 765 }; | 803 }; |
| 766 std::stable_sort(root_children, | 804 std::stable_sort(root_children, |
| 767 root_children + arraysize(root_children), | 805 root_children + arraysize(root_children), |
| 768 VisibilityComparator(client_)); | 806 VisibilityComparator(client_)); |
| 769 for (size_t i = 0; i < arraysize(root_children); ++i) { | 807 for (size_t i = 0; i < arraysize(root_children); ++i) { |
| 770 root_.Add(root_children[i], static_cast<int>(i)); | 808 root_.Add(root_children[i], static_cast<int>(i)); |
| 771 } | 809 } |
| 772 | 810 |
| 773 root_.SetMetaInfoMap(details->model_meta_info_map()); | 811 root_.SetMetaInfoMap(details->model_meta_info_map()); |
| 774 root_.set_sync_transaction_version(details->model_sync_transaction_version()); | 812 root_.set_sync_transaction_version(details->model_sync_transaction_version()); |
| 775 | 813 |
| 776 { | 814 { |
| 777 base::AutoLock url_lock(url_lock_); | 815 base::AutoLock url_lock(url_lock_); |
| 778 // Update nodes_ordered_by_url_set_ from the nodes. | 816 // Update nodes_ordered_by_url_set_ from the nodes. |
| 779 PopulateNodesByURL(&root_); | 817 PopulateNodesByURL(&root_); |
| 780 } | 818 } |
| 781 | 819 |
| 782 loaded_ = true; | 820 loaded_ = true; |
| 783 | 821 |
| 784 loaded_signal_.Signal(); | 822 loaded_signal_.Signal(); |
| 785 | 823 |
| 786 // Notify our direct observers. | 824 // Notify our direct observers. |
| 787 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, | 825 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, |
| 788 BookmarkModelLoaded(this, details->ids_reassigned())); | 826 BookmarkModelLoaded(this, details->ids_reassigned())); |
| 827 | |
| 828 // Start tracking the managed bookmarks. This will detect any changes that | |
| 829 // may have occurred while the |store_| loaded the initial managed bookmarks. | |
| 830 // May be NULL in unit tests. | |
| 831 if (managed_bookmarks_tracker_) | |
| 832 managed_bookmarks_tracker_->Init(); | |
| 789 } | 833 } |
| 790 | 834 |
| 791 void BookmarkModel::RemoveAndDeleteNode(BookmarkNode* delete_me) { | 835 void BookmarkModel::RemoveAndDeleteNode(BookmarkNode* delete_me) { |
| 792 scoped_ptr<BookmarkNode> node(delete_me); | 836 scoped_ptr<BookmarkNode> node(delete_me); |
| 793 | 837 |
| 794 const BookmarkNode* parent = node->parent(); | 838 const BookmarkNode* parent = node->parent(); |
| 795 DCHECK(parent); | 839 DCHECK(parent); |
| 796 int index = parent->GetIndexOf(node.get()); | 840 int index = parent->GetIndexOf(node.get()); |
| 797 | 841 |
| 798 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, | 842 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 872 bool allow_end) { | 916 bool allow_end) { |
| 873 return (parent && parent->is_folder() && | 917 return (parent && parent->is_folder() && |
| 874 (index >= 0 && (index < parent->child_count() || | 918 (index >= 0 && (index < parent->child_count() || |
| 875 (allow_end && index == parent->child_count())))); | 919 (allow_end && index == parent->child_count())))); |
| 876 } | 920 } |
| 877 | 921 |
| 878 BookmarkPermanentNode* BookmarkModel::CreatePermanentNode( | 922 BookmarkPermanentNode* BookmarkModel::CreatePermanentNode( |
| 879 BookmarkNode::Type type) { | 923 BookmarkNode::Type type) { |
| 880 DCHECK(type == BookmarkNode::BOOKMARK_BAR || | 924 DCHECK(type == BookmarkNode::BOOKMARK_BAR || |
| 881 type == BookmarkNode::OTHER_NODE || | 925 type == BookmarkNode::OTHER_NODE || |
| 882 type == BookmarkNode::MOBILE); | 926 type == BookmarkNode::MOBILE || |
| 927 type == BookmarkNode::MANAGED); | |
| 883 BookmarkPermanentNode* node = | 928 BookmarkPermanentNode* node = |
| 884 new BookmarkPermanentNode(generate_next_node_id()); | 929 new BookmarkPermanentNode(generate_next_node_id()); |
| 885 node->set_visible(client_->IsPermanentNodeVisible(type)); | 930 node->set_visible(client_->IsPermanentNodeVisible(type)); |
| 886 | 931 |
| 887 int title_id; | 932 int title_id; |
| 888 switch (type) { | 933 switch (type) { |
| 889 case BookmarkNode::BOOKMARK_BAR: | 934 case BookmarkNode::BOOKMARK_BAR: |
| 890 title_id = IDS_BOOKMARK_BAR_FOLDER_NAME; | 935 title_id = IDS_BOOKMARK_BAR_FOLDER_NAME; |
| 891 break; | 936 break; |
| 892 case BookmarkNode::OTHER_NODE: | 937 case BookmarkNode::OTHER_NODE: |
| 893 title_id = IDS_BOOKMARK_BAR_OTHER_FOLDER_NAME; | 938 title_id = IDS_BOOKMARK_BAR_OTHER_FOLDER_NAME; |
| 894 break; | 939 break; |
| 895 case BookmarkNode::MOBILE: | 940 case BookmarkNode::MOBILE: |
| 896 title_id = IDS_BOOKMARK_BAR_MOBILE_FOLDER_NAME; | 941 title_id = IDS_BOOKMARK_BAR_MOBILE_FOLDER_NAME; |
| 897 break; | 942 break; |
| 943 case BookmarkNode::MANAGED: | |
| 944 title_id = IDS_BOOKMARK_BAR_MANAGED_FOLDER_DEFAULT_NAME; | |
| 945 break; | |
| 898 default: | 946 default: |
| 899 NOTREACHED(); | 947 NOTREACHED(); |
| 900 title_id = IDS_BOOKMARK_BAR_FOLDER_NAME; | 948 title_id = IDS_BOOKMARK_BAR_FOLDER_NAME; |
| 901 break; | 949 break; |
| 902 } | 950 } |
| 903 node->SetTitle(l10n_util::GetStringUTF16(title_id)); | 951 node->SetTitle(l10n_util::GetStringUTF16(title_id)); |
| 904 node->set_type(type); | 952 node->set_type(type); |
| 905 return node; | 953 return node; |
| 906 } | 954 } |
| 907 | 955 |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 972 } | 1020 } |
| 973 | 1021 |
| 974 scoped_ptr<BookmarkLoadDetails> BookmarkModel::CreateLoadDetails( | 1022 scoped_ptr<BookmarkLoadDetails> BookmarkModel::CreateLoadDetails( |
| 975 const std::string& accept_languages) { | 1023 const std::string& accept_languages) { |
| 976 BookmarkPermanentNode* bb_node = | 1024 BookmarkPermanentNode* bb_node = |
| 977 CreatePermanentNode(BookmarkNode::BOOKMARK_BAR); | 1025 CreatePermanentNode(BookmarkNode::BOOKMARK_BAR); |
| 978 BookmarkPermanentNode* other_node = | 1026 BookmarkPermanentNode* other_node = |
| 979 CreatePermanentNode(BookmarkNode::OTHER_NODE); | 1027 CreatePermanentNode(BookmarkNode::OTHER_NODE); |
| 980 BookmarkPermanentNode* mobile_node = | 1028 BookmarkPermanentNode* mobile_node = |
| 981 CreatePermanentNode(BookmarkNode::MOBILE); | 1029 CreatePermanentNode(BookmarkNode::MOBILE); |
| 1030 BookmarkPermanentNode* managed_node = | |
| 1031 CreatePermanentNode(BookmarkNode::MANAGED); | |
| 982 return scoped_ptr<BookmarkLoadDetails>(new BookmarkLoadDetails( | 1032 return scoped_ptr<BookmarkLoadDetails>(new BookmarkLoadDetails( |
| 983 bb_node, | 1033 bb_node, |
| 984 other_node, | 1034 other_node, |
| 985 mobile_node, | 1035 mobile_node, |
| 1036 managed_node, | |
| 986 new BookmarkIndex(client_, index_urls_, accept_languages), | 1037 new BookmarkIndex(client_, index_urls_, accept_languages), |
| 987 next_node_id_)); | 1038 next_node_id_)); |
| 988 } | 1039 } |
| OLD | NEW |