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

Side by Side 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: 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 unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/ntp_tiles/webui/ntp_tiles_internals_message_handler.h" 5 #include "components/ntp_tiles/webui/ntp_tiles_internals_message_handler.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/callback.h" 8 #include "base/callback.h"
9 #include "base/files/file_util.h" 9 #include "base/files/file_util.h"
10 #include "base/json/json_reader.h" 10 #include "base/json/json_reader.h"
11 #include "base/json/json_writer.h" 11 #include "base/json/json_writer.h"
12 #include "base/logging.h" 12 #include "base/logging.h"
13 #include "base/memory/ptr_util.h" 13 #include "base/memory/ptr_util.h"
14 #include "base/task_runner_util.h" 14 #include "base/task_runner_util.h"
15 #include "base/values.h" 15 #include "base/values.h"
16 #include "components/favicon/core/favicon_service.h"
16 #include "components/ntp_tiles/most_visited_sites.h" 17 #include "components/ntp_tiles/most_visited_sites.h"
17 #include "components/ntp_tiles/pref_names.h" 18 #include "components/ntp_tiles/pref_names.h"
18 #include "components/ntp_tiles/webui/ntp_tiles_internals_message_handler_client. h" 19 #include "components/ntp_tiles/webui/ntp_tiles_internals_message_handler_client. h"
19 #include "components/prefs/pref_service.h" 20 #include "components/prefs/pref_service.h"
20 #include "components/url_formatter/url_fixer.h" 21 #include "components/url_formatter/url_fixer.h"
21 #include "url/gurl.h" 22 #include "url/gurl.h"
22 23
23 namespace ntp_tiles { 24 namespace ntp_tiles {
24 25
25 namespace { 26 namespace {
26 27
27 std::string FormatJson(const base::Value& value) { 28 std::string FormatJson(const base::Value& value) {
28 std::string pretty_printed; 29 std::string pretty_printed;
29 bool ok = base::JSONWriter::WriteWithOptions( 30 bool ok = base::JSONWriter::WriteWithOptions(
30 value, base::JSONWriter::OPTIONS_PRETTY_PRINT, &pretty_printed); 31 value, base::JSONWriter::OPTIONS_PRETTY_PRINT, &pretty_printed);
31 DCHECK(ok); 32 DCHECK(ok);
32 return pretty_printed; 33 return pretty_printed;
33 } 34 }
34 35
35 } // namespace 36 } // namespace
36 37
37 NTPTilesInternalsMessageHandler::NTPTilesInternalsMessageHandler() 38 NTPTilesInternalsMessageHandler::NTPTilesInternalsMessageHandler(
38 : client_(nullptr), site_count_(8), weak_ptr_factory_(this) {} 39 favicon::FaviconService* favicon_service)
40 : favicon_service_(favicon_service),
41 icon_types_and_names_{
sfiera 2017/06/13 08:56:01 This looks like it could be a constexpr std::array
mastiz 2017/06/13 11:19:39 Done.
42 {favicon_base::FAVICON, "FAVICON"},
43 {favicon_base::TOUCH_ICON, "TOUCH_ICON"},
44 {favicon_base::TOUCH_PRECOMPOSED_ICON, "TOUCH_PRECOMPOSED_ICON"},
45 {favicon_base::WEB_MANIFEST_ICON, "WEB_MANIFEST_ICON"},
46 },
47 client_(nullptr),
48 site_count_(8),
49 weak_ptr_factory_(this) {}
39 50
40 NTPTilesInternalsMessageHandler::~NTPTilesInternalsMessageHandler() = default; 51 NTPTilesInternalsMessageHandler::~NTPTilesInternalsMessageHandler() = default;
41 52
42 void NTPTilesInternalsMessageHandler::RegisterMessages( 53 void NTPTilesInternalsMessageHandler::RegisterMessages(
43 NTPTilesInternalsMessageHandlerClient* client) { 54 NTPTilesInternalsMessageHandlerClient* client) {
44 client_ = client; 55 client_ = client;
45 56
46 client_->RegisterMessageCallback( 57 client_->RegisterMessageCallback(
47 "registerForEvents", 58 "registerForEvents",
48 base::Bind(&NTPTilesInternalsMessageHandler::HandleRegisterForEvents, 59 base::Bind(&NTPTilesInternalsMessageHandler::HandleRegisterForEvents,
(...skipping 17 matching lines...) Expand all
66 void NTPTilesInternalsMessageHandler::HandleRegisterForEvents( 77 void NTPTilesInternalsMessageHandler::HandleRegisterForEvents(
67 const base::ListValue* args) { 78 const base::ListValue* args) {
68 if (!client_->SupportsNTPTiles()) { 79 if (!client_->SupportsNTPTiles()) {
69 base::DictionaryValue disabled; 80 base::DictionaryValue disabled;
70 disabled.SetBoolean("topSites", false); 81 disabled.SetBoolean("topSites", false);
71 disabled.SetBoolean("suggestionsService", false); 82 disabled.SetBoolean("suggestionsService", false);
72 disabled.SetBoolean("popular", false); 83 disabled.SetBoolean("popular", false);
73 disabled.SetBoolean("whitelist", false); 84 disabled.SetBoolean("whitelist", false);
74 client_->CallJavascriptFunction( 85 client_->CallJavascriptFunction(
75 "chrome.ntp_tiles_internals.receiveSourceInfo", disabled); 86 "chrome.ntp_tiles_internals.receiveSourceInfo", disabled);
76 SendTiles(NTPTilesVector()); 87 SendTiles(NTPTilesVector(), FaviconResultMap());
77 return; 88 return;
78 } 89 }
79 DCHECK(args->empty()); 90 DCHECK(args->empty());
80 91
81 suggestions_status_.clear(); 92 suggestions_status_.clear();
82 popular_sites_json_.clear(); 93 popular_sites_json_.clear();
83 most_visited_sites_ = client_->MakeMostVisitedSites(); 94 most_visited_sites_ = client_->MakeMostVisitedSites();
84 most_visited_sites_->SetMostVisitedURLsObserver(this, site_count_); 95 most_visited_sites_->SetMostVisitedURLsObserver(this, site_count_);
85 SendSourceInfo(); 96 SendSourceInfo();
86 } 97 }
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
209 220
210 value.SetString("popular.json", popular_sites_json_); 221 value.SetString("popular.json", popular_sites_json_);
211 } else { 222 } else {
212 value.SetBoolean("popular", false); 223 value.SetBoolean("popular", false);
213 } 224 }
214 225
215 client_->CallJavascriptFunction( 226 client_->CallJavascriptFunction(
216 "chrome.ntp_tiles_internals.receiveSourceInfo", value); 227 "chrome.ntp_tiles_internals.receiveSourceInfo", value);
217 } 228 }
218 229
219 void NTPTilesInternalsMessageHandler::SendTiles(const NTPTilesVector& tiles) { 230 void NTPTilesInternalsMessageHandler::SendTiles(
231 const NTPTilesVector& tiles,
232 const FaviconResultMap& result_map) {
220 auto sites_list = base::MakeUnique<base::ListValue>(); 233 auto sites_list = base::MakeUnique<base::ListValue>();
221 for (const NTPTile& tile : tiles) { 234 for (const NTPTile& tile : tiles) {
222 auto entry = base::MakeUnique<base::DictionaryValue>(); 235 auto entry = base::MakeUnique<base::DictionaryValue>();
223 entry->SetString("title", tile.title); 236 entry->SetString("title", tile.title);
224 entry->SetString("url", tile.url.spec()); 237 entry->SetString("url", tile.url.spec());
225 entry->SetInteger("source", static_cast<int>(tile.source)); 238 entry->SetInteger("source", static_cast<int>(tile.source));
226 entry->SetString("whitelistIconPath", 239 entry->SetString("whitelistIconPath",
227 tile.whitelist_icon_path.LossyDisplayName()); 240 tile.whitelist_icon_path.LossyDisplayName());
241
242 auto icon_list = base::MakeUnique<base::ListValue>();
243 for (const auto& icon_type : icon_types_and_names_) {
244 FaviconResultMap::const_iterator it = result_map.find(
245 FaviconResultMap::key_type(tile.url, icon_type.first));
246
247 if (it != result_map.end()) {
248 auto icon = base::MakeUnique<base::DictionaryValue>();
249 icon->SetString("url", it->second.icon_url.spec());
250 icon->SetString("type", icon_type.second);
251 icon_list->Append(std::move(icon));
252 }
253 }
254 entry->Set("icons", std::move(icon_list));
255
228 sites_list->Append(std::move(entry)); 256 sites_list->Append(std::move(entry));
229 } 257 }
230 258
231 base::DictionaryValue result; 259 base::DictionaryValue result;
232 result.Set("sites", std::move(sites_list)); 260 result.Set("sites", std::move(sites_list));
233 client_->CallJavascriptFunction("chrome.ntp_tiles_internals.receiveSites", 261 client_->CallJavascriptFunction("chrome.ntp_tiles_internals.receiveSites",
234 result); 262 result);
235 } 263 }
236 264
237 void NTPTilesInternalsMessageHandler::OnMostVisitedURLsAvailable( 265 void NTPTilesInternalsMessageHandler::OnMostVisitedURLsAvailable(
238 const NTPTilesVector& tiles) { 266 const NTPTilesVector& tiles) {
sfiera 2017/06/13 08:56:01 First, cancelable_task_tracker_.CancelAll() in cas
mastiz 2017/06/13 11:19:39 Done.
239 SendTiles(tiles); 267 if (tiles.empty())
sfiera 2017/06/13 08:56:00 Nit: braces And early return?
mastiz 2017/06/13 11:19:39 Done.
268 SendTiles(tiles, FaviconResultMap());
269
270 auto on_lookup_done = base::Bind(
sfiera 2017/06/13 08:56:01 BindRepeating() to make the usage clear?
mastiz 2017/06/13 11:19:39 Done.
271 &NTPTilesInternalsMessageHandler::OnFaviconLookupDone,
272 base::Unretained(this), tiles, base::Owned(new FaviconResultMap()),
sfiera 2017/06/13 08:56:01 Can you add a comment about Unretained? It's safe
mastiz 2017/06/13 11:19:39 Done. However, I fail to see why this is different
sfiera 2017/06/13 11:34:13 Whenever I see Unretained(), I wonder what mechani
273 base::Owned(new size_t(tiles.size() * icon_types_and_names_.size())));
274
275 for (const NTPTile& tile : tiles) {
276 for (const auto& icon_type : icon_types_and_names_) {
277 favicon_service_->GetLargestRawFaviconForPageURL(
278 tile.url, std::vector<int>(1U, icon_type.first),
279 /*minimum_size_in_pixels=*/0, base::Bind(on_lookup_done, tile.url),
280 &cancelable_task_tracker_);
281 }
282 }
240 } 283 }
241 284
242 void NTPTilesInternalsMessageHandler::OnIconMadeAvailable( 285 void NTPTilesInternalsMessageHandler::OnIconMadeAvailable(
243 const GURL& site_url) {} 286 const GURL& site_url) {}
244 287
288 void NTPTilesInternalsMessageHandler::OnFaviconLookupDone(
289 const NTPTilesVector& tiles,
290 FaviconResultMap* result_map,
291 size_t* num_pending_lookups,
292 const GURL& page_url,
293 const favicon_base::FaviconRawBitmapResult& result) {
294 DCHECK_NE(0, *num_pending_lookups);
295
296 result_map->emplace(
297 std::pair<GURL, favicon_base::IconType>(page_url, result.icon_type),
298 result);
299
300 --*num_pending_lookups;
301 if (*num_pending_lookups == 0)
302 SendTiles(tiles, *result_map);
303 }
304
245 } // namespace ntp_tiles 305 } // namespace ntp_tiles
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698