Commit 876fe79c authored by sfiera's avatar sfiera Committed by Commit bot

Add chrome://ntp-tiles-internals/

Implement it for Android, Desktop, and iOS.

This largely supersedes chrome://popular-sites-internals/. Relative to
that, it lacks a way to see the cached JSON and the status of a manual
fetch.

BUG=655622

Review-Url: https://codereview.chromium.org/2557103004
Cr-Commit-Position: refs/heads/master@{#438205}
parent 5a513840
...@@ -376,6 +376,8 @@ split_static_library("ui") { ...@@ -376,6 +376,8 @@ split_static_library("ui") {
"webui/net_internals/net_internals_ui.h", "webui/net_internals/net_internals_ui.h",
"webui/ntp/ntp_user_data_logger.cc", "webui/ntp/ntp_user_data_logger.cc",
"webui/ntp/ntp_user_data_logger.h", "webui/ntp/ntp_user_data_logger.h",
"webui/ntp_tiles_internals_ui.cc",
"webui/ntp_tiles_internals_ui.h",
"webui/omnibox/omnibox_page_handler.cc", "webui/omnibox/omnibox_page_handler.cc",
"webui/omnibox/omnibox_page_handler.h", "webui/omnibox/omnibox_page_handler.h",
"webui/omnibox/omnibox_ui.cc", "webui/omnibox/omnibox_ui.cc",
...@@ -502,6 +504,7 @@ split_static_library("ui") { ...@@ -502,6 +504,7 @@ split_static_library("ui") {
"//components/google/core/browser", "//components/google/core/browser",
"//components/guest_view/browser", "//components/guest_view/browser",
"//components/history/content/browser", "//components/history/content/browser",
"//components/image_fetcher",
"//components/infobars/core", "//components/infobars/core",
"//components/invalidation/impl", "//components/invalidation/impl",
"//components/keyed_service/content", "//components/keyed_service/content",
......
...@@ -40,6 +40,7 @@ ...@@ -40,6 +40,7 @@
#include "chrome/browser/ui/webui/log_web_ui_url.h" #include "chrome/browser/ui/webui/log_web_ui_url.h"
#include "chrome/browser/ui/webui/net_export_ui.h" #include "chrome/browser/ui/webui/net_export_ui.h"
#include "chrome/browser/ui/webui/net_internals/net_internals_ui.h" #include "chrome/browser/ui/webui/net_internals/net_internals_ui.h"
#include "chrome/browser/ui/webui/ntp_tiles_internals_ui.h"
#include "chrome/browser/ui/webui/omnibox/omnibox_ui.h" #include "chrome/browser/ui/webui/omnibox/omnibox_ui.h"
#include "chrome/browser/ui/webui/options/options_ui.h" #include "chrome/browser/ui/webui/options/options_ui.h"
#include "chrome/browser/ui/webui/password_manager_internals/password_manager_internals_ui.h" #include "chrome/browser/ui/webui/password_manager_internals/password_manager_internals_ui.h"
...@@ -352,6 +353,8 @@ WebUIFactoryFunction GetWebUIFactoryFunction(WebUI* web_ui, ...@@ -352,6 +353,8 @@ WebUIFactoryFunction GetWebUIFactoryFunction(WebUI* web_ui,
return &NewWebUI<NetExportUI>; return &NewWebUI<NetExportUI>;
if (url.host_piece() == chrome::kChromeUINetInternalsHost) if (url.host_piece() == chrome::kChromeUINetInternalsHost)
return &NewWebUI<NetInternalsUI>; return &NewWebUI<NetInternalsUI>;
if (url.host_piece() == chrome::kChromeUINTPTilesInternalsHost)
return &NewWebUI<NTPTilesInternalsUI>;
if (url.host_piece() == chrome::kChromeUIOmniboxHost) if (url.host_piece() == chrome::kChromeUIOmniboxHost)
return &NewWebUI<OmniboxUI>; return &NewWebUI<OmniboxUI>;
if (url.host_piece() == chrome::kChromeUIPasswordManagerInternalsHost) if (url.host_piece() == chrome::kChromeUIPasswordManagerInternalsHost)
......
// 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 "chrome/browser/ui/webui/ntp_tiles_internals_ui.h"
#include "base/bind.h"
#include "base/memory/ptr_util.h"
#include "chrome/browser/favicon/favicon_service_factory.h"
#include "chrome/browser/history/top_sites_factory.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/search/suggestions/image_decoder_impl.h"
#include "chrome/browser/search/suggestions/suggestions_service_factory.h"
#include "chrome/browser/search_engines/template_url_service_factory.h"
#include "chrome/common/url_constants.h"
#include "components/grit/components_resources.h"
#include "components/history/core/browser/top_sites.h"
#include "components/image_fetcher/image_fetcher_impl.h"
#include "components/ntp_tiles/field_trial.h"
#include "components/ntp_tiles/icon_cacher.h"
#include "components/ntp_tiles/most_visited_sites.h"
#include "components/ntp_tiles/webui/ntp_tiles_internals_message_handler.h"
#include "components/ntp_tiles/webui/ntp_tiles_internals_message_handler_client.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/web_ui.h"
#include "content/public/browser/web_ui_data_source.h"
#include "content/public/browser/web_ui_message_handler.h"
#if defined(OS_ANDROID)
#include "chrome/browser/android/ntp/popular_sites.h"
#endif
namespace {
// The implementation for the chrome://ntp-tiles-internals page.
class ChromeNTPTilesInternalsMessageHandlerClient
: public content::WebUIMessageHandler,
public ntp_tiles::NTPTilesInternalsMessageHandlerClient {
public:
ChromeNTPTilesInternalsMessageHandlerClient() {}
private:
// content::WebUIMessageHandler:
void RegisterMessages() override;
// ntp_tiles::NTPTilesInternalsMessageHandlerClient
bool DoesSourceExist(ntp_tiles::NTPTileSource source) override;
std::unique_ptr<ntp_tiles::MostVisitedSites> MakeMostVisitedSites() override;
std::unique_ptr<ntp_tiles::PopularSites> MakePopularSites() override;
PrefService* GetPrefs() override;
void RegisterMessageCallback(
const std::string& message,
const base::Callback<void(const base::ListValue*)>& callback) override;
void CallJavascriptFunctionVector(
const std::string& name,
const std::vector<const base::Value*>& values) override;
ntp_tiles::NTPTilesInternalsMessageHandler handler_;
DISALLOW_COPY_AND_ASSIGN(ChromeNTPTilesInternalsMessageHandlerClient);
};
void ChromeNTPTilesInternalsMessageHandlerClient::RegisterMessages() {
handler_.RegisterMessages(this);
}
bool ChromeNTPTilesInternalsMessageHandlerClient::DoesSourceExist(
ntp_tiles::NTPTileSource source) {
switch (source) {
case ntp_tiles::NTPTileSource::TOP_SITES:
case ntp_tiles::NTPTileSource::SUGGESTIONS_SERVICE:
return true;
#if defined(OS_ANDROID)
case ntp_tiles::NTPTileSource::POPULAR:
case ntp_tiles::NTPTileSource::WHITELIST:
return true;
#else
case ntp_tiles::NTPTileSource::POPULAR:
return false;
case ntp_tiles::NTPTileSource::WHITELIST:
// TODO(sfiera): support WHITELIST.
return false;
#endif
}
NOTREACHED();
return false;
}
std::unique_ptr<ntp_tiles::MostVisitedSites>
ChromeNTPTilesInternalsMessageHandlerClient::MakeMostVisitedSites() {
// TODO(sfiera): share with Android and Instant in a factory.
auto* profile = Profile::FromWebUI(web_ui());
return base::MakeUnique<ntp_tiles::MostVisitedSites>(
GetPrefs(), TopSitesFactory::GetForProfile(profile),
suggestions::SuggestionsServiceFactory::GetForProfile(profile),
MakePopularSites(),
base::MakeUnique<ntp_tiles::IconCacher>(
FaviconServiceFactory::GetForProfile(
profile, ServiceAccessType::IMPLICIT_ACCESS),
base::MakeUnique<image_fetcher::ImageFetcherImpl>(
base::MakeUnique<suggestions::ImageDecoderImpl>(),
profile->GetRequestContext())),
/*supervisor=*/nullptr);
}
std::unique_ptr<ntp_tiles::PopularSites>
ChromeNTPTilesInternalsMessageHandlerClient::MakePopularSites() {
#if defined(OS_ANDROID)
return ChromePopularSites::NewForProfile(Profile::FromWebUI(web_ui()));
#else
return nullptr;
#endif
}
PrefService* ChromeNTPTilesInternalsMessageHandlerClient::GetPrefs() {
return Profile::FromWebUI(web_ui())->GetPrefs();
}
void ChromeNTPTilesInternalsMessageHandlerClient::RegisterMessageCallback(
const std::string& message,
const base::Callback<void(const base::ListValue*)>& callback) {
web_ui()->RegisterMessageCallback(message, callback);
}
void ChromeNTPTilesInternalsMessageHandlerClient::CallJavascriptFunctionVector(
const std::string& name,
const std::vector<const base::Value*>& values) {
web_ui()->CallJavascriptFunctionUnsafe(name, values);
}
content::WebUIDataSource* CreateNTPTilesInternalsHTMLSource() {
content::WebUIDataSource* source =
content::WebUIDataSource::Create(chrome::kChromeUINTPTilesInternalsHost);
source->AddResourcePath("ntp_tiles_internals.js", IDR_NTP_TILES_INTERNALS_JS);
source->AddResourcePath("ntp_tiles_internals.css",
IDR_NTP_TILES_INTERNALS_CSS);
source->SetDefaultResource(IDR_NTP_TILES_INTERNALS_HTML);
return source;
}
} // namespace
NTPTilesInternalsUI::NTPTilesInternalsUI(content::WebUI* web_ui)
: WebUIController(web_ui) {
content::WebUIDataSource::Add(Profile::FromWebUI(web_ui),
CreateNTPTilesInternalsHTMLSource());
web_ui->AddMessageHandler(new ChromeNTPTilesInternalsMessageHandlerClient);
}
NTPTilesInternalsUI::~NTPTilesInternalsUI() {}
// 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.
#ifndef CHROME_BROWSER_UI_WEBUI_NTP_TILES_INTERNALS_UI_H_
#define CHROME_BROWSER_UI_WEBUI_NTP_TILES_INTERNALS_UI_H_
#include "base/macros.h"
#include "content/public/browser/web_ui_controller.h"
// The implementation for the chrome://ntp-tiles-internals page.
class NTPTilesInternalsUI : public content::WebUIController {
public:
explicit NTPTilesInternalsUI(content::WebUI* web_ui);
~NTPTilesInternalsUI() override;
private:
DISALLOW_COPY_AND_ASSIGN(NTPTilesInternalsUI);
};
#endif // CHROME_BROWSER_UI_WEBUI_NTP_TILES_INTERNALS_UI_H_
...@@ -74,6 +74,7 @@ const char kChromeUINaClURL[] = "chrome://nacl/"; ...@@ -74,6 +74,7 @@ const char kChromeUINaClURL[] = "chrome://nacl/";
const char kChromeUINetInternalsURL[] = "chrome://net-internals/"; const char kChromeUINetInternalsURL[] = "chrome://net-internals/";
const char kChromeUINewProfileURL[] = "chrome://newprofile/"; const char kChromeUINewProfileURL[] = "chrome://newprofile/";
const char kChromeUINewTabURL[] = "chrome://newtab/"; const char kChromeUINewTabURL[] = "chrome://newtab/";
const char kChromeUINTPTilesInternalsURL[] = "chrome://ntp-tiles-internals/";
const char kChromeUIOmniboxURL[] = "chrome://omnibox/"; const char kChromeUIOmniboxURL[] = "chrome://omnibox/";
const char kChromeUIPluginsURL[] = "chrome://plugins/"; const char kChromeUIPluginsURL[] = "chrome://plugins/";
const char kChromeUIPolicyURL[] = "chrome://policy/"; const char kChromeUIPolicyURL[] = "chrome://policy/";
...@@ -224,6 +225,7 @@ const char kChromeUINaClHost[] = "nacl"; ...@@ -224,6 +225,7 @@ const char kChromeUINaClHost[] = "nacl";
const char kChromeUINetExportHost[] = "net-export"; const char kChromeUINetExportHost[] = "net-export";
const char kChromeUINetInternalsHost[] = "net-internals"; const char kChromeUINetInternalsHost[] = "net-internals";
const char kChromeUINewTabHost[] = "newtab"; const char kChromeUINewTabHost[] = "newtab";
const char kChromeUINTPTilesInternalsHost[] = "ntp-tiles-internals";
const char kChromeUIOmniboxHost[] = "omnibox"; const char kChromeUIOmniboxHost[] = "omnibox";
const char kChromeUIPasswordManagerInternalsHost[] = const char kChromeUIPasswordManagerInternalsHost[] =
"password-manager-internals"; "password-manager-internals";
...@@ -646,6 +648,7 @@ const char* const kChromeHostURLs[] = { ...@@ -646,6 +648,7 @@ const char* const kChromeHostURLs[] = {
kChromeUIProfilerHost, kChromeUIProfilerHost,
kChromeUISignInInternalsHost, kChromeUISignInInternalsHost,
kChromeUISiteEngagementHost, kChromeUISiteEngagementHost,
kChromeUINTPTilesInternalsHost,
kChromeUISuggestionsHost, kChromeUISuggestionsHost,
kChromeUISupervisedUserInternalsHost, kChromeUISupervisedUserInternalsHost,
kChromeUISyncInternalsHost, kChromeUISyncInternalsHost,
......
...@@ -64,6 +64,7 @@ extern const char kChromeUINaClURL[]; ...@@ -64,6 +64,7 @@ extern const char kChromeUINaClURL[];
extern const char kChromeUINetInternalsURL[]; extern const char kChromeUINetInternalsURL[];
extern const char kChromeUINewProfileURL[]; extern const char kChromeUINewProfileURL[];
extern const char kChromeUINewTabURL[]; extern const char kChromeUINewTabURL[];
extern const char kChromeUINTPTilesInternalsURL[];
extern const char kChromeUIOmniboxURL[]; extern const char kChromeUIOmniboxURL[];
extern const char kChromeUIPasswordManagerInternalsHost[]; extern const char kChromeUIPasswordManagerInternalsHost[];
extern const char kChromeUIPluginsURL[]; extern const char kChromeUIPluginsURL[];
...@@ -206,6 +207,7 @@ extern const char kChromeUINaClHost[]; ...@@ -206,6 +207,7 @@ extern const char kChromeUINaClHost[];
extern const char kChromeUINetExportHost[]; extern const char kChromeUINetExportHost[];
extern const char kChromeUINetInternalsHost[]; extern const char kChromeUINetInternalsHost[];
extern const char kChromeUINewTabHost[]; extern const char kChromeUINewTabHost[];
extern const char kChromeUINTPTilesInternalsHost[];
extern const char kChromeUIOfflineInternalsHost[]; extern const char kChromeUIOfflineInternalsHost[];
extern const char kChromeUIOmniboxHost[]; extern const char kChromeUIOmniboxHost[];
extern const char kChromeUIPluginsHost[]; extern const char kChromeUIPluginsHost[];
......
...@@ -29,8 +29,12 @@ static_library("ntp_tiles") { ...@@ -29,8 +29,12 @@ static_library("ntp_tiles") {
"pref_names.h", "pref_names.h",
"switches.cc", "switches.cc",
"switches.h", "switches.h",
"webui/ntp_tiles_internals_message_handler.cc",
"webui/ntp_tiles_internals_message_handler.h",
"webui/ntp_tiles_internals_message_handler_client.h",
"webui/popular_sites_internals_message_handler.cc", "webui/popular_sites_internals_message_handler.cc",
"webui/popular_sites_internals_message_handler.h", "webui/popular_sites_internals_message_handler.h",
"webui/popular_sites_internals_message_handler_client.h",
] ]
public_deps = [ public_deps = [
......
...@@ -101,56 +101,6 @@ std::string GetVariationVersion() { ...@@ -101,56 +101,6 @@ std::string GetVariationVersion() {
"version"); "version");
} }
// Determine the country code to use. In order of precedence:
// - The explicit "override country" pref set by the user.
// - The country code from the field trial config (variation parameter).
// - The Google country code if Google is the default search engine (and the
// "--enable-ntp-search-engine-country-detection" switch is present).
// - The country provided by the VariationsService.
// - A default fallback.
std::string GetCountryToUse(const PrefService* prefs,
const TemplateURLService* template_url_service,
VariationsService* variations_service) {
std::string country_code =
prefs->GetString(ntp_tiles::prefs::kPopularSitesOverrideCountry);
if (country_code.empty())
country_code = GetVariationCountry();
if (country_code.empty())
country_code = GetDefaultSearchEngineCountryCode(template_url_service);
if (country_code.empty() && variations_service)
country_code = variations_service->GetStoredPermanentCountry();
#if defined(OS_IOS)
if (country_code.empty())
country_code = GetDeviceCountryCode();
#endif
if (country_code.empty())
country_code = kPopularSitesDefaultCountryCode;
return base::ToUpperASCII(country_code);
}
// Determine the version to use. In order of precedence:
// - The explicit "override version" pref set by the user.
// - The version from the field trial config (variation parameter).
// - A default fallback.
std::string GetVersionToUse(const PrefService* prefs) {
std::string version =
prefs->GetString(ntp_tiles::prefs::kPopularSitesOverrideVersion);
if (version.empty())
version = GetVariationVersion();
if (version.empty())
version = kPopularSitesDefaultVersion;
return version;
}
// Must run on the blocking thread pool. // Must run on the blocking thread pool.
bool WriteJsonToFile(const base::FilePath& local_path, bool WriteJsonToFile(const base::FilePath& local_path,
const base::Value* json) { const base::Value* json) {
...@@ -213,14 +163,7 @@ void PopularSites::StartFetch(bool force_download, ...@@ -213,14 +163,7 @@ void PopularSites::StartFetch(bool force_download,
base::TimeDelta::FromHours(kPopularSitesRedownloadIntervalHours); base::TimeDelta::FromHours(kPopularSitesRedownloadIntervalHours);
const bool download_time_is_future = base::Time::Now() < last_download_time; const bool download_time_is_future = base::Time::Now() < last_download_time;
const std::string country = pending_url_ = GetURLToUse();
GetCountryToUse(prefs_, template_url_service_, variations_);
const std::string version = GetVersionToUse(prefs_);
const GURL override_url =
GURL(prefs_->GetString(ntp_tiles::prefs::kPopularSitesOverrideURL));
pending_url_ = override_url.is_valid() ? override_url
: GetPopularSitesURL(country, version);
const bool url_changed = const bool url_changed =
pending_url_.spec() != prefs_->GetString(kPopularSitesURLPref); pending_url_.spec() != prefs_->GetString(kPopularSitesURLPref);
...@@ -251,6 +194,64 @@ GURL PopularSites::LastURL() const { ...@@ -251,6 +194,64 @@ GURL PopularSites::LastURL() const {
return GURL(prefs_->GetString(kPopularSitesURLPref)); return GURL(prefs_->GetString(kPopularSitesURLPref));
} }
GURL PopularSites::GetURLToUse() {
const std::string country = GetCountryToUse();
const std::string version = GetVersionToUse();
const GURL override_url =
GURL(prefs_->GetString(ntp_tiles::prefs::kPopularSitesOverrideURL));
return override_url.is_valid() ? override_url
: GetPopularSitesURL(country, version);
}
// Determine the country code to use. In order of precedence:
// - The explicit "override country" pref set by the user.
// - The country code from the field trial config (variation parameter).
// - The Google country code if Google is the default search engine (and the
// "--enable-ntp-search-engine-country-detection" switch is present).
// - The country provided by the VariationsService.
// - A default fallback.
std::string PopularSites::GetCountryToUse() {
std::string country_code =
prefs_->GetString(ntp_tiles::prefs::kPopularSitesOverrideCountry);
if (country_code.empty())
country_code = GetVariationCountry();
if (country_code.empty())
country_code = GetDefaultSearchEngineCountryCode(template_url_service_);
if (country_code.empty() && variations_)
country_code = variations_->GetStoredPermanentCountry();
#if defined(OS_IOS)
if (country_code.empty())
country_code = GetDeviceCountryCode();
#endif
if (country_code.empty())
country_code = kPopularSitesDefaultCountryCode;
return base::ToUpperASCII(country_code);
}
// Determine the version to use. In order of precedence:
// - The explicit "override version" pref set by the user.
// - The version from the field trial config (variation parameter).
// - A default fallback.
std::string PopularSites::GetVersionToUse() {
std::string version =
prefs_->GetString(ntp_tiles::prefs::kPopularSitesOverrideVersion);
if (version.empty())
version = GetVariationVersion();
if (version.empty())
version = kPopularSitesDefaultVersion;
return version;
}
// static // static
void PopularSites::RegisterProfilePrefs( void PopularSites::RegisterProfilePrefs(
user_prefs::PrefRegistrySyncable* user_prefs) { user_prefs::PrefRegistrySyncable* user_prefs) {
......
...@@ -94,6 +94,11 @@ class PopularSites : public net::URLFetcherDelegate { ...@@ -94,6 +94,11 @@ class PopularSites : public net::URLFetcherDelegate {
const base::FilePath& local_path() const { return local_path_; } const base::FilePath& local_path() const { return local_path_; }
// Public for diagnostic pages only.
GURL GetURLToUse();
std::string GetCountryToUse();
std::string GetVersionToUse();
// Register preferences used by this class. // Register preferences used by this class.
static void RegisterProfilePrefs( static void RegisterProfilePrefs(
user_prefs::PrefRegistrySyncable* user_prefs); user_prefs::PrefRegistrySyncable* user_prefs);
......
// 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
// 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.
#ifndef COMPONENTS_NTP_TILES_WEBUI_NTP_TILES_INTERNALS_MESSAGE_HANDLER_H_
#define COMPONENTS_NTP_TILES_WEBUI_NTP_TILES_INTERNALS_MESSAGE_HANDLER_H_
#include <memory>
#include <string>
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "components/ntp_tiles/most_visited_sites.h"
namespace base {
class ListValue;
} // namespace base
namespace ntp_tiles {
class MostVisitedSites;
class NTPTilesInternalsMessageHandlerClient;
// Implements the WebUI message handler for chrome://ntp-tiles-internals/
//
// Because content and iOS use different implementations of WebUI, this class
// implements the generic portion and depends on the embedder to inject a bridge
// to the embedder's API. It cannot itself implement either API directly.
class NTPTilesInternalsMessageHandler : public MostVisitedSites::Observer {
public:
NTPTilesInternalsMessageHandler();
~NTPTilesInternalsMessageHandler() override;
// Called when the WebUI page's JavaScript has loaded and it is ready to
// receive RegisterMessageCallback() calls. |client| must outlive this object.
void RegisterMessages(NTPTilesInternalsMessageHandlerClient* client);
private:
// Callbacks registered in RegisterMessages().
void HandleRegisterForEvents(const base::ListValue* args);
void HandleUpdate(const base::ListValue* args);
void SendSourceInfo();
void SendTiles(const NTPTilesVector& tiles);
// MostVisitedSites::Observer.
void OnMostVisitedURLsAvailable(const NTPTilesVector& tiles) override;
void OnIconMadeAvailable(const GURL& site_url) override;
// Bridge to embedder's API.
NTPTilesInternalsMessageHandlerClient* client_;
int site_count_;
std::unique_ptr<MostVisitedSites> most_visited_sites_;
DISALLOW_COPY_AND_ASSIGN(NTPTilesInternalsMessageHandler);
};
} // namespace ntp_tiles
#endif // COMPONENTS_NTP_TILES_WEBUI_NTP_TILES_INTERNALS_MESSAGE_HANDLER_H_
// 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_client.h"
namespace ntp_tiles {
NTPTilesInternalsMessageHandlerClient::NTPTilesInternalsMessageHandlerClient() =
default;
NTPTilesInternalsMessageHandlerClient::
~NTPTilesInternalsMessageHandlerClient() = default;
} // namespace ntp_tiles
// 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.
#ifndef COMPONENTS_NTP_TILES_WEBUI_NTP_TILES_INTERNALS_MESSAGE_HANDLER_CLIENT_H_
#define COMPONENTS_NTP_TILES_WEBUI_NTP_TILES_INTERNALS_MESSAGE_HANDLER_CLIENT_H_
#include <memory>
#include <string>
#include <vector>
#include "base/callback_forward.h"
#include "base/macros.h"
#include "components/ntp_tiles/ntp_tile_source.h"
class PrefService;
namespace base {
class Value;
class ListValue;
} // namespace base
namespace ntp_tiles {
class MostVisitedSites;
class PopularSites;
// Implemented by embedders to hook up NTPTilesInternalsMessageHandler.
class NTPTilesInternalsMessageHandlerClient {
public:
// Returns the PrefService for the embedder and containing WebUI page.
virtual PrefService* GetPrefs() = 0;
// Returns true if the given source is enabled (even if, in practice, none of
// the tiles would come from it).
virtual bool DoesSourceExist(NTPTileSource source) = 0;
// Creates a new MostVisitedSites based on the context pf the WebUI page.
virtual std::unique_ptr<ntp_tiles::MostVisitedSites>
MakeMostVisitedSites() = 0;
// Creates a new PopularSites based on the context pf the WebUI page.
virtual std::unique_ptr<ntp_tiles::PopularSites> MakePopularSites() = 0;
// Registers a callback in Javascript. See content::WebUI and web::WebUIIOS.
virtual void RegisterMessageCallback(
const std::string& message,
const base::Callback<void(const base::ListValue*)>& callback) = 0;
// Invokes a function in Javascript. See content::WebUI and web::WebUIIOS.
virtual void CallJavascriptFunctionVector(
const std::string& name,
const std::vector<const base::Value*>& values) = 0;
// Convenience function for CallJavascriptFunctionVector().
template <typename... Arg>
void CallJavascriptFunction(const std::string& name, const Arg&... arg) {
CallJavascriptFunctionVector(name, {&arg...});
}
protected:
NTPTilesInternalsMessageHandlerClient();
virtual ~NTPTilesInternalsMessageHandlerClient();
private:
DISALLOW_COPY_AND_ASSIGN(NTPTilesInternalsMessageHandlerClient);
};
} // namespace ntp_tiles
#endif // COMPONENTS_NTP_TILES_WEBUI_NTP_TILES_INTERNALS_MESSAGE_HANDLER_CLIENT_H_
/* 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. */
html {
font-size: 20px;
}
div.section {
width: 100%;
display: inline-block;
margin-left: auto;
margin-right: auto;
}
div.section.hidden {
display: none;
}
h2 {
color: rgb(74, 142, 230);
font-size: 100%;
margin-bottom: 0;
}
.err {
color: red;
}
.section-details {
width: 100%;
}
.section-details th {
background: rgb(239, 243, 255);
}
.section-details td {
vertical-align: top;
}
.section-details td.detail {
text-align: right;
width: 1px;
white-space: nowrap;
}
.section-details td.value input {
width: 100%;
}
#json-value {
font-size: 75%;
}
<!--
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.
-->
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<if expr="is_android or is_ios">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</if>
<title>NTP Tiles Internals</title>
<link rel="stylesheet" href="chrome://resources/css/text_defaults.css">
<link rel="stylesheet" href="chrome://resources/css/list.css">
<link rel="stylesheet" href="ntp_tiles_internals.css">
<script src="chrome://resources/js/cr.js"></script>
<script src="chrome://resources/js/jstemplate_compiled.js"></script>
<script src="chrome://resources/js/load_time_data.js"></script>
<script src="chrome://resources/js/util.js"></script>
<if expr="is_ios">
<!-- TODO(crbug.com/487000): Remove this once injected by web. -->
<script src="chrome://resources/js/ios/web_ui.js"></script>
</if>
<script src="ntp_tiles_internals.js"></script>
</head>
<body>
<div>
<div id="sources" class="section">
<h2>Sources</h2>
<table class="section-details">
<tbody jsselect="topSites">
<tr>
<th colspan="2">TOP_SITES</th>
</tr>
<tr>
<td class="detail">enabled</td>
<td class="value" jsdisplay="$this">yes</td>
<td class="value" jsdisplay="!$this">no</td>
</tr>
<tr>
<th colspan="2">SUGGESTIONS_SERVICE</th>
</tr>
</tbody>
<tbody jsselect="suggestionsService">
<tr>
<td class="detail">enabled</td>
<td class="value" jsdisplay="$this">yes</td>
<td class="value" jsdisplay="!$this">no</td>
</tr>
</tbody>
<tbody jsselect="popular">
<tr>
<th colspan="2">POPULAR</th>
</tr>
<tr jsdisplay="$this">
<td class="detail">URL</td>
<td class="value"><input id="override-url" type="text" jsvalues="value:overrideURL;placeholder:url"></td>
</tr>
<tr jsdisplay="$this">
<td class="detail">Country</td>
<td class="value"><input id="override-country" type="text" jsvalues="value:overrideCountry;placeholder:country"></td>
</tr>
<tr jsdisplay="$this">
<td class="detail">Version</td>
<td class="value"><input id="override-version" type="text" jsvalues="values:overrideVersion;placeholder:version"></td>
</tr>
<tr jsdisplay="!$this">
<td class="detail">enabled</td>
<td class="value">no</td>
</tr>
</tbody>
<tbody jsselect="whitelist">
<tr>
<th colspan="2">WHITELIST</th>
</tr>
<tr>
<td class="detail">enabled</td>
<td class="value" jsdisplay="$this">yes</td>
<td class="value" jsdisplay="!$this">no</td>
</tr>
<tr jsskip="true">
<th colspan="2"><input id="submit-update" type="submit" value="Update"></input></th>
</tr>
</tbody>
</table>
</div>
<div id="sites" class="section">
<h2>Sites</h2>
<table class="section-details">
<tbody jsselect="sites">
<tr>
<th colspan="2" jscontent="title"></th>
</tr>
<tr>
<td class="detail">Source</td>
<td class="value" jsdisplay="source &lt; 0">???</td>
<td class="value" jsdisplay="source == 0">TOP_SITES</td>
<td class="value" jsdisplay="source == 1">SUGGESTIONS_SERVICE</td>
<td class="value" jsdisplay="source == 2">POPULAR</td>
<td class="value" jsdisplay="source == 3">WHITELIST</td>
<td class="value" jsdisplay="source &gt; 3">???</td>
</tr>
<tr>
<td class="detail">URL</td>
<td class="value"><a jsvalues="href:url" jscontent="url"></a></td>
</tr>
</tbody>
</table>
</div>
</div>
</body>
</html>
// 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.
cr.define('chrome.ntp_tiles_internals', function() {
'use strict';
var initialize = function() {
receiveSites({});
$('submit-update').addEventListener('click', function(event) {
event.preventDefault();
chrome.send('update', [{
"popular": {
"overrideURL": $('override-url').value,
"overrideCountry": $('override-country').value,
"overrideVersion": $('override-version').value,
},
}])
});
chrome.send('registerForEvents');
}
var receiveSourceInfo = function(state) {
jstProcess(new JsEvalContext(state), $('sources'));
}
var receiveSites = function(sites) {
jstProcess(new JsEvalContext(sites), $('sites'));
}
// Return an object with all of the exports.
return {
initialize: initialize,
receiveSourceInfo: receiveSourceInfo,
receiveSites: receiveSites,
};
});
document.addEventListener('DOMContentLoaded',
chrome.ntp_tiles_internals.initialize);
...@@ -21,7 +21,7 @@ per-file gcm_driver_resources.grdp=peter@chromium.org ...@@ -21,7 +21,7 @@ per-file gcm_driver_resources.grdp=peter@chromium.org
per-file gcm_driver_resources.grdp=zea@chromium.org per-file gcm_driver_resources.grdp=zea@chromium.org
per-file neterror*=mmenke@chromium.org per-file neterror*=mmenke@chromium.org
per-file neterror*=juliatuttle@chromium.org per-file neterror*=juliatuttle@chromium.org
per-file ntp_tiles.grdp=file://components/ntp_tiles/OWNERS per-file ntp_tiles_resources.grdp=file://components/ntp_tiles/OWNERS
per-file proximity_auth*=tengs@chromium.org per-file proximity_auth*=tengs@chromium.org
per-file supervised_user_error_page.grpd=aberent@chromium.org per-file supervised_user_error_page.grpd=aberent@chromium.org
per-file supervised_user_error_page.grpd=bauerb@chromium.org per-file supervised_user_error_page.grpd=bauerb@chromium.org
......
...@@ -5,4 +5,7 @@ ...@@ -5,4 +5,7 @@
<include name="IDR_POPULAR_SITES_INTERNALS_JS" file="../ntp_tiles/webui/resources/popular_sites_internals.js" type="BINDATA" /> <include name="IDR_POPULAR_SITES_INTERNALS_JS" file="../ntp_tiles/webui/resources/popular_sites_internals.js" type="BINDATA" />
<include name="IDR_POPULAR_SITES_INTERNALS_CSS" file="../ntp_tiles/webui/resources/popular_sites_internals.css" type="BINDATA" /> <include name="IDR_POPULAR_SITES_INTERNALS_CSS" file="../ntp_tiles/webui/resources/popular_sites_internals.css" type="BINDATA" />
</if> </if>
<include name="IDR_NTP_TILES_INTERNALS_HTML" file="../ntp_tiles/webui/resources/ntp_tiles_internals.html" flattenhtml="true" allowexternalscript="true" type="BINDATA" />
<include name="IDR_NTP_TILES_INTERNALS_JS" file="../ntp_tiles/webui/resources/ntp_tiles_internals.js" type="BINDATA" />
<include name="IDR_NTP_TILES_INTERNALS_CSS" file="../ntp_tiles/webui/resources/ntp_tiles_internals.css" type="BINDATA" />
</grit-part> </grit-part>
...@@ -17,6 +17,7 @@ const char kChromeUICreditsURL[] = "chrome://credits/"; ...@@ -17,6 +17,7 @@ const char kChromeUICreditsURL[] = "chrome://credits/";
const char kChromeUIFlagsURL[] = "chrome://flags/"; const char kChromeUIFlagsURL[] = "chrome://flags/";
const char kChromeUIHistoryURL[] = "chrome://history/"; const char kChromeUIHistoryURL[] = "chrome://history/";
const char kChromeUINewTabURL[] = "chrome://newtab/"; const char kChromeUINewTabURL[] = "chrome://newtab/";
const char kChromeUINTPTilesInternalsURL[] = "chrome://ntp-tiles-internals/";
const char kChromeUIOfflineURL[] = "chrome://offline/"; const char kChromeUIOfflineURL[] = "chrome://offline/";
const char kChromeUIPhysicalWebURL[] = "chrome://physical-web/"; const char kChromeUIPhysicalWebURL[] = "chrome://physical-web/";
const char kChromeUIPopularSitesInternalsURL[] = const char kChromeUIPopularSitesInternalsURL[] =
...@@ -39,6 +40,7 @@ const char kChromeUIHistoryFrameHost[] = "history-frame"; ...@@ -39,6 +40,7 @@ const char kChromeUIHistoryFrameHost[] = "history-frame";
const char kChromeUIHistoryHost[] = "history"; const char kChromeUIHistoryHost[] = "history";
const char kChromeUINetExportHost[] = "net-export"; const char kChromeUINetExportHost[] = "net-export";
const char kChromeUINewTabHost[] = "newtab"; const char kChromeUINewTabHost[] = "newtab";
const char kChromeUINTPTilesInternalsHost[] = "ntp-tiles-internals";
const char kChromeUIOfflineHost[] = "offline"; const char kChromeUIOfflineHost[] = "offline";
const char kChromeUIOmahaHost[] = "omaha"; const char kChromeUIOmahaHost[] = "omaha";
const char kChromeUIPhysicalWebHost[] = "physical-web"; const char kChromeUIPhysicalWebHost[] = "physical-web";
...@@ -53,13 +55,13 @@ const char kChromeUIVersionHost[] = "version"; ...@@ -53,13 +55,13 @@ const char kChromeUIVersionHost[] = "version";
// These hosts will also be suggested by BuiltinProvider. // These hosts will also be suggested by BuiltinProvider.
// 'histograms' is chrome WebUI on iOS, content WebUI on other platforms. // 'histograms' is chrome WebUI on iOS, content WebUI on other platforms.
const char* const kChromeHostURLs[] = { const char* const kChromeHostURLs[] = {
kChromeUIBookmarksHost, kChromeUIChromeURLsHost, kChromeUIBookmarksHost, kChromeUIChromeURLsHost,
kChromeUICreditsHost, kChromeUIFlagsHost, kChromeUICreditsHost, kChromeUIFlagsHost,
kChromeUIHistogramHost, kChromeUINetExportHost, kChromeUIHistogramHost, kChromeUINetExportHost,
kChromeUINewTabHost, kChromeUISignInInternalsHost, kChromeUINewTabHost, kChromeUINTPTilesInternalsHost,
kChromeUISyncInternalsHost, kChromeUIPhysicalWebHost, kChromeUISignInInternalsHost, kChromeUISyncInternalsHost,
kChromeUIPopularSitesInternalsHost, kChromeUITermsHost, kChromeUIPhysicalWebHost, kChromeUIPopularSitesInternalsHost,
kChromeUIVersionHost, kChromeUITermsHost, kChromeUIVersionHost,
}; };
const size_t kNumberOfChromeHostURLs = arraysize(kChromeHostURLs); const size_t kNumberOfChromeHostURLs = arraysize(kChromeHostURLs);
......
...@@ -27,6 +27,7 @@ extern const char kChromeUICreditsURL[]; ...@@ -27,6 +27,7 @@ extern const char kChromeUICreditsURL[];
extern const char kChromeUIFlagsURL[]; extern const char kChromeUIFlagsURL[];
extern const char kChromeUIHistoryURL[]; extern const char kChromeUIHistoryURL[];
extern const char kChromeUINewTabURL[]; extern const char kChromeUINewTabURL[];
extern const char kChromeUINTPTilesInternalsURL[];
extern const char kChromeUIOfflineURL[]; extern const char kChromeUIOfflineURL[];
extern const char kChromeUIPhysicalWebURL[]; extern const char kChromeUIPhysicalWebURL[];
extern const char kChromeUIPopularSitesInternalsURL[]; extern const char kChromeUIPopularSitesInternalsURL[];
...@@ -49,6 +50,7 @@ extern const char kChromeUIHistoryFrameHost[]; ...@@ -49,6 +50,7 @@ extern const char kChromeUIHistoryFrameHost[];
extern const char kChromeUIHistoryHost[]; extern const char kChromeUIHistoryHost[];
extern const char kChromeUINetExportHost[]; extern const char kChromeUINetExportHost[];
extern const char kChromeUINewTabHost[]; extern const char kChromeUINewTabHost[];
extern const char kChromeUINTPTilesInternalsHost[];
extern const char kChromeUIOfflineHost[]; extern const char kChromeUIOfflineHost[];
extern const char kChromeUIOmahaHost[]; extern const char kChromeUIOmahaHost[];
extern const char kChromeUIPhysicalWebHost[]; extern const char kChromeUIPhysicalWebHost[];
......
...@@ -12,6 +12,8 @@ source_set("webui") { ...@@ -12,6 +12,8 @@ source_set("webui") {
"flags_ui.cc", "flags_ui.cc",
"flags_ui.h", "flags_ui.h",
"mojo_web_ui_ios_controller.h", "mojo_web_ui_ios_controller.h",
"ntp_tiles_internals_ui.cc",
"ntp_tiles_internals_ui.h",
"physical_web_ui.cc", "physical_web_ui.cc",
"physical_web_ui.h", "physical_web_ui.h",
"popular_sites_internals_ui.cc", "popular_sites_internals_ui.cc",
......
// 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 "ios/chrome/browser/ui/webui/ntp_tiles_internals_ui.h"
#include "components/grit/components_resources.h"
#include "components/ntp_tiles/field_trial.h"
#include "components/ntp_tiles/most_visited_sites.h"
#include "components/ntp_tiles/popular_sites.h"
#include "components/ntp_tiles/webui/ntp_tiles_internals_message_handler.h"
#include "components/ntp_tiles/webui/ntp_tiles_internals_message_handler_client.h"
#include "ios/chrome/browser/browser_state/chrome_browser_state.h"
#include "ios/chrome/browser/chrome_url_constants.h"
#include "ios/chrome/browser/ntp_tiles/ios_most_visited_sites_factory.h"
#include "ios/chrome/browser/ntp_tiles/ios_popular_sites_factory.h"
#include "ios/web/public/web_thread.h"
#include "ios/web/public/web_ui_ios_data_source.h"
#include "ios/web/public/webui/web_ui_ios.h"
#include "ios/web/public/webui/web_ui_ios_message_handler.h"
namespace {
// The implementation for the chrome://ntp-tiles-internals page.
class IOSNTPTilesInternalsMessageHandlerBridge
: public web::WebUIIOSMessageHandler,
public ntp_tiles::NTPTilesInternalsMessageHandlerClient {
public:
IOSNTPTilesInternalsMessageHandlerBridge() {}
private:
// web::WebUIIOSMessageHandler:
void RegisterMessages() override;
// ntp_tiles::NTPTilesInternalsMessageHandlerClient
bool DoesSourceExist(ntp_tiles::NTPTileSource source) override;
std::unique_ptr<ntp_tiles::MostVisitedSites> MakeMostVisitedSites() override;
std::unique_ptr<ntp_tiles::PopularSites> MakePopularSites() override;
PrefService* GetPrefs() override;
void RegisterMessageCallback(
const std::string& message,
const base::Callback<void(const base::ListValue*)>& callback) override;
void CallJavascriptFunctionVector(
const std::string& name,
const std::vector<const base::Value*>& values) override;
ntp_tiles::NTPTilesInternalsMessageHandler handler_;
DISALLOW_COPY_AND_ASSIGN(IOSNTPTilesInternalsMessageHandlerBridge);
};
void IOSNTPTilesInternalsMessageHandlerBridge::RegisterMessages() {
handler_.RegisterMessages(this);
}
bool IOSNTPTilesInternalsMessageHandlerBridge::DoesSourceExist(
ntp_tiles::NTPTileSource source) {
switch (source) {
case ntp_tiles::NTPTileSource::TOP_SITES:
case ntp_tiles::NTPTileSource::SUGGESTIONS_SERVICE:
case ntp_tiles::NTPTileSource::POPULAR:
return true;
case ntp_tiles::NTPTileSource::WHITELIST:
return false;
}
NOTREACHED();
return false;
}
std::unique_ptr<ntp_tiles::MostVisitedSites>
IOSNTPTilesInternalsMessageHandlerBridge::MakeMostVisitedSites() {
return IOSMostVisitedSitesFactory::NewForBrowserState(
ios::ChromeBrowserState::FromWebUIIOS(web_ui()));
}
std::unique_ptr<ntp_tiles::PopularSites>
IOSNTPTilesInternalsMessageHandlerBridge::MakePopularSites() {
return IOSPopularSitesFactory::NewForBrowserState(
ios::ChromeBrowserState::FromWebUIIOS(web_ui()));
}
PrefService* IOSNTPTilesInternalsMessageHandlerBridge::GetPrefs() {
return ios::ChromeBrowserState::FromWebUIIOS(web_ui())->GetPrefs();
}
void IOSNTPTilesInternalsMessageHandlerBridge::RegisterMessageCallback(
const std::string& message,
const base::Callback<void(const base::ListValue*)>& callback) {
web_ui()->RegisterMessageCallback(message, callback);
}
void IOSNTPTilesInternalsMessageHandlerBridge::CallJavascriptFunctionVector(
const std::string& name,
const std::vector<const base::Value*>& values) {
web_ui()->CallJavascriptFunction(name, values);
}
} // namespace
web::WebUIIOSDataSource* CreateNTPTilesInternalsHTMLSource() {
web::WebUIIOSDataSource* source =
web::WebUIIOSDataSource::Create(kChromeUINTPTilesInternalsHost);
source->AddResourcePath("ntp_tiles_internals.js", IDR_NTP_TILES_INTERNALS_JS);
source->AddResourcePath("ntp_tiles_internals.css",
IDR_NTP_TILES_INTERNALS_CSS);
source->SetDefaultResource(IDR_NTP_TILES_INTERNALS_HTML);
return source;
}
NTPTilesInternalsUI::NTPTilesInternalsUI(web::WebUIIOS* web_ui)
: web::WebUIIOSController(web_ui) {
web::WebUIIOSDataSource::Add(ios::ChromeBrowserState::FromWebUIIOS(web_ui),
CreateNTPTilesInternalsHTMLSource());
web_ui->AddMessageHandler(new IOSNTPTilesInternalsMessageHandlerBridge);
}
NTPTilesInternalsUI::~NTPTilesInternalsUI() {}
// 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.
#ifndef IOS_CHROME_BROWSER_UI_WEBUI_NTP_TILES_INTERNALS_UI_H_
#define IOS_CHROME_BROWSER_UI_WEBUI_NTP_TILES_INTERNALS_UI_H_
#include <string>
#include "base/macros.h"
#include "ios/web/public/webui/web_ui_ios_controller.h"
// The WebUI handler for chrome://ntp-tiles-internals.
class NTPTilesInternalsUI : public web::WebUIIOSController {
public:
explicit NTPTilesInternalsUI(web::WebUIIOS* web_ui);
~NTPTilesInternalsUI() override;
private:
DISALLOW_COPY_AND_ASSIGN(NTPTilesInternalsUI);
};
#endif // IOS_CHROME_BROWSER_UI_WEBUI_NTP_TILES_INTERNALS_UI_H_
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment