| Index: components/ntp_snippets/ntp_snippets_service.cc
|
| diff --git a/components/ntp_snippets/ntp_snippets_service.cc b/components/ntp_snippets/ntp_snippets_service.cc
|
| index c59770bd276f5ef92e64d525b787f96c0e90b40d..e24233bdab49a5b1e16cb8e6668413892f6a9c29 100644
|
| --- a/components/ntp_snippets/ntp_snippets_service.cc
|
| +++ b/components/ntp_snippets/ntp_snippets_service.cc
|
| @@ -15,6 +15,7 @@
|
| #include "base/metrics/histogram_macros.h"
|
| #include "base/metrics/sparse_histogram.h"
|
| #include "base/path_service.h"
|
| +#include "base/stl_util.h"
|
| #include "base/strings/string_number_conversions.h"
|
| #include "base/strings/utf_string_conversions.h"
|
| #include "base/task_runner_util.h"
|
| @@ -321,39 +322,36 @@ CategoryInfo NTPSnippetsService::GetCategoryInfo(Category category) {
|
| /* show_if_empty */ true);
|
| }
|
|
|
| -void NTPSnippetsService::DismissSuggestion(const std::string& suggestion_id) {
|
| +void NTPSnippetsService::DismissSuggestion(
|
| + const ContentSuggestion::ID& suggestion_id) {
|
| if (!ready())
|
| return;
|
|
|
| - Category category = GetCategoryFromUniqueID(suggestion_id);
|
| - std::string snippet_id = GetWithinCategoryIDFromUniqueID(suggestion_id);
|
| + DCHECK(base::ContainsKey(categories_, suggestion_id.category()));
|
|
|
| - DCHECK(categories_.find(category) != categories_.end());
|
| -
|
| - CategoryContent* content = &categories_[category];
|
| - auto it =
|
| - std::find_if(content->snippets.begin(), content->snippets.end(),
|
| - [&snippet_id](const std::unique_ptr<NTPSnippet>& snippet) {
|
| - return snippet->id() == snippet_id;
|
| - });
|
| + CategoryContent* content = &categories_[suggestion_id.category()];
|
| + auto it = std::find_if(
|
| + content->snippets.begin(), content->snippets.end(),
|
| + [&suggestion_id](const std::unique_ptr<NTPSnippet>& snippet) {
|
| + return snippet->id() == suggestion_id.id_within_category();
|
| + });
|
| if (it == content->snippets.end())
|
| return;
|
|
|
| (*it)->set_dismissed(true);
|
|
|
| database_->SaveSnippet(**it);
|
| - database_->DeleteImage(snippet_id);
|
| + database_->DeleteImage(suggestion_id.id_within_category());
|
|
|
| content->dismissed.push_back(std::move(*it));
|
| content->snippets.erase(it);
|
| }
|
|
|
| void NTPSnippetsService::FetchSuggestionImage(
|
| - const std::string& suggestion_id,
|
| + const ContentSuggestion::ID& suggestion_id,
|
| const ImageFetchedCallback& callback) {
|
| - std::string snippet_id = GetWithinCategoryIDFromUniqueID(suggestion_id);
|
| database_->LoadImage(
|
| - snippet_id,
|
| + suggestion_id.id_within_category(),
|
| base::Bind(&NTPSnippetsService::OnSnippetImageFetchedFromDatabase,
|
| base::Unretained(this), callback, suggestion_id));
|
| }
|
| @@ -400,7 +398,7 @@ void NTPSnippetsService::GetDismissedSuggestionsForDebugging(
|
| for (const std::unique_ptr<NTPSnippet>& snippet : content.dismissed) {
|
| if (!snippet->is_complete())
|
| continue;
|
| - ContentSuggestion suggestion(MakeUniqueID(category, snippet->id()),
|
| + ContentSuggestion suggestion(category, snippet->id(),
|
| snippet->best_source().url);
|
| suggestion.set_amp_url(snippet->best_source().amp_url);
|
| suggestion.set_title(base::UTF8ToUTF16(snippet->title()));
|
| @@ -451,49 +449,38 @@ int NTPSnippetsService::GetMaxSnippetCountForTesting() {
|
| // Private methods
|
|
|
| GURL NTPSnippetsService::FindSnippetImageUrl(
|
| - Category category,
|
| - const std::string& snippet_id) const {
|
| - DCHECK(categories_.find(category) != categories_.end());
|
| -
|
| - const CategoryContent& content = categories_.at(category);
|
| - // Search for the snippet in current and archived snippets.
|
| - auto it =
|
| - std::find_if(content.snippets.begin(), content.snippets.end(),
|
| - [&snippet_id](const std::unique_ptr<NTPSnippet>& snippet) {
|
| - return snippet->id() == snippet_id;
|
| - });
|
| - if (it != content.snippets.end())
|
| - return (*it)->salient_image_url();
|
| -
|
| - it = std::find_if(content.archived.begin(), content.archived.end(),
|
| - [&snippet_id](const std::unique_ptr<NTPSnippet>& snippet) {
|
| - return snippet->id() == snippet_id;
|
| - });
|
| - if (it != content.archived.end())
|
| - return (*it)->salient_image_url();
|
| -
|
| - return GURL();
|
| + const ContentSuggestion::ID& suggestion_id) const {
|
| + DCHECK(categories_.find(suggestion_id.category()) != categories_.end());
|
| +
|
| + const CategoryContent& content = categories_.at(suggestion_id.category());
|
| + const NTPSnippet* snippet =
|
| + content.FindSnippet(suggestion_id.id_within_category());
|
| + if (!snippet)
|
| + return GURL();
|
| + return snippet->salient_image_url();
|
| }
|
|
|
| // image_fetcher::ImageFetcherDelegate implementation.
|
| -void NTPSnippetsService::OnImageDataFetched(const std::string& suggestion_id,
|
| - const std::string& image_data) {
|
| +void NTPSnippetsService::OnImageDataFetched(
|
| + const std::string& id_within_category,
|
| + const std::string& image_data) {
|
| if (image_data.empty())
|
| return;
|
|
|
| - Category category = GetCategoryFromUniqueID(suggestion_id);
|
| - std::string snippet_id = GetWithinCategoryIDFromUniqueID(suggestion_id);
|
| -
|
| - if (categories_.find(category) == categories_.end())
|
| - return;
|
| -
|
| // Only save the image if the corresponding snippet still exists.
|
| - if (FindSnippetImageUrl(category, snippet_id).is_empty())
|
| + bool found = false;
|
| + for (const std::pair<const Category, CategoryContent>& entry : categories_) {
|
| + if (entry.second.FindSnippet(id_within_category)) {
|
| + found = true;
|
| + break;
|
| + }
|
| + }
|
| + if (!found)
|
| return;
|
|
|
| // Only cache the data in the DB, the actual serving is done in the callback
|
| // provided to |image_fetcher_| (OnSnippetImageDecodedFromNetwork()).
|
| - database_->SaveImage(snippet_id, image_data);
|
| + database_->SaveImage(id_within_category, image_data);
|
| }
|
|
|
| void NTPSnippetsService::OnDatabaseLoaded(NTPSnippet::PtrVector snippets) {
|
| @@ -819,7 +806,7 @@ void NTPSnippetsService::NukeAllSnippets() {
|
|
|
| void NTPSnippetsService::OnSnippetImageFetchedFromDatabase(
|
| const ImageFetchedCallback& callback,
|
| - const std::string& suggestion_id,
|
| + const ContentSuggestion::ID& suggestion_id,
|
| std::string data) {
|
| // |image_decoder_| is null in tests.
|
| if (image_decoder_ && !data.empty()) {
|
| @@ -835,7 +822,7 @@ void NTPSnippetsService::OnSnippetImageFetchedFromDatabase(
|
|
|
| void NTPSnippetsService::OnSnippetImageDecodedFromDatabase(
|
| const ImageFetchedCallback& callback,
|
| - const std::string& suggestion_id,
|
| + const ContentSuggestion::ID& suggestion_id,
|
| const gfx::Image& image) {
|
| if (!image.IsEmpty()) {
|
| callback.Run(image);
|
| @@ -843,24 +830,21 @@ void NTPSnippetsService::OnSnippetImageDecodedFromDatabase(
|
| }
|
|
|
| // If decoding the image failed, delete the DB entry.
|
| - std::string snippet_id = GetWithinCategoryIDFromUniqueID(suggestion_id);
|
| - database_->DeleteImage(snippet_id);
|
| + database_->DeleteImage(suggestion_id.id_within_category());
|
|
|
| FetchSnippetImageFromNetwork(suggestion_id, callback);
|
| }
|
|
|
| void NTPSnippetsService::FetchSnippetImageFromNetwork(
|
| - const std::string& suggestion_id,
|
| + const ContentSuggestion::ID& suggestion_id,
|
| const ImageFetchedCallback& callback) {
|
| - Category category = GetCategoryFromUniqueID(suggestion_id);
|
| - std::string snippet_id = GetWithinCategoryIDFromUniqueID(suggestion_id);
|
| -
|
| - if (categories_.find(category) == categories_.end()) {
|
| - OnSnippetImageDecodedFromNetwork(callback, suggestion_id, gfx::Image());
|
| + if (categories_.find(suggestion_id.category()) == categories_.end()) {
|
| + OnSnippetImageDecodedFromNetwork(
|
| + callback, suggestion_id.id_within_category(), gfx::Image());
|
| return;
|
| }
|
|
|
| - GURL image_url = FindSnippetImageUrl(category, snippet_id);
|
| + GURL image_url = FindSnippetImageUrl(suggestion_id);
|
|
|
| if (image_url.is_empty() ||
|
| !thumbnail_requests_throttler_.DemandQuotaForRequest(
|
| @@ -868,19 +852,20 @@ void NTPSnippetsService::FetchSnippetImageFromNetwork(
|
| // Return an empty image. Directly, this is never synchronous with the
|
| // original FetchSuggestionImage() call - an asynchronous database query has
|
| // happened in the meantime.
|
| - OnSnippetImageDecodedFromNetwork(callback, suggestion_id, gfx::Image());
|
| + OnSnippetImageDecodedFromNetwork(
|
| + callback, suggestion_id.id_within_category(), gfx::Image());
|
| return;
|
| }
|
|
|
| image_fetcher_->StartOrQueueNetworkRequest(
|
| - suggestion_id, image_url,
|
| + suggestion_id.id_within_category(), image_url,
|
| base::Bind(&NTPSnippetsService::OnSnippetImageDecodedFromNetwork,
|
| base::Unretained(this), callback));
|
| }
|
|
|
| void NTPSnippetsService::OnSnippetImageDecodedFromNetwork(
|
| const ImageFetchedCallback& callback,
|
| - const std::string& suggestion_id,
|
| + const std::string& id_within_category,
|
| const gfx::Image& image) {
|
| callback.Run(image);
|
| }
|
| @@ -1026,7 +1011,7 @@ void NTPSnippetsService::NotifyNewSuggestions() {
|
| // incomplete ones we kept.
|
| if (!snippet->is_complete())
|
| continue;
|
| - ContentSuggestion suggestion(MakeUniqueID(category, snippet->id()),
|
| + ContentSuggestion suggestion(category, snippet->id(),
|
| snippet->best_source().url);
|
| suggestion.set_amp_url(snippet->best_source().amp_url);
|
| suggestion.set_title(base::UTF8ToUTF16(snippet->title()));
|
| @@ -1064,6 +1049,28 @@ void NTPSnippetsService::UpdateAllCategoryStatus(CategoryStatus status) {
|
| }
|
| }
|
|
|
| +const NTPSnippet* NTPSnippetsService::CategoryContent::FindSnippet(
|
| + const std::string& id_within_category) const {
|
| + // Search for the snippet in current and archived snippets.
|
| + auto it = std::find_if(
|
| + snippets.begin(), snippets.end(),
|
| + [&id_within_category](const std::unique_ptr<NTPSnippet>& snippet) {
|
| + return snippet->id() == id_within_category;
|
| + });
|
| + if (it != snippets.end())
|
| + return it->get();
|
| +
|
| + it = std::find_if(
|
| + archived.begin(), archived.end(),
|
| + [&id_within_category](const std::unique_ptr<NTPSnippet>& snippet) {
|
| + return snippet->id() == id_within_category;
|
| + });
|
| + if (it != archived.end())
|
| + return it->get();
|
| +
|
| + return nullptr;
|
| +}
|
| +
|
| NTPSnippetsService::CategoryContent::CategoryContent() = default;
|
| NTPSnippetsService::CategoryContent::CategoryContent(CategoryContent&&) =
|
| default;
|
|
|