| Index: chrome/browser/ui/webui/snippets_internals_message_handler.cc
|
| diff --git a/chrome/browser/ui/webui/snippets_internals_message_handler.cc b/chrome/browser/ui/webui/snippets_internals_message_handler.cc
|
| index f6e7411baf0ca1ad6ad5cf19a64dda6b3303b449..fdb57a837b076e95f3ebbaf3f8d2c0c29713fbd7 100644
|
| --- a/chrome/browser/ui/webui/snippets_internals_message_handler.cc
|
| +++ b/chrome/browser/ui/webui/snippets_internals_message_handler.cc
|
| @@ -14,16 +14,22 @@
|
| #include "base/feature_list.h"
|
| #include "base/i18n/time_formatting.h"
|
| #include "base/logging.h"
|
| +#include "base/memory/ptr_util.h"
|
| #include "base/strings/string_number_conversions.h"
|
| #include "base/strings/string_split.h"
|
| #include "base/values.h"
|
| #include "chrome/browser/android/chrome_feature_list.h"
|
| +#include "chrome/browser/ntp_snippets/content_suggestions_service_factory.h"
|
| #include "chrome/browser/ntp_snippets/ntp_snippets_service_factory.h"
|
| #include "chrome/browser/profiles/profile.h"
|
| #include "components/ntp_snippets/ntp_snippet.h"
|
| #include "components/ntp_snippets/switches.h"
|
| #include "content/public/browser/web_ui.h"
|
|
|
| +using ntp_snippets::ContentSuggestion;
|
| +using ntp_snippets::ContentSuggestionsCategory;
|
| +using ntp_snippets::ContentSuggestionsCategoryStatus;
|
| +
|
| namespace {
|
|
|
| std::unique_ptr<base::DictionaryValue> PrepareSnippet(
|
| @@ -52,12 +58,68 @@ std::unique_ptr<base::DictionaryValue> PrepareSnippet(
|
| return entry;
|
| }
|
|
|
| +std::unique_ptr<base::DictionaryValue> PrepareSuggestion(
|
| + const ContentSuggestion& suggestion,
|
| + int index) {
|
| + auto entry = base::MakeUnique<base::DictionaryValue>();
|
| + entry->SetString("suggestionId", suggestion.id());
|
| + entry->SetString("url", suggestion.url().spec());
|
| + entry->SetString("ampUrl", suggestion.amp_url().spec());
|
| + entry->SetString("title", suggestion.title());
|
| + entry->SetString("snippetText", suggestion.snippet_text());
|
| + entry->SetString("publishDate",
|
| + TimeFormatShortDateAndTime(suggestion.publish_date()));
|
| + entry->SetString("publisherName", suggestion.publisher_name());
|
| + entry->SetString("id", "content-suggestion-" + base::IntToString(index));
|
| + return entry;
|
| +}
|
| +
|
| +std::string MapCategoryName(ContentSuggestionsCategory category) {
|
| + switch (category) {
|
| + case ContentSuggestionsCategory::ARTICLES:
|
| + return "Articles";
|
| + case ContentSuggestionsCategory::COUNT:
|
| + NOTREACHED() << "Category::COUNT must not be used as a value";
|
| + }
|
| + return std::string();
|
| +}
|
| +
|
| +std::string MapCategoryStatus(ContentSuggestionsCategoryStatus status) {
|
| + switch (status) {
|
| + case ContentSuggestionsCategoryStatus::INITIALIZING:
|
| + return "INITIALIZING";
|
| + case ContentSuggestionsCategoryStatus::AVAILABLE:
|
| + return "AVAILABLE";
|
| + case ContentSuggestionsCategoryStatus::AVAILABLE_LOADING:
|
| + return "AVAILABLE_LOADING";
|
| + case ContentSuggestionsCategoryStatus::NOT_PROVIDED:
|
| + return "NOT_PROVIDED";
|
| + case ContentSuggestionsCategoryStatus::ALL_SUGGESTIONS_EXPLICITLY_DISABLED:
|
| + return "ALL_SUGGESTIONS_EXPLICITLY_DISABLED";
|
| + case ContentSuggestionsCategoryStatus::CATEGORY_EXPLICITLY_DISABLED:
|
| + return "CATEGORY_EXPLICITLY_DISABLED";
|
| + case ContentSuggestionsCategoryStatus::SIGNED_OUT:
|
| + return "SIGNED_OUT";
|
| + case ContentSuggestionsCategoryStatus::SYNC_DISABLED:
|
| + return "SYNC_DISABLED";
|
| + case ContentSuggestionsCategoryStatus::PASSPHRASE_ENCRYPTION_ENABLED:
|
| + return "PASSPHRASE_ENCRYPTION_ENABLED";
|
| + case ContentSuggestionsCategoryStatus::HISTORY_SYNC_DISABLED:
|
| + return "HISTORY_SYNC_DISABLED";
|
| + case ContentSuggestionsCategoryStatus::LOADING_ERROR:
|
| + return "LOADING_ERROR";
|
| + }
|
| + return std::string();
|
| +}
|
| +
|
| } // namespace
|
|
|
| SnippetsInternalsMessageHandler::SnippetsInternalsMessageHandler()
|
| - : observer_(this),
|
| + : ntp_snippets_service_observer_(this),
|
| + content_suggestions_service_observer_(this),
|
| dom_loaded_(false),
|
| - ntp_snippets_service_(nullptr) {}
|
| + ntp_snippets_service_(nullptr),
|
| + content_suggestions_service_(nullptr) {}
|
|
|
| SnippetsInternalsMessageHandler::~SnippetsInternalsMessageHandler() {}
|
|
|
| @@ -77,11 +139,33 @@ void SnippetsInternalsMessageHandler::NTPSnippetsServiceLoaded() {
|
| void SnippetsInternalsMessageHandler::NTPSnippetsServiceDisabledReasonChanged(
|
| ntp_snippets::DisabledReason disabled_reason) {}
|
|
|
| +void SnippetsInternalsMessageHandler::OnNewSuggestions() {
|
| + if (!dom_loaded_)
|
| + return;
|
| + SendContentSuggestions();
|
| +}
|
| +
|
| +void SnippetsInternalsMessageHandler::OnCategoryStatusChanged(
|
| + ContentSuggestionsCategory category,
|
| + ContentSuggestionsCategoryStatus new_status) {
|
| + if (!dom_loaded_)
|
| + return;
|
| + SendContentSuggestions();
|
| +}
|
| +
|
| +void SnippetsInternalsMessageHandler::ContentSuggestionsServiceShutdown() {}
|
| +
|
| void SnippetsInternalsMessageHandler::RegisterMessages() {
|
| // additional initialization (web_ui() does not work from the constructor)
|
| - ntp_snippets_service_ = NTPSnippetsServiceFactory::GetInstance()->
|
| - GetForProfile(Profile::FromWebUI(web_ui()));
|
| - observer_.Add(ntp_snippets_service_);
|
| + Profile* profile = Profile::FromWebUI(web_ui());
|
| +
|
| + ntp_snippets_service_ =
|
| + NTPSnippetsServiceFactory::GetInstance()->GetForProfile(profile);
|
| + ntp_snippets_service_observer_.Add(ntp_snippets_service_);
|
| +
|
| + content_suggestions_service_ =
|
| + ContentSuggestionsServiceFactory::GetInstance()->GetForProfile(profile);
|
| + content_suggestions_service_observer_.Add(content_suggestions_service_);
|
|
|
| web_ui()->RegisterMessageCallback(
|
| "loaded",
|
| @@ -100,6 +184,17 @@ void SnippetsInternalsMessageHandler::RegisterMessages() {
|
| "clearDiscarded",
|
| base::Bind(&SnippetsInternalsMessageHandler::HandleClearDiscarded,
|
| base::Unretained(this)));
|
| +
|
| + web_ui()->RegisterMessageCallback(
|
| + "clearCachedSuggestions",
|
| + base::Bind(&SnippetsInternalsMessageHandler::HandleClearCachedSuggestions,
|
| + base::Unretained(this)));
|
| +
|
| + web_ui()->RegisterMessageCallback(
|
| + "clearDiscardedSuggestions",
|
| + base::Bind(
|
| + &SnippetsInternalsMessageHandler::HandleClearDiscardedSuggestions,
|
| + base::Unretained(this)));
|
| }
|
|
|
| void SnippetsInternalsMessageHandler::HandleLoaded(
|
| @@ -141,6 +236,20 @@ void SnippetsInternalsMessageHandler::HandleDownload(
|
| ntp_snippets_service_->FetchSnippetsFromHosts(hosts);
|
| }
|
|
|
| +void SnippetsInternalsMessageHandler::HandleClearCachedSuggestions(
|
| + const base::ListValue* args) {
|
| + DCHECK_EQ(0u, args->GetSize());
|
| +
|
| + content_suggestions_service_->ClearCachedSuggestionsForDebugging();
|
| +}
|
| +
|
| +void SnippetsInternalsMessageHandler::HandleClearDiscardedSuggestions(
|
| + const base::ListValue* args) {
|
| + DCHECK_EQ(0u, args->GetSize());
|
| +
|
| + content_suggestions_service_->ClearDiscardedSuggestionsForDebugging();
|
| +}
|
| +
|
| void SnippetsInternalsMessageHandler::SendInitialData() {
|
| SendHosts();
|
|
|
| @@ -170,6 +279,7 @@ void SnippetsInternalsMessageHandler::SendInitialData() {
|
|
|
| SendSnippets();
|
| SendDiscardedSnippets();
|
| + SendContentSuggestions();
|
| }
|
|
|
| void SnippetsInternalsMessageHandler::SendSnippets() {
|
| @@ -222,6 +332,36 @@ void SnippetsInternalsMessageHandler::SendHosts() {
|
| "chrome.SnippetsInternals.receiveHosts", result);
|
| }
|
|
|
| +void SnippetsInternalsMessageHandler::SendContentSuggestions() {
|
| + std::unique_ptr<base::ListValue> categories_list(new base::ListValue);
|
| +
|
| + int index = 0;
|
| + for (ContentSuggestionsCategory category :
|
| + content_suggestions_service_->GetCategories()) {
|
| + ContentSuggestionsCategoryStatus status =
|
| + content_suggestions_service_->GetCategoryStatus(category);
|
| + const std::vector<ContentSuggestion>& suggestions =
|
| + content_suggestions_service_->GetSuggestionsForCategory(category);
|
| +
|
| + std::unique_ptr<base::ListValue> suggestions_list(new base::ListValue);
|
| + for (const ContentSuggestion& suggestion : suggestions) {
|
| + suggestions_list->Append(PrepareSuggestion(suggestion, index++));
|
| + }
|
| +
|
| + std::unique_ptr<base::DictionaryValue> category_entry(
|
| + new base::DictionaryValue);
|
| + category_entry->SetString("name", MapCategoryName(category));
|
| + category_entry->SetString("status", MapCategoryStatus(status));
|
| + category_entry->Set("suggestions", std::move(suggestions_list));
|
| + categories_list->Append(std::move(category_entry));
|
| + }
|
| +
|
| + base::DictionaryValue result;
|
| + result.Set("list", std::move(categories_list));
|
| + web_ui()->CallJavascriptFunctionUnsafe(
|
| + "chrome.SnippetsInternals.receiveContentSuggestions", result);
|
| +}
|
| +
|
| void SnippetsInternalsMessageHandler::SendBoolean(const std::string& name,
|
| bool value) {
|
| SendString(name, value ? "True" : "False");
|
|
|