Index: components/ntp_tiles/webui/ntp_tiles_internals_message_handler.cc |
diff --git a/components/ntp_tiles/webui/ntp_tiles_internals_message_handler.cc b/components/ntp_tiles/webui/ntp_tiles_internals_message_handler.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..d10a6c05fc90af73deeee19ac03b6fa07ea3ad16 |
--- /dev/null |
+++ b/components/ntp_tiles/webui/ntp_tiles_internals_message_handler.cc |
@@ -0,0 +1,160 @@ |
+// Copyright 2016 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "components/ntp_tiles/webui/ntp_tiles_internals_message_handler.h" |
+ |
+#include "base/bind.h" |
+#include "base/callback.h" |
+#include "base/logging.h" |
+#include "base/memory/ptr_util.h" |
+#include "base/values.h" |
+#include "components/ntp_tiles/most_visited_sites.h" |
+#include "components/ntp_tiles/pref_names.h" |
+#include "components/ntp_tiles/webui/ntp_tiles_internals_message_handler_client.h" |
+#include "components/prefs/pref_service.h" |
+#include "components/url_formatter/url_fixer.h" |
+#include "url/gurl.h" |
+ |
+namespace ntp_tiles { |
+ |
+NTPTilesInternalsMessageHandlerClient::NTPTilesInternalsMessageHandlerClient() = |
+ default; |
+NTPTilesInternalsMessageHandlerClient:: |
+ ~NTPTilesInternalsMessageHandlerClient() = default; |
+ |
+NTPTilesInternalsMessageHandler::NTPTilesInternalsMessageHandler() |
+ : client_(nullptr), site_count_(8) {} |
+ |
+NTPTilesInternalsMessageHandler::~NTPTilesInternalsMessageHandler() = default; |
+ |
+void NTPTilesInternalsMessageHandler::RegisterMessages( |
+ NTPTilesInternalsMessageHandlerClient* client) { |
+ client_ = client; |
+ |
+ client_->RegisterMessageCallback( |
+ "registerForEvents", |
+ base::Bind(&NTPTilesInternalsMessageHandler::HandleRegisterForEvents, |
+ base::Unretained(this))); |
+ |
+ client_->RegisterMessageCallback( |
+ "update", base::Bind(&NTPTilesInternalsMessageHandler::HandleUpdate, |
+ base::Unretained(this))); |
+} |
+ |
+void NTPTilesInternalsMessageHandler::HandleRegisterForEvents( |
+ const base::ListValue* args) { |
+ DCHECK(args->empty()); |
+ |
+ SendSourceInfo(); |
+ |
+ most_visited_sites_ = client_->MakeMostVisitedSites(); |
+ most_visited_sites_->SetMostVisitedURLsObserver(this, site_count_); |
+} |
+ |
+void NTPTilesInternalsMessageHandler::HandleUpdate( |
+ const base::ListValue* args) { |
+ const base::DictionaryValue* dict = nullptr; |
+ DCHECK_EQ(1u, args->GetSize()); |
+ args->GetDictionary(0, &dict); |
+ DCHECK(dict); |
+ |
+ PrefService* prefs = client_->GetPrefs(); |
+ |
+ if (client_->DoesSourceExist(ntp_tiles::NTPTileSource::POPULAR)) { |
+ std::string url; |
+ dict->GetString("popular.overrideURL", &url); |
+ if (url.empty()) { |
+ prefs->ClearPref(ntp_tiles::prefs::kPopularSitesOverrideURL); |
+ } else { |
+ prefs->SetString(ntp_tiles::prefs::kPopularSitesOverrideURL, |
+ url_formatter::FixupURL(url, std::string()).spec()); |
+ } |
+ |
+ std::string country; |
+ dict->GetString("popular.overrideCountry", &country); |
+ if (country.empty()) { |
+ prefs->ClearPref(ntp_tiles::prefs::kPopularSitesOverrideCountry); |
+ } else { |
+ prefs->SetString(ntp_tiles::prefs::kPopularSitesOverrideCountry, country); |
+ } |
+ |
+ std::string version; |
+ dict->GetString("popular.overrideVersion", &version); |
+ if (version.empty()) { |
+ prefs->ClearPref(ntp_tiles::prefs::kPopularSitesOverrideVersion); |
+ } else { |
+ prefs->SetString(ntp_tiles::prefs::kPopularSitesOverrideVersion, version); |
+ } |
+ } |
+ |
+ // Recreate to pick up new values. |
+ // TODO(sfiera): refresh MostVisitedSites without re-creating it, as soon as |
+ // that will pick up changes to the Popular Sites overrides. |
+ most_visited_sites_ = client_->MakeMostVisitedSites(); |
+ most_visited_sites_->SetMostVisitedURLsObserver(this, site_count_); |
+ SendSourceInfo(); |
+} |
+ |
+void NTPTilesInternalsMessageHandler::SendSourceInfo() { |
+ PrefService* prefs = client_->GetPrefs(); |
+ base::DictionaryValue value; |
+ |
+ value.SetBoolean("topSites", |
+ client_->DoesSourceExist(NTPTileSource::TOP_SITES)); |
+ value.SetBoolean( |
+ "suggestionsService", |
+ client_->DoesSourceExist(NTPTileSource::SUGGESTIONS_SERVICE)); |
+ value.SetBoolean("whitelist", |
+ client_->DoesSourceExist(NTPTileSource::WHITELIST)); |
+ |
+ if (client_->DoesSourceExist(NTPTileSource::POPULAR)) { |
+ auto popular_sites = client_->MakePopularSites(); |
+ value.SetString("popular.url", popular_sites->GetURLToUse().spec()); |
+ value.SetString("popular.country", popular_sites->GetCountryToUse()); |
+ value.SetString("popular.version", popular_sites->GetVersionToUse()); |
+ |
+ value.SetString( |
+ "popular.overrideURL", |
+ prefs->GetString(ntp_tiles::prefs::kPopularSitesOverrideURL)); |
+ value.SetString( |
+ "popular.overrideCountry", |
+ prefs->GetString(ntp_tiles::prefs::kPopularSitesOverrideCountry)); |
+ value.SetString( |
+ "popular.overrideVersion", |
+ prefs->GetString(ntp_tiles::prefs::kPopularSitesOverrideVersion)); |
+ } else { |
+ value.SetBoolean("popular", false); |
+ } |
+ |
+ client_->CallJavascriptFunction( |
+ "chrome.ntp_tiles_internals.receiveSourceInfo", value); |
+} |
+ |
+void NTPTilesInternalsMessageHandler::SendTiles(const NTPTilesVector& tiles) { |
+ auto sites_list = base::MakeUnique<base::ListValue>(); |
+ for (const NTPTile& tile : tiles) { |
+ auto entry = base::MakeUnique<base::DictionaryValue>(); |
+ entry->SetString("title", tile.title); |
+ entry->SetString("url", tile.url.spec()); |
+ entry->SetInteger("source", static_cast<int>(tile.source)); |
+ entry->SetString("whitelistIconPath", |
+ tile.whitelist_icon_path.LossyDisplayName()); |
+ sites_list->Append(std::move(entry)); |
+ } |
+ |
+ base::DictionaryValue result; |
+ result.Set("sites", std::move(sites_list)); |
+ client_->CallJavascriptFunction("chrome.ntp_tiles_internals.receiveSites", |
+ result); |
+} |
+ |
+void NTPTilesInternalsMessageHandler::OnMostVisitedURLsAvailable( |
+ const NTPTilesVector& tiles) { |
+ SendTiles(tiles); |
+} |
+ |
+void NTPTilesInternalsMessageHandler::OnIconMadeAvailable( |
+ const GURL& site_url) {} |
+ |
+} // namespace ntp_tiles |