OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "chrome/browser/bookmarks/bookmark_model.h" | 5 #include "chrome/browser/bookmarks/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/prefs/pref_service.h" | 13 #include "base/logging.h" |
14 #include "base/sequenced_task_runner.h" | 14 #include "base/strings/string_util.h" |
15 #include "chrome/browser/bookmarks/bookmark_expanded_state_tracker.h" | 15 #include "chrome/browser/bookmarks/bookmark_expanded_state_tracker.h" |
16 #include "chrome/browser/bookmarks/bookmark_index.h" | 16 #include "chrome/browser/bookmarks/bookmark_index.h" |
17 #include "chrome/browser/bookmarks/bookmark_model_observer.h" | 17 #include "chrome/browser/bookmarks/bookmark_model_observer.h" |
18 #include "chrome/browser/bookmarks/bookmark_node_data.h" | |
18 #include "chrome/browser/bookmarks/bookmark_storage.h" | 19 #include "chrome/browser/bookmarks/bookmark_storage.h" |
19 #include "chrome/browser/bookmarks/bookmark_utils.h" | 20 #include "chrome/browser/bookmarks/bookmark_utils.h" |
20 #include "chrome/browser/chrome_notification_types.h" | |
21 #include "chrome/browser/favicon/favicon_changed_details.h" | |
22 #include "chrome/browser/favicon/favicon_service.h" | |
23 #include "chrome/browser/favicon/favicon_service_factory.h" | |
24 #include "chrome/browser/history/history_service.h" | |
25 #include "chrome/browser/history/history_service_factory.h" | |
26 #include "chrome/browser/profiles/profile.h" | |
27 #include "chrome/common/pref_names.h" | |
28 #include "components/bookmarks/core/browser/bookmark_match.h" | 21 #include "components/bookmarks/core/browser/bookmark_match.h" |
29 #include "components/favicon_base/favicon_types.h" | 22 #include "components/favicon_base/favicon_types.h" |
30 #include "content/public/browser/notification_details.h" | |
31 #include "content/public/browser/notification_source.h" | |
32 #include "grit/component_strings.h" | 23 #include "grit/component_strings.h" |
33 #include "ui/base/l10n/l10n_util.h" | 24 #include "ui/base/l10n/l10n_util.h" |
34 #include "ui/gfx/favicon_size.h" | 25 #include "ui/gfx/favicon_size.h" |
35 #include "ui/gfx/image/image_util.h" | |
36 | 26 |
37 using base::Time; | 27 using base::Time; |
38 | 28 |
39 namespace { | 29 namespace { |
40 | 30 |
41 // Helper to get a mutable bookmark node. | 31 // Helper to get a mutable bookmark node. |
42 BookmarkNode* AsMutable(const BookmarkNode* node) { | 32 BookmarkNode* AsMutable(const BookmarkNode* node) { |
43 return const_cast<BookmarkNode*>(node); | 33 return const_cast<BookmarkNode*>(node); |
44 } | 34 } |
45 | 35 |
(...skipping 19 matching lines...) Expand all Loading... | |
65 } | 55 } |
66 | 56 |
67 private: | 57 private: |
68 icu::Collator* collator_; | 58 icu::Collator* collator_; |
69 }; | 59 }; |
70 | 60 |
71 } // namespace | 61 } // namespace |
72 | 62 |
73 // BookmarkModel -------------------------------------------------------------- | 63 // BookmarkModel -------------------------------------------------------------- |
74 | 64 |
75 BookmarkModel::BookmarkModel(Profile* profile, | 65 BookmarkModel::BookmarkModel(BookmarkClient* client, bool index_urls) |
76 bool index_urls) | 66 : client_(client), |
77 : profile_(profile), | |
78 loaded_(false), | 67 loaded_(false), |
79 root_(GURL()), | 68 root_(GURL()), |
80 bookmark_bar_node_(NULL), | 69 bookmark_bar_node_(NULL), |
81 other_node_(NULL), | 70 other_node_(NULL), |
82 mobile_node_(NULL), | 71 mobile_node_(NULL), |
83 next_node_id_(1), | 72 next_node_id_(1), |
84 observers_(ObserverList<BookmarkModelObserver>::NOTIFY_EXISTING_ONLY), | 73 observers_(ObserverList<BookmarkModelObserver>::NOTIFY_EXISTING_ONLY), |
85 index_urls_(index_urls), | 74 index_urls_(index_urls), |
86 loaded_signal_(true, false), | 75 loaded_signal_(true, false), |
87 extensive_changes_(0) { | 76 extensive_changes_(0) { |
88 if (!profile_) { | 77 DCHECK(client_); |
89 // Profile is null during testing. | |
90 DoneLoading(CreateLoadDetails()); | |
91 } | |
92 } | 78 } |
93 | 79 |
94 BookmarkModel::~BookmarkModel() { | 80 BookmarkModel::~BookmarkModel() { |
95 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, | 81 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, |
96 BookmarkModelBeingDeleted(this)); | 82 BookmarkModelBeingDeleted(this)); |
97 | 83 |
98 if (store_.get()) { | 84 if (store_.get()) { |
99 // The store maintains a reference back to us. We need to tell it we're gone | 85 // The store maintains a reference back to us. We need to tell it we're gone |
100 // so that it doesn't try and invoke a method back on us again. | 86 // so that it doesn't try and invoke a method back on us again. |
101 store_->BookmarkModelDeleted(); | 87 store_->BookmarkModelDeleted(); |
102 } | 88 } |
103 } | 89 } |
104 | 90 |
105 void BookmarkModel::Shutdown() { | 91 void BookmarkModel::Shutdown() { |
106 if (loaded_) | 92 if (loaded_) |
107 return; | 93 return; |
108 | 94 |
109 // See comment in HistoryService::ShutdownOnUIThread where this is invoked for | 95 // See comment in HistoryService::ShutdownOnUIThread where this is invoked for |
110 // details. It is also called when the BookmarkModel is deleted. | 96 // details. It is also called when the BookmarkModel is deleted. |
111 loaded_signal_.Signal(); | 97 loaded_signal_.Signal(); |
112 } | 98 } |
113 | 99 |
114 void BookmarkModel::Load( | 100 void BookmarkModel::Load( |
115 const scoped_refptr<base::SequencedTaskRunner>& task_runner) { | 101 PrefService* pref_service, |
102 const std::string& accept_languages, | |
103 const base::FilePath& profile_path, | |
104 const scoped_refptr<base::SequencedTaskRunner>& io_task_runner, | |
105 const scoped_refptr<base::SequencedTaskRunner>& ui_task_runner) { | |
116 if (store_.get()) { | 106 if (store_.get()) { |
117 // If the store is non-null, it means Load was already invoked. Load should | 107 // If the store is non-null, it means Load was already invoked. Load should |
118 // only be invoked once. | 108 // only be invoked once. |
119 NOTREACHED(); | 109 NOTREACHED(); |
120 return; | 110 return; |
121 } | 111 } |
122 | 112 |
123 expanded_state_tracker_.reset( | 113 expanded_state_tracker_.reset( |
124 new BookmarkExpandedStateTracker(this, profile_->GetPrefs())); | 114 new BookmarkExpandedStateTracker(this, pref_service)); |
125 | |
126 // Listen for changes to favicons so that we can update the favicon of the | |
127 // node appropriately. | |
128 registrar_.Add(this, chrome::NOTIFICATION_FAVICON_CHANGED, | |
129 content::Source<Profile>(profile_)); | |
130 | 115 |
131 // Load the bookmarks. BookmarkStorage notifies us when done. | 116 // Load the bookmarks. BookmarkStorage notifies us when done. |
132 store_ = new BookmarkStorage(profile_, this, task_runner.get()); | 117 store_ = new BookmarkStorage(this, profile_path, io_task_runner.get()); |
133 store_->LoadBookmarks(CreateLoadDetails()); | 118 store_->LoadBookmarks(CreateLoadDetails(accept_languages), ui_task_runner); |
134 } | 119 } |
135 | 120 |
136 const BookmarkNode* BookmarkModel::GetParentForNewNodes() { | 121 const BookmarkNode* BookmarkModel::GetParentForNewNodes() { |
137 std::vector<const BookmarkNode*> nodes = | 122 std::vector<const BookmarkNode*> nodes = |
138 bookmark_utils::GetMostRecentlyModifiedFolders(this, 1); | 123 bookmark_utils::GetMostRecentlyModifiedFolders(this, 1); |
139 DCHECK(!nodes.empty()); // This list is always padded with default folders. | 124 DCHECK(!nodes.empty()); // This list is always padded with default folders. |
140 return nodes[0]; | 125 return nodes[0]; |
141 } | 126 } |
142 | 127 |
143 void BookmarkModel::AddObserver(BookmarkModelObserver* observer) { | 128 void BookmarkModel::AddObserver(BookmarkModelObserver* observer) { |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
201 BookmarkNode* child_node = permanent_node->GetChild(j); | 186 BookmarkNode* child_node = permanent_node->GetChild(j); |
202 removed_nodes.push_back(child_node); | 187 removed_nodes.push_back(child_node); |
203 RemoveNodeAndGetRemovedUrls(child_node, &removed_urls); | 188 RemoveNodeAndGetRemovedUrls(child_node, &removed_urls); |
204 } | 189 } |
205 } | 190 } |
206 } | 191 } |
207 EndExtensiveChanges(); | 192 EndExtensiveChanges(); |
208 if (store_.get()) | 193 if (store_.get()) |
209 store_->ScheduleSave(); | 194 store_->ScheduleSave(); |
210 | 195 |
211 NotifyHistoryAboutRemovedBookmarks(removed_urls); | 196 client_->NotifyHistoryAboutRemovedBookmarks(removed_urls); |
212 | 197 |
213 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, | 198 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, |
214 BookmarkAllNodesRemoved(this)); | 199 BookmarkAllNodesRemoved(this)); |
215 } | 200 } |
216 | 201 |
217 void BookmarkModel::Move(const BookmarkNode* node, | 202 void BookmarkModel::Move(const BookmarkNode* node, |
218 const BookmarkNode* new_parent, | 203 const BookmarkNode* new_parent, |
219 int index) { | 204 int index) { |
220 if (!loaded_ || !node || !IsValidIndex(new_parent, index, true) || | 205 if (!loaded_ || !node || !IsValidIndex(new_parent, index, true) || |
221 is_root_node(new_parent) || is_permanent_node(node)) { | 206 is_root_node(new_parent) || is_permanent_node(node)) { |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
282 const gfx::Image& BookmarkModel::GetFavicon(const BookmarkNode* node) { | 267 const gfx::Image& BookmarkModel::GetFavicon(const BookmarkNode* node) { |
283 DCHECK(node); | 268 DCHECK(node); |
284 if (node->favicon_state() == BookmarkNode::INVALID_FAVICON) { | 269 if (node->favicon_state() == BookmarkNode::INVALID_FAVICON) { |
285 BookmarkNode* mutable_node = AsMutable(node); | 270 BookmarkNode* mutable_node = AsMutable(node); |
286 mutable_node->set_favicon_state(BookmarkNode::LOADING_FAVICON); | 271 mutable_node->set_favicon_state(BookmarkNode::LOADING_FAVICON); |
287 LoadFavicon(mutable_node); | 272 LoadFavicon(mutable_node); |
288 } | 273 } |
289 return node->favicon(); | 274 return node->favicon(); |
290 } | 275 } |
291 | 276 |
292 void BookmarkModel::SetTitle(const BookmarkNode* node, const base::string16& tit le) { | 277 void BookmarkModel::SetTitle(const BookmarkNode* node, |
278 const base::string16& title) { | |
293 if (!node) { | 279 if (!node) { |
294 NOTREACHED(); | 280 NOTREACHED(); |
295 return; | 281 return; |
296 } | 282 } |
297 if (node->GetTitle() == title) | 283 if (node->GetTitle() == title) |
298 return; | 284 return; |
299 | 285 |
300 if (is_permanent_node(node)) { | 286 if (is_permanent_node(node)) { |
301 NOTREACHED(); | 287 NOTREACHED(); |
302 return; | 288 return; |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
410 const BookmarkNode* node, | 396 const BookmarkNode* node, |
411 int64 sync_transaction_version) { | 397 int64 sync_transaction_version) { |
412 if (sync_transaction_version == node->sync_transaction_version()) | 398 if (sync_transaction_version == node->sync_transaction_version()) |
413 return; | 399 return; |
414 | 400 |
415 AsMutable(node)->set_sync_transaction_version(sync_transaction_version); | 401 AsMutable(node)->set_sync_transaction_version(sync_transaction_version); |
416 if (store_.get()) | 402 if (store_.get()) |
417 store_->ScheduleSave(); | 403 store_->ScheduleSave(); |
418 } | 404 } |
419 | 405 |
406 void BookmarkModel::OnFaviconChanged(const std::set<GURL>& urls) { | |
407 // Ignore events if |Load| has not been called yet. | |
408 if (!store_) | |
409 return; | |
410 | |
411 // Prevent the observers from getting confused for multiple favicon loads. | |
412 for (std::set<GURL>::const_iterator i = urls.begin(); i != urls.end(); ++i) { | |
413 std::vector<const BookmarkNode*> nodes; | |
414 GetNodesByURL(*i, &nodes); | |
415 for (size_t i = 0; i < nodes.size(); ++i) { | |
416 // Got an updated favicon, for a URL, do a new request. | |
417 BookmarkNode* node = AsMutable(nodes[i]); | |
418 node->InvalidateFavicon(); | |
419 CancelPendingFaviconLoadRequests(node); | |
420 FOR_EACH_OBSERVER(BookmarkModelObserver, | |
421 observers_, | |
422 BookmarkNodeFaviconChanged(this, node)); | |
423 } | |
424 } | |
425 } | |
426 | |
420 void BookmarkModel::SetDateAdded(const BookmarkNode* node, | 427 void BookmarkModel::SetDateAdded(const BookmarkNode* node, |
421 base::Time date_added) { | 428 base::Time date_added) { |
422 if (!node) { | 429 if (!node) { |
423 NOTREACHED(); | 430 NOTREACHED(); |
424 return; | 431 return; |
425 } | 432 } |
426 | 433 |
427 if (node->date_added() == date_added) | 434 if (node->date_added() == date_added) |
428 return; | 435 return; |
429 | 436 |
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
617 const base::string16& text, | 624 const base::string16& text, |
618 size_t max_count, | 625 size_t max_count, |
619 std::vector<BookmarkMatch>* matches) { | 626 std::vector<BookmarkMatch>* matches) { |
620 if (!loaded_) | 627 if (!loaded_) |
621 return; | 628 return; |
622 | 629 |
623 index_->GetBookmarksMatching(text, max_count, matches); | 630 index_->GetBookmarksMatching(text, max_count, matches); |
624 } | 631 } |
625 | 632 |
626 void BookmarkModel::ClearStore() { | 633 void BookmarkModel::ClearStore() { |
627 registrar_.RemoveAll(); | |
628 store_ = NULL; | 634 store_ = NULL; |
629 } | 635 } |
630 | 636 |
631 void BookmarkModel::SetPermanentNodeVisible(BookmarkNode::Type type, | 637 void BookmarkModel::SetPermanentNodeVisible(BookmarkNode::Type type, |
632 bool value) { | 638 bool value) { |
633 DCHECK(loaded_); | 639 DCHECK(loaded_); |
634 switch (type) { | 640 switch (type) { |
635 case BookmarkNode::BOOKMARK_BAR: | 641 case BookmarkNode::BOOKMARK_BAR: |
636 bookmark_bar_node_->set_visible(value); | 642 bookmark_bar_node_->set_visible(value); |
637 break; | 643 break; |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
733 | 739 |
734 std::set<GURL> removed_urls; | 740 std::set<GURL> removed_urls; |
735 { | 741 { |
736 base::AutoLock url_lock(url_lock_); | 742 base::AutoLock url_lock(url_lock_); |
737 RemoveNodeAndGetRemovedUrls(node.get(), &removed_urls); | 743 RemoveNodeAndGetRemovedUrls(node.get(), &removed_urls); |
738 } | 744 } |
739 | 745 |
740 if (store_.get()) | 746 if (store_.get()) |
741 store_->ScheduleSave(); | 747 store_->ScheduleSave(); |
742 | 748 |
743 NotifyHistoryAboutRemovedBookmarks(removed_urls); | 749 client_->NotifyHistoryAboutRemovedBookmarks(removed_urls); |
sky
2014/04/23 20:32:07
I don't think this needs to be on the client. The
sdefresne
2014/04/24 12:30:15
Make sense. I was also considering doing it. I'll
| |
744 | 750 |
745 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, | 751 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, |
746 BookmarkNodeRemoved(this, parent, index, node.get())); | 752 BookmarkNodeRemoved(this, parent, index, node.get())); |
747 } | 753 } |
748 | 754 |
749 void BookmarkModel::RemoveNodeFromURLSet(BookmarkNode* node) { | 755 void BookmarkModel::RemoveNodeFromURLSet(BookmarkNode* node) { |
750 // NOTE: this is called in such a way that url_lock_ is already held. As | 756 // NOTE: this is called in such a way that url_lock_ is already held. As |
751 // such, this doesn't explicitly grab the lock. | 757 // such, this doesn't explicitly grab the lock. |
752 NodesOrderedByURLSet::iterator i = nodes_ordered_by_url_set_.find(node); | 758 NodesOrderedByURLSet::iterator i = nodes_ordered_by_url_set_.find(node); |
753 DCHECK(i != nodes_ordered_by_url_set_.end()); | 759 DCHECK(i != nodes_ordered_by_url_set_.end()); |
(...skipping 23 matching lines...) Expand all Loading... | |
777 // invalidated, so using i++ here within the "erase" call is | 783 // invalidated, so using i++ here within the "erase" call is |
778 // important as it advances the iterator before passing the | 784 // important as it advances the iterator before passing the |
779 // old value through to erase. | 785 // old value through to erase. |
780 removed_urls->erase(i++); | 786 removed_urls->erase(i++); |
781 } else { | 787 } else { |
782 ++i; | 788 ++i; |
783 } | 789 } |
784 } | 790 } |
785 } | 791 } |
786 | 792 |
787 void BookmarkModel::NotifyHistoryAboutRemovedBookmarks( | |
788 const std::set<GURL>& removed_bookmark_urls) const { | |
789 if (removed_bookmark_urls.empty()) { | |
790 // No point in sending out notification if the starred state didn't change. | |
791 return; | |
792 } | |
793 | |
794 if (profile_) { | |
795 HistoryService* history = | |
796 HistoryServiceFactory::GetForProfile(profile_, | |
797 Profile::EXPLICIT_ACCESS); | |
798 if (history) | |
799 history->URLsNoLongerBookmarked(removed_bookmark_urls); | |
800 } | |
801 } | |
802 | |
803 BookmarkNode* BookmarkModel::AddNode(BookmarkNode* parent, | 793 BookmarkNode* BookmarkModel::AddNode(BookmarkNode* parent, |
804 int index, | 794 int index, |
805 BookmarkNode* node) { | 795 BookmarkNode* node) { |
806 parent->Add(node, index); | 796 parent->Add(node, index); |
807 | 797 |
808 if (store_.get()) | 798 if (store_.get()) |
809 store_->ScheduleSave(); | 799 store_->ScheduleSave(); |
810 | 800 |
811 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, | 801 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, |
812 BookmarkNodeAdded(this, parent, index)); | 802 BookmarkNodeAdded(this, parent, index)); |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
866 node->set_icon_url(image_result.icon_url); | 856 node->set_icon_url(image_result.icon_url); |
867 FaviconLoaded(node); | 857 FaviconLoaded(node); |
868 } | 858 } |
869 } | 859 } |
870 | 860 |
871 void BookmarkModel::LoadFavicon(BookmarkNode* node) { | 861 void BookmarkModel::LoadFavicon(BookmarkNode* node) { |
872 if (node->is_folder()) | 862 if (node->is_folder()) |
873 return; | 863 return; |
874 | 864 |
875 DCHECK(node->url().is_valid()); | 865 DCHECK(node->url().is_valid()); |
876 FaviconService* favicon_service = FaviconServiceFactory::GetForProfile( | 866 base::CancelableTaskTracker::TaskId taskId = client_->GetFaviconImageForURL( |
877 profile_, Profile::EXPLICIT_ACCESS); | 867 node->url(), |
878 if (!favicon_service) | 868 favicon_base::FAVICON, |
879 return; | 869 gfx::kFaviconSize, |
880 base::CancelableTaskTracker::TaskId taskId = | 870 base::Bind( |
881 favicon_service->GetFaviconImageForURL( | 871 &BookmarkModel::OnFaviconDataAvailable, base::Unretained(this), node), |
882 FaviconService::FaviconForURLParams( | 872 &cancelable_task_tracker_); |
883 node->url(), favicon_base::FAVICON, gfx::kFaviconSize), | 873 if (taskId != base::CancelableTaskTracker::kBadTaskId) |
884 base::Bind(&BookmarkModel::OnFaviconDataAvailable, | 874 node->set_favicon_load_task_id(taskId); |
885 base::Unretained(this), | |
886 node), | |
887 &cancelable_task_tracker_); | |
888 node->set_favicon_load_task_id(taskId); | |
889 } | 875 } |
890 | 876 |
891 void BookmarkModel::FaviconLoaded(const BookmarkNode* node) { | 877 void BookmarkModel::FaviconLoaded(const BookmarkNode* node) { |
892 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, | 878 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, |
893 BookmarkNodeFaviconChanged(this, node)); | 879 BookmarkNodeFaviconChanged(this, node)); |
894 } | 880 } |
895 | 881 |
896 void BookmarkModel::CancelPendingFaviconLoadRequests(BookmarkNode* node) { | 882 void BookmarkModel::CancelPendingFaviconLoadRequests(BookmarkNode* node) { |
897 if (node->favicon_load_task_id() != base::CancelableTaskTracker::kBadTaskId) { | 883 if (node->favicon_load_task_id() != base::CancelableTaskTracker::kBadTaskId) { |
898 cancelable_task_tracker_.TryCancel(node->favicon_load_task_id()); | 884 cancelable_task_tracker_.TryCancel(node->favicon_load_task_id()); |
899 node->set_favicon_load_task_id(base::CancelableTaskTracker::kBadTaskId); | 885 node->set_favicon_load_task_id(base::CancelableTaskTracker::kBadTaskId); |
900 } | 886 } |
901 } | 887 } |
902 | 888 |
903 void BookmarkModel::Observe(int type, | |
904 const content::NotificationSource& source, | |
905 const content::NotificationDetails& details) { | |
906 switch (type) { | |
907 case chrome::NOTIFICATION_FAVICON_CHANGED: { | |
908 // Prevent the observers from getting confused for multiple favicon loads. | |
909 content::Details<FaviconChangedDetails> favicon_details(details); | |
910 for (std::set<GURL>::const_iterator i = favicon_details->urls.begin(); | |
911 i != favicon_details->urls.end(); ++i) { | |
912 std::vector<const BookmarkNode*> nodes; | |
913 GetNodesByURL(*i, &nodes); | |
914 for (size_t i = 0; i < nodes.size(); ++i) { | |
915 // Got an updated favicon, for a URL, do a new request. | |
916 BookmarkNode* node = AsMutable(nodes[i]); | |
917 node->InvalidateFavicon(); | |
918 CancelPendingFaviconLoadRequests(node); | |
919 FOR_EACH_OBSERVER(BookmarkModelObserver, observers_, | |
920 BookmarkNodeFaviconChanged(this, node)); | |
921 } | |
922 } | |
923 break; | |
924 } | |
925 | |
926 default: | |
927 NOTREACHED(); | |
928 break; | |
929 } | |
930 } | |
931 | |
932 void BookmarkModel::PopulateNodesByURL(BookmarkNode* node) { | 889 void BookmarkModel::PopulateNodesByURL(BookmarkNode* node) { |
933 // NOTE: this is called with url_lock_ already held. As such, this doesn't | 890 // NOTE: this is called with url_lock_ already held. As such, this doesn't |
934 // explicitly grab the lock. | 891 // explicitly grab the lock. |
935 if (node->is_url()) | 892 if (node->is_url()) |
936 nodes_ordered_by_url_set_.insert(node); | 893 nodes_ordered_by_url_set_.insert(node); |
937 for (int i = 0; i < node->child_count(); ++i) | 894 for (int i = 0; i < node->child_count(); ++i) |
938 PopulateNodesByURL(node->GetChild(i)); | 895 PopulateNodesByURL(node->GetChild(i)); |
939 } | 896 } |
940 | 897 |
941 int64 BookmarkModel::generate_next_node_id() { | 898 int64 BookmarkModel::generate_next_node_id() { |
942 return next_node_id_++; | 899 return next_node_id_++; |
943 } | 900 } |
944 | 901 |
945 BookmarkLoadDetails* BookmarkModel::CreateLoadDetails() { | 902 BookmarkLoadDetails* BookmarkModel::CreateLoadDetails( |
903 const std::string& accept_languages) { | |
946 BookmarkPermanentNode* bb_node = | 904 BookmarkPermanentNode* bb_node = |
947 CreatePermanentNode(BookmarkNode::BOOKMARK_BAR); | 905 CreatePermanentNode(BookmarkNode::BOOKMARK_BAR); |
948 BookmarkPermanentNode* other_node = | 906 BookmarkPermanentNode* other_node = |
949 CreatePermanentNode(BookmarkNode::OTHER_NODE); | 907 CreatePermanentNode(BookmarkNode::OTHER_NODE); |
950 BookmarkPermanentNode* mobile_node = | 908 BookmarkPermanentNode* mobile_node = |
951 CreatePermanentNode(BookmarkNode::MOBILE); | 909 CreatePermanentNode(BookmarkNode::MOBILE); |
952 return new BookmarkLoadDetails( | 910 return new BookmarkLoadDetails( |
953 bb_node, other_node, mobile_node, | 911 bb_node, |
954 new BookmarkIndex( | 912 other_node, |
955 profile_, | 913 mobile_node, |
956 index_urls_, | 914 new BookmarkIndex(client_, index_urls_, accept_languages), |
957 profile_ ? | |
958 profile_->GetPrefs()->GetString(prefs::kAcceptLanguages) : | |
959 std::string()), | |
960 next_node_id_); | 915 next_node_id_); |
961 } | 916 } |
OLD | NEW |