Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(361)

Unified Diff: components/ntp_tiles/webui/ntp_tiles_internals_message_handler.cc

Issue 2936793002: ntp_tiles: Extend chrome://ntp-tiles-internals with favicon data (Closed)
Patch Set: Avoid using std::pair with constexpr. Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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
index ea6ee51c7586c9cd7908b3590db9ebc14d34c681..fb06ccd1fff561e673f613f4a5168375a9c0a98d 100644
--- a/components/ntp_tiles/webui/ntp_tiles_internals_message_handler.cc
+++ b/components/ntp_tiles/webui/ntp_tiles_internals_message_handler.cc
@@ -4,6 +4,8 @@
#include "components/ntp_tiles/webui/ntp_tiles_internals_message_handler.h"
+#include <array>
+
#include "base/bind.h"
#include "base/callback.h"
#include "base/files/file_util.h"
@@ -13,6 +15,7 @@
#include "base/memory/ptr_util.h"
#include "base/task_runner_util.h"
#include "base/values.h"
+#include "components/favicon/core/favicon_service.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"
@@ -24,6 +27,21 @@ namespace ntp_tiles {
namespace {
+using FaviconResultMap = std::map<std::pair<GURL, favicon_base::IconType>,
+ favicon_base::FaviconRawBitmapResult>;
+
+struct IconTypeAndName {
+ favicon_base::IconType type_enum;
+ const char* type_name;
+};
+
+constexpr std::array<IconTypeAndName, 4> kIconTypesAndNames{{
+ {favicon_base::FAVICON, "FAVICON"},
+ {favicon_base::TOUCH_ICON, "TOUCH_ICON"},
+ {favicon_base::TOUCH_PRECOMPOSED_ICON, "TOUCH_PRECOMPOSED_ICON"},
+ {favicon_base::WEB_MANIFEST_ICON, "WEB_MANIFEST_ICON"},
+}};
+
std::string FormatJson(const base::Value& value) {
std::string pretty_printed;
bool ok = base::JSONWriter::WriteWithOptions(
@@ -34,8 +52,12 @@ std::string FormatJson(const base::Value& value) {
} // namespace
-NTPTilesInternalsMessageHandler::NTPTilesInternalsMessageHandler()
- : client_(nullptr), site_count_(8), weak_ptr_factory_(this) {}
+NTPTilesInternalsMessageHandler::NTPTilesInternalsMessageHandler(
+ favicon::FaviconService* favicon_service)
+ : favicon_service_(favicon_service),
+ client_(nullptr),
+ site_count_(8),
+ weak_ptr_factory_(this) {}
NTPTilesInternalsMessageHandler::~NTPTilesInternalsMessageHandler() = default;
@@ -73,7 +95,7 @@ void NTPTilesInternalsMessageHandler::HandleRegisterForEvents(
disabled.SetBoolean("whitelist", false);
client_->CallJavascriptFunction(
"chrome.ntp_tiles_internals.receiveSourceInfo", disabled);
- SendTiles(NTPTilesVector());
+ SendTiles(NTPTilesVector(), FaviconResultMap());
return;
}
DCHECK(args->empty());
@@ -216,7 +238,9 @@ void NTPTilesInternalsMessageHandler::SendSourceInfo() {
"chrome.ntp_tiles_internals.receiveSourceInfo", value);
}
-void NTPTilesInternalsMessageHandler::SendTiles(const NTPTilesVector& tiles) {
+void NTPTilesInternalsMessageHandler::SendTiles(
+ const NTPTilesVector& tiles,
+ const FaviconResultMap& result_map) {
auto sites_list = base::MakeUnique<base::ListValue>();
for (const NTPTile& tile : tiles) {
auto entry = base::MakeUnique<base::DictionaryValue>();
@@ -225,6 +249,21 @@ void NTPTilesInternalsMessageHandler::SendTiles(const NTPTilesVector& tiles) {
entry->SetInteger("source", static_cast<int>(tile.source));
entry->SetString("whitelistIconPath",
tile.whitelist_icon_path.LossyDisplayName());
+
+ auto icon_list = base::MakeUnique<base::ListValue>();
+ for (const auto& entry : kIconTypesAndNames) {
+ FaviconResultMap::const_iterator it = result_map.find(
+ FaviconResultMap::key_type(tile.url, entry.type_enum));
+
+ if (it != result_map.end()) {
+ auto icon = base::MakeUnique<base::DictionaryValue>();
+ icon->SetString("url", it->second.icon_url.spec());
+ icon->SetString("type", entry.type_name);
+ icon_list->Append(std::move(icon));
+ }
+ }
+ entry->Set("icons", std::move(icon_list));
+
sites_list->Append(std::move(entry));
}
@@ -236,10 +275,47 @@ void NTPTilesInternalsMessageHandler::SendTiles(const NTPTilesVector& tiles) {
void NTPTilesInternalsMessageHandler::OnMostVisitedURLsAvailable(
const NTPTilesVector& tiles) {
- SendTiles(tiles);
+ cancelable_task_tracker_.TryCancelAll();
+
+ if (tiles.empty()) {
+ SendTiles(tiles, FaviconResultMap());
+ return;
+ }
+
+ auto on_lookup_done = base::BindRepeating(
+ &NTPTilesInternalsMessageHandler::OnFaviconLookupDone,
+ // Unretained(this) is safe because of |cancelable_task_tracker_|.
+ base::Unretained(this), tiles, base::Owned(new FaviconResultMap()),
+ base::Owned(new size_t(tiles.size() * kIconTypesAndNames.size())));
+
+ for (const NTPTile& tile : tiles) {
+ for (const auto& entry : kIconTypesAndNames) {
+ favicon_service_->GetLargestRawFaviconForPageURL(
+ tile.url, std::vector<int>(1U, entry.type_enum),
+ /*minimum_size_in_pixels=*/0, base::Bind(on_lookup_done, tile.url),
+ &cancelable_task_tracker_);
+ }
+ }
}
void NTPTilesInternalsMessageHandler::OnIconMadeAvailable(
const GURL& site_url) {}
+void NTPTilesInternalsMessageHandler::OnFaviconLookupDone(
+ const NTPTilesVector& tiles,
+ FaviconResultMap* result_map,
+ size_t* num_pending_lookups,
+ const GURL& page_url,
+ const favicon_base::FaviconRawBitmapResult& result) {
+ DCHECK_NE(0u, *num_pending_lookups);
+
+ result_map->emplace(
+ std::pair<GURL, favicon_base::IconType>(page_url, result.icon_type),
+ result);
+
+ --*num_pending_lookups;
+ if (*num_pending_lookups == 0)
+ SendTiles(tiles, *result_map);
+}
+
} // namespace ntp_tiles

Powered by Google App Engine
This is Rietveld 408576698