Chromium Code Reviews| 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..2626ddad09ca447246c32601d5dce20e9055770c 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,67 @@ 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 ""; |
|
Bernhard Bauer
2016/07/12 14:44:51
Nit: Use an empty std::string() constructor instea
Philipp Keck
2016/07/12 15:19:56
Done.
|
| + } |
| +} |
| + |
| +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"; |
| + } |
| +} |
| + |
| } // 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 +138,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 +183,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 +235,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 +278,7 @@ void SnippetsInternalsMessageHandler::SendInitialData() { |
| SendSnippets(); |
| SendDiscardedSnippets(); |
| + SendContentSuggestions(); |
| } |
| void SnippetsInternalsMessageHandler::SendSnippets() { |
| @@ -222,6 +331,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"); |