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

Side by Side Diff: components/ntp_snippets/bookmarks/bookmark_last_visit_utils.cc

Issue 2305583002: Do not select old bookmarks in ntp_snippets::BookmarkSuggestionsProvider (Closed)
Patch Set: Created 4 years, 3 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 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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/ntp_snippets/bookmarks/bookmark_last_visit_utils.h" 5 #include "components/ntp_snippets/bookmarks/bookmark_last_visit_utils.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <string> 8 #include <string>
9 #include <utility> 9 #include <utility>
10 10
11 #include "base/bind.h" 11 #include "base/bind.h"
12 #include "base/strings/string_number_conversions.h" 12 #include "base/strings/string_number_conversions.h"
13 #include "base/time/time.h" 13 #include "base/time/time.h"
14 #include "components/bookmarks/browser/bookmark_model.h" 14 #include "components/bookmarks/browser/bookmark_model.h"
15 #include "components/bookmarks/browser/bookmark_node.h" 15 #include "components/bookmarks/browser/bookmark_node.h"
16 #include "url/gurl.h" 16 #include "url/gurl.h"
17 17
18 using bookmarks::BookmarkModel; 18 using bookmarks::BookmarkModel;
19 using bookmarks::BookmarkNode; 19 using bookmarks::BookmarkNode;
20 20
21 namespace ntp_snippets { 21 namespace ntp_snippets {
22 22
23 namespace { 23 namespace {
24 24
25 struct RecentBookmark {
26 const bookmarks::BookmarkNode* node;
27 bool visited_recently;
28 };
29
30 const char kBookmarkLastVisitDateKey[] = "last_visited"; 25 const char kBookmarkLastVisitDateKey[] = "last_visited";
31 const char kBookmarkDismissedFromNTP[] = "dismissed_from_ntp"; 26 const char kBookmarkDismissedFromNTP[] = "dismissed_from_ntp";
32 27
33 base::Time ParseLastVisitDate(const std::string& date_string) { 28 base::Time ParseLastVisitDate(const std::string& date_string) {
34 int64_t date = 0; 29 int64_t date = 0;
35 if (!base::StringToInt64(date_string, &date)) 30 if (!base::StringToInt64(date_string, &date))
36 return base::Time::UnixEpoch(); 31 return base::Time::UnixEpoch();
37 return base::Time::FromInternalValue(date); 32 return base::Time::FromInternalValue(date);
38 } 33 }
39 34
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
124 std::vector<const BookmarkNode*> GetRecentlyVisitedBookmarks( 119 std::vector<const BookmarkNode*> GetRecentlyVisitedBookmarks(
125 BookmarkModel* bookmark_model, 120 BookmarkModel* bookmark_model,
126 int min_count, 121 int min_count,
127 int max_count, 122 int max_count,
128 const base::Time& min_visit_time, 123 const base::Time& min_visit_time,
129 bool creation_date_fallback) { 124 bool creation_date_fallback) {
130 // Get all the bookmark URLs. 125 // Get all the bookmark URLs.
131 std::vector<BookmarkModel::URLAndTitle> bookmark_urls; 126 std::vector<BookmarkModel::URLAndTitle> bookmark_urls;
132 bookmark_model->GetBookmarks(&bookmark_urls); 127 bookmark_model->GetBookmarks(&bookmark_urls);
133 128
134 std::vector<RecentBookmark> bookmarks; 129 std::vector<const BookmarkNode*> recent_not_dismissed_bookmarks;
135 int recently_visited_count = 0;
136 // Find for each bookmark the most recently visited BookmarkNode and find out 130 // Find for each bookmark the most recently visited BookmarkNode and find out
137 // whether it is visited since |min_visit_time|. 131 // whether it is visited since |min_visit_time|.
138 for (const BookmarkModel::URLAndTitle& url_and_title : bookmark_urls) { 132 for (const BookmarkModel::URLAndTitle& url_and_title : bookmark_urls) {
139 // Get all bookmarks for the given URL. 133 // Get all bookmarks for the given URL.
140 std::vector<const BookmarkNode*> bookmarks_for_url; 134 std::vector<const BookmarkNode*> bookmarks_for_url;
141 bookmark_model->GetNodesByURL(url_and_title.url, &bookmarks_for_url); 135 bookmark_model->GetNodesByURL(url_and_title.url, &bookmarks_for_url);
142 DCHECK(!bookmarks_for_url.empty()); 136 DCHECK(!bookmarks_for_url.empty());
143 137
144 // Find the most recent node (minimal w.r.t. 138 // Find the most recent node (minimal w.r.t.
145 // CompareBookmarksByLastVisitDate). 139 // CompareBookmarksByLastVisitDate).
146 const BookmarkNode* most_recent = *std::min_element( 140 const BookmarkNode* most_recent = *std::min_element(
147 bookmarks_for_url.begin(), bookmarks_for_url.end(), 141 bookmarks_for_url.begin(), bookmarks_for_url.end(),
148 [creation_date_fallback](const BookmarkNode* a, const BookmarkNode* b) { 142 [creation_date_fallback](const BookmarkNode* a, const BookmarkNode* b) {
149 return CompareBookmarksByLastVisitDate(a, b, creation_date_fallback); 143 return CompareBookmarksByLastVisitDate(a, b, creation_date_fallback);
150 }); 144 });
151 145
152 // Find out if it has been _visited_ recently enough. 146 if (min_visit_time < GetLastVisitDateForBookmark(
153 bool visited_recently = 147 most_recent, /* creation_date_fallback */ false) &&
154 min_visit_time < GetLastVisitDateForBookmark( 148 !IsDismissedFromNTPForBookmark(most_recent)) {
155 most_recent, /*creation_date_fallback=*/false); 149 recent_not_dismissed_bookmarks.push_back(most_recent);
156 if (visited_recently) 150 }
157 recently_visited_count++;
158 if (!IsDismissedFromNTPForBookmark(most_recent))
159 bookmarks.push_back({most_recent, visited_recently});
Marc Treib 2016/09/01 09:46:01 We want to keep this, so that the creation_date_fa
vitaliii 2016/09/01 10:15:41 Done.
160 } 151 }
161 152
162 if (recently_visited_count < min_count) { 153 if (recent_not_dismissed_bookmarks.size() < static_cast<size_t>(min_count)) {
163 // There aren't enough recently-visited bookmarks. Fill the list up to 154 // There aren't enough recently-visited bookmarks, do not show any.
Marc Treib 2016/09/01 09:46:01 This is not the behavior we want (sorry, I must ha
vitaliii 2016/09/01 10:15:41 Done.
164 // |min_count| with older bookmarks (in particular those with only a 155 return std::vector<const BookmarkNode*>();
165 // creation date, if creation_date_fallback is true).
166 max_count = min_count;
167 } else { 156 } else {
168 // Remove the bookmarks that are not recently visited; we do not need them. 157 // Sort the bookmarks we can show by date.
169 // (We might end up with fewer than |min_count| bookmarks if all the recent 158 std::sort(recent_not_dismissed_bookmarks.begin(),
170 // ones are dismissed.) 159 recent_not_dismissed_bookmarks.end(),
171 bookmarks.erase( 160 [creation_date_fallback](const BookmarkNode* first,
172 std::remove_if(bookmarks.begin(), bookmarks.end(), 161 const BookmarkNode* second) {
173 [](const RecentBookmark& bookmark) { 162 return CompareBookmarksByLastVisitDate(first, second,
174 return !bookmark.visited_recently; 163 creation_date_fallback);
175 }), 164 });
176 bookmarks.end()); 165
166 // Return the first |max_count| items from |recent_not_dismissed_bookmarks|.
167 if (recent_not_dismissed_bookmarks.size() <=
168 static_cast<size_t>(max_count)) {
169 return recent_not_dismissed_bookmarks;
170 } else {
171 return std::vector<const BookmarkNode*>(
172 recent_not_dismissed_bookmarks.begin(),
173 recent_not_dismissed_bookmarks.begin() + max_count);
174 }
177 } 175 }
178
179 // Sort the remaining entries by date.
180 std::sort(bookmarks.begin(), bookmarks.end(),
181 [creation_date_fallback](const RecentBookmark& a,
182 const RecentBookmark& b) {
183 return CompareBookmarksByLastVisitDate(a.node, b.node,
184 creation_date_fallback);
185 });
186
187 // Insert the first |max_count| items from |bookmarks| into |result|.
Marc Treib 2016/09/01 09:46:01 I think the problem is here: We're missing a check
vitaliii 2016/09/01 10:15:41 Done.
188 std::vector<const BookmarkNode*> result;
189 for (const RecentBookmark& bookmark : bookmarks) {
190 result.push_back(bookmark.node);
191 if (result.size() >= static_cast<size_t>(max_count))
192 break;
193 }
194 return result;
195 } 176 }
196 177
197 std::vector<const BookmarkNode*> GetDismissedBookmarksForDebugging( 178 std::vector<const BookmarkNode*> GetDismissedBookmarksForDebugging(
198 BookmarkModel* bookmark_model) { 179 BookmarkModel* bookmark_model) {
199 // Get all the bookmark URLs. 180 // Get all the bookmark URLs.
200 std::vector<BookmarkModel::URLAndTitle> bookmarks; 181 std::vector<BookmarkModel::URLAndTitle> bookmarks;
201 bookmark_model->GetBookmarks(&bookmarks); 182 bookmark_model->GetBookmarks(&bookmarks);
202 183
203 // Remove the bookmark URLs which have at least one non-dismissed bookmark. 184 // Remove the bookmark URLs which have at least one non-dismissed bookmark.
204 bookmarks.erase( 185 bookmarks.erase(
(...skipping 15 matching lines...) Expand all
220 // Insert into |result|. 201 // Insert into |result|.
221 std::vector<const BookmarkNode*> result; 202 std::vector<const BookmarkNode*> result;
222 for (const BookmarkModel::URLAndTitle& bookmark : bookmarks) { 203 for (const BookmarkModel::URLAndTitle& bookmark : bookmarks) {
223 result.push_back( 204 result.push_back(
224 bookmark_model->GetMostRecentlyAddedUserNodeForURL(bookmark.url)); 205 bookmark_model->GetMostRecentlyAddedUserNodeForURL(bookmark.url));
225 } 206 }
226 return result; 207 return result;
227 } 208 }
228 209
229 } // namespace ntp_snippets 210 } // namespace ntp_snippets
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698