| OLD | NEW |
| 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/sessions/foreign_sessions_suggestions_provider
.h" | 5 #include "components/ntp_snippets/sessions/foreign_sessions_suggestions_provider
.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <map> | 8 #include <map> |
| 9 #include <tuple> | 9 #include <tuple> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 118 Category category) { | 118 Category category) { |
| 119 DCHECK_EQ(category, provided_category_); | 119 DCHECK_EQ(category, provided_category_); |
| 120 return CategoryInfo(l10n_util::GetStringUTF16( | 120 return CategoryInfo(l10n_util::GetStringUTF16( |
| 121 IDS_NTP_FOREIGN_SESSIONS_SUGGESTIONS_SECTION_HEADER), | 121 IDS_NTP_FOREIGN_SESSIONS_SUGGESTIONS_SECTION_HEADER), |
| 122 ContentSuggestionsCardLayout::MINIMAL_CARD, | 122 ContentSuggestionsCardLayout::MINIMAL_CARD, |
| 123 /*has_more_button=*/true, | 123 /*has_more_button=*/true, |
| 124 /*show_if_empty=*/false); | 124 /*show_if_empty=*/false); |
| 125 } | 125 } |
| 126 | 126 |
| 127 void ForeignSessionsSuggestionsProvider::DismissSuggestion( | 127 void ForeignSessionsSuggestionsProvider::DismissSuggestion( |
| 128 const std::string& suggestion_id) { | 128 const ContentSuggestion::ID& suggestion_id) { |
| 129 // TODO(skym): Right now this continuously grows, without clearing out old and | 129 // TODO(skym): Right now this continuously grows, without clearing out old and |
| 130 // irrelevant entries. Could either use a timestamp and expire after a | 130 // irrelevant entries. Could either use a timestamp and expire after a |
| 131 // threshold, or compare with current foreign tabs and remove anything that | 131 // threshold, or compare with current foreign tabs and remove anything that |
| 132 // isn't actively blockign a foreign_sessions tab. | 132 // isn't actively blockign a foreign_sessions tab. |
| 133 std::set<std::string> dismissed_ids = prefs::ReadDismissedIDsFromPrefs( | 133 std::set<std::string> dismissed_ids = prefs::ReadDismissedIDsFromPrefs( |
| 134 *pref_service_, prefs::kDismissedForeignSessionsSuggestions); | 134 *pref_service_, prefs::kDismissedForeignSessionsSuggestions); |
| 135 dismissed_ids.insert(suggestion_id); | 135 dismissed_ids.insert(suggestion_id.within_category_id()); |
| 136 prefs::StoreDismissedIDsToPrefs(pref_service_, | 136 prefs::StoreDismissedIDsToPrefs(pref_service_, |
| 137 prefs::kDismissedForeignSessionsSuggestions, | 137 prefs::kDismissedForeignSessionsSuggestions, |
| 138 dismissed_ids); | 138 dismissed_ids); |
| 139 } | 139 } |
| 140 | 140 |
| 141 void ForeignSessionsSuggestionsProvider::FetchSuggestionImage( | 141 void ForeignSessionsSuggestionsProvider::FetchSuggestionImage( |
| 142 const std::string& suggestion_id, | 142 const ContentSuggestion::ID& suggestion_id, |
| 143 const ImageFetchedCallback& callback) { | 143 const ImageFetchedCallback& callback) { |
| 144 base::ThreadTaskRunnerHandle::Get()->PostTask( | 144 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 145 FROM_HERE, base::Bind(callback, gfx::Image())); | 145 FROM_HERE, base::Bind(callback, gfx::Image())); |
| 146 } | 146 } |
| 147 | 147 |
| 148 void ForeignSessionsSuggestionsProvider::ClearHistory( | 148 void ForeignSessionsSuggestionsProvider::ClearHistory( |
| 149 base::Time begin, | 149 base::Time begin, |
| 150 base::Time end, | 150 base::Time end, |
| 151 const base::Callback<bool(const GURL& url)>& filter) { | 151 const base::Callback<bool(const GURL& url)>& filter) { |
| 152 std::set<std::string> dismissed_ids = prefs::ReadDismissedIDsFromPrefs( | 152 std::set<std::string> dismissed_ids = prefs::ReadDismissedIDsFromPrefs( |
| 153 *pref_service_, prefs::kDismissedForeignSessionsSuggestions); | 153 *pref_service_, prefs::kDismissedForeignSessionsSuggestions); |
| 154 for (auto iter = dismissed_ids.begin(); iter != dismissed_ids.end();) { | 154 for (auto iter = dismissed_ids.begin(); iter != dismissed_ids.end();) { |
| 155 if (filter.Run(GURL(base::StringPiece(*iter)))) { | 155 if (filter.Run(GURL(*iter))) { |
| 156 iter = dismissed_ids.erase(iter); | 156 iter = dismissed_ids.erase(iter); |
| 157 } else { | 157 } else { |
| 158 ++iter; | 158 ++iter; |
| 159 } | 159 } |
| 160 } | 160 } |
| 161 prefs::StoreDismissedIDsToPrefs(pref_service_, | 161 prefs::StoreDismissedIDsToPrefs(pref_service_, |
| 162 prefs::kDismissedForeignSessionsSuggestions, | 162 prefs::kDismissedForeignSessionsSuggestions, |
| 163 dismissed_ids); | 163 dismissed_ids); |
| 164 } | 164 } |
| 165 | 165 |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 270 | 270 |
| 271 for (const SyncedSession* session : foreign_sessions) { | 271 for (const SyncedSession* session : foreign_sessions) { |
| 272 for (const std::pair<const SessionID::id_type, | 272 for (const std::pair<const SessionID::id_type, |
| 273 std::unique_ptr<sessions::SessionWindow>>& key_value : | 273 std::unique_ptr<sessions::SessionWindow>>& key_value : |
| 274 session->windows) { | 274 session->windows) { |
| 275 for (const std::unique_ptr<SessionTab>& tab : key_value.second->tabs) { | 275 for (const std::unique_ptr<SessionTab>& tab : key_value.second->tabs) { |
| 276 if (tab->navigations.empty()) | 276 if (tab->navigations.empty()) |
| 277 continue; | 277 continue; |
| 278 | 278 |
| 279 const SerializedNavigationEntry& navigation = tab->navigations.back(); | 279 const SerializedNavigationEntry& navigation = tab->navigations.back(); |
| 280 const std::string unique_id = | 280 const std::string id = navigation.virtual_url().spec(); |
| 281 MakeUniqueID(provided_category_, navigation.virtual_url().spec()); | |
| 282 // TODO(skym): Filter out internal pages. Tabs that contain only | 281 // TODO(skym): Filter out internal pages. Tabs that contain only |
| 283 // non-syncable content should never reach the local client, but | 282 // non-syncable content should never reach the local client, but |
| 284 // sometimes the most recent navigation may be internal while one | 283 // sometimes the most recent navigation may be internal while one |
| 285 // of the previous ones was more valid. | 284 // of the previous ones was more valid. |
| 286 if (dismissed_ids.find(unique_id) == dismissed_ids.end() && | 285 if (dismissed_ids.find(id) == dismissed_ids.end() && |
| 287 (base::Time::Now() - tab->timestamp) < max_foreign_tab_age) { | 286 (base::Time::Now() - tab->timestamp) < max_foreign_tab_age) { |
| 288 suggestion_candidates.push_back( | 287 suggestion_candidates.push_back( |
| 289 SessionData{session, tab.get(), &navigation}); | 288 SessionData{session, tab.get(), &navigation}); |
| 290 } | 289 } |
| 291 } | 290 } |
| 292 } | 291 } |
| 293 } | 292 } |
| 294 return suggestion_candidates; | 293 return suggestion_candidates; |
| 295 } | 294 } |
| 296 | 295 |
| 297 ContentSuggestion ForeignSessionsSuggestionsProvider::BuildSuggestion( | 296 ContentSuggestion ForeignSessionsSuggestionsProvider::BuildSuggestion( |
| 298 const SessionData& data) { | 297 const SessionData& data) { |
| 299 ContentSuggestion suggestion( | 298 ContentSuggestion suggestion(provided_category_, |
| 300 MakeUniqueID(provided_category_, data.navigation->virtual_url().spec()), | 299 data.navigation->virtual_url().spec(), |
| 301 data.navigation->virtual_url()); | 300 data.navigation->virtual_url()); |
| 302 suggestion.set_title(data.navigation->title()); | 301 suggestion.set_title(data.navigation->title()); |
| 303 suggestion.set_publish_date(data.tab->timestamp); | 302 suggestion.set_publish_date(data.tab->timestamp); |
| 304 // TODO(skym): It's unclear if this simple approach is sufficient for | 303 // TODO(skym): It's unclear if this simple approach is sufficient for |
| 305 // right-to-left languages. | 304 // right-to-left languages. |
| 306 // This field is sandwiched between the url's favicon, which is on the left, | 305 // This field is sandwiched between the url's favicon, which is on the left, |
| 307 // and the |publish_date|, which is to the right. The domain should always | 306 // and the |publish_date|, which is to the right. The domain should always |
| 308 // appear next to the favicon. | 307 // appear next to the favicon. |
| 309 suggestion.set_publisher_name( | 308 suggestion.set_publisher_name( |
| 310 base::UTF8ToUTF16(data.navigation->virtual_url().host() + " - " + | 309 base::UTF8ToUTF16(data.navigation->virtual_url().host() + " - " + |
| 311 data.session->session_name)); | 310 data.session->session_name)); |
| 312 return suggestion; | 311 return suggestion; |
| 313 } | 312 } |
| 314 | 313 |
| 315 } // namespace ntp_snippets | 314 } // namespace ntp_snippets |
| OLD | NEW |