diff --git a/browser/ui/BUILD.gn b/browser/ui/BUILD.gn index a95601a1d79b..321a04833b5e 100644 --- a/browser/ui/BUILD.gn +++ b/browser/ui/BUILD.gn @@ -9,6 +9,8 @@ source_set("ui") { "webui/basic_ui.h", "webui/brave_adblock_ui.cc", "webui/brave_adblock_ui.h", + "webui/brave_new_tab_message_handler.cc", + "webui/brave_new_tab_message_handler.h", "webui/brave_new_tab_ui.cc", "webui/brave_new_tab_ui.h", "webui/brave_web_ui_controller_factory.cc", diff --git a/browser/ui/webui/brave_new_tab_message_handler.cc b/browser/ui/webui/brave_new_tab_message_handler.cc new file mode 100644 index 000000000000..f87cd5318294 --- /dev/null +++ b/browser/ui/webui/brave_new_tab_message_handler.cc @@ -0,0 +1,79 @@ +// Copyright (c) 2019 The Brave Authors. All rights reserved. +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// you can obtain one at http://mozilla.org/MPL/2.0/. + +#include "brave/browser/ui/webui/brave_new_tab_message_handler.h" + +#include "base/bind.h" +#include "base/values.h" +#include "brave/browser/ui/webui/brave_new_tab_ui.h" +#include "brave/browser/search_engines/search_engine_provider_util.h" +#include "brave/common/pref_names.h" +#include "chrome/browser/profiles/profile.h" +#include "components/prefs/pref_service.h" + +BraveNewTabMessageHandler::BraveNewTabMessageHandler(BraveNewTabUI* web_ui) + : new_tab_web_ui_(web_ui) { +} + +BraveNewTabMessageHandler::~BraveNewTabMessageHandler() {} + +void BraveNewTabMessageHandler::OnJavascriptAllowed() { + // Observe relevant preferences + PrefService* prefs = Profile::FromWebUI(web_ui())->GetPrefs(); + pref_change_registrar_.Init(prefs); + // Stats + pref_change_registrar_.Add(kAdsBlocked, + base::Bind(&BraveNewTabMessageHandler::OnStatsChanged, + base::Unretained(this))); + pref_change_registrar_.Add(kTrackersBlocked, + base::Bind(&BraveNewTabMessageHandler::OnStatsChanged, + base::Unretained(this))); + pref_change_registrar_.Add(kHttpsUpgrades, + base::Bind(&BraveNewTabMessageHandler::OnStatsChanged, + base::Unretained(this))); + // Private New Tab Page preferences + pref_change_registrar_.Add(kUseAlternativeSearchEngineProvider, + base::Bind(&BraveNewTabMessageHandler::OnPrivatePropertiesChanged, + base::Unretained(this))); + pref_change_registrar_.Add(kAlternativeSearchEngineProviderInTor, + base::Bind(&BraveNewTabMessageHandler::OnPrivatePropertiesChanged, + base::Unretained(this))); +} + +void BraveNewTabMessageHandler::OnJavascriptDisallowed() { + pref_change_registrar_.RemoveAll(); +} + +void BraveNewTabMessageHandler::RegisterMessages() { + web_ui()->RegisterMessageCallback( + "newTabPageInitialized", + base::BindRepeating( + &BraveNewTabMessageHandler::HandleInitialized, + base::Unretained(this))); + web_ui()->RegisterMessageCallback( + "toggleAlternativePrivateSearchEngine", + base::BindRepeating( + &BraveNewTabMessageHandler::HandleToggleAlternativeSearchEngineProvider, + base::Unretained(this))); +} + +void BraveNewTabMessageHandler::HandleInitialized(const base::ListValue* args) { + AllowJavascript(); +} + +void BraveNewTabMessageHandler::HandleToggleAlternativeSearchEngineProvider( + const base::ListValue* args) { + brave::ToggleUseAlternativeSearchEngineProvider( + Profile::FromWebUI(web_ui())); +} + +void BraveNewTabMessageHandler::OnPrivatePropertiesChanged() { + new_tab_web_ui_->OnPrivatePropertiesChanged(); +} + +void BraveNewTabMessageHandler::OnStatsChanged() { + new_tab_web_ui_->OnStatsChanged(); + FireWebUIListener("stats-updated"); +} diff --git a/browser/ui/webui/brave_new_tab_message_handler.h b/browser/ui/webui/brave_new_tab_message_handler.h new file mode 100644 index 000000000000..97ba9b63326f --- /dev/null +++ b/browser/ui/webui/brave_new_tab_message_handler.h @@ -0,0 +1,39 @@ +// Copyright (c) 2019 The Brave Authors. All rights reserved. +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// you can obtain one at http://mozilla.org/MPL/2.0/. + +#ifndef BRAVE_BROWSER_UI_WEBUI_BRAVE_NEW_TAB_MESSAGE_HANDLER_H_ +#define BRAVE_BROWSER_UI_WEBUI_BRAVE_NEW_TAB_MESSAGE_HANDLER_H_ + +#include "components/prefs/pref_change_registrar.h" +#include "content/public/browser/web_ui_message_handler.h" + +class Profile; +class BraveNewTabUI; + +// Handles messages to and from the New Tab Page javascript +class BraveNewTabMessageHandler : public content::WebUIMessageHandler { + public: + explicit BraveNewTabMessageHandler(BraveNewTabUI* web_ui); + ~BraveNewTabMessageHandler() override; + void OnStatsChanged(); + void OnPrivatePropertiesChanged(); + + private: + // WebUIMessageHandler implementation. + void RegisterMessages() override; + void OnJavascriptAllowed() override; + void OnJavascriptDisallowed() override; + + void HandleInitialized(const base::ListValue* args); + void HandleToggleAlternativeSearchEngineProvider( + const base::ListValue* args); + + PrefChangeRegistrar pref_change_registrar_; + BraveNewTabUI* new_tab_web_ui_; + + DISALLOW_COPY_AND_ASSIGN(BraveNewTabMessageHandler); +}; + +#endif // BRAVE_BROWSER_UI_WEBUI_BRAVE_NEW_TAB_MESSAGE_HANDLER_H_ diff --git a/browser/ui/webui/brave_new_tab_ui.cc b/browser/ui/webui/brave_new_tab_ui.cc index 85420f165261..304016d4de94 100644 --- a/browser/ui/webui/brave_new_tab_ui.cc +++ b/browser/ui/webui/brave_new_tab_ui.cc @@ -1,10 +1,14 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this file, - * You can obtain one at http://mozilla.org/MPL/2.0/. */ +// Copyright (c) 2019 The Brave Authors. All rights reserved. +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// you can obtain one at http://mozilla.org/MPL/2.0/. #include "brave/browser/ui/webui/brave_new_tab_ui.h" +#include + #include "brave/browser/search_engines/search_engine_provider_util.h" +#include "brave/browser/ui/webui/brave_new_tab_message_handler.h" #include "brave/common/pref_names.h" #include "brave/common/webui_url_constants.h" #include "brave/components/brave_new_tab/resources/grit/brave_new_tab_generated_map.h" @@ -15,60 +19,26 @@ #include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_view_host.h" #include "content/public/browser/web_ui_data_source.h" -#include "content/public/browser/web_ui_message_handler.h" - -namespace { -class NewTabDOMHandler : public content::WebUIMessageHandler { - public: - NewTabDOMHandler() = default; - ~NewTabDOMHandler() override = default; - - private: - // WebUIMessageHandler implementation. - void RegisterMessages() override { - web_ui()->RegisterMessageCallback( - "toggleAlternativePrivateSearchEngine", - base::BindRepeating( - &NewTabDOMHandler::HandleToggleAlternativeSearchEngineProvider, - base::Unretained(this))); - } - - void HandleToggleAlternativeSearchEngineProvider( - const base::ListValue* args) { - brave::ToggleUseAlternativeSearchEngineProvider( - Profile::FromWebUI(web_ui())); - } - - DISALLOW_COPY_AND_ASSIGN(NewTabDOMHandler); -}; - -} // namespace BraveNewTabUI::BraveNewTabUI(content::WebUI* web_ui, const std::string& name) : BasicUI(web_ui, name, kBraveNewTabGenerated, kBraveNewTabGeneratedSize, IDR_BRAVE_NEW_TAB_HTML) { - Profile* profile = Profile::FromWebUI(web_ui); - PrefService* prefs = profile->GetPrefs(); - pref_change_registrar_ = std::make_unique(); - pref_change_registrar_->Init(prefs); - pref_change_registrar_->Add(kAdsBlocked, - base::Bind(&BraveNewTabUI::OnPreferenceChanged, base::Unretained(this))); - pref_change_registrar_->Add(kTrackersBlocked, - base::Bind(&BraveNewTabUI::OnPreferenceChanged, base::Unretained(this))); - pref_change_registrar_->Add(kHttpsUpgrades, - base::Bind(&BraveNewTabUI::OnPreferenceChanged, base::Unretained(this))); - pref_change_registrar_->Add(kUseAlternativeSearchEngineProvider, - base::Bind(&BraveNewTabUI::OnPreferenceChanged, base::Unretained(this))); - pref_change_registrar_->Add(kAlternativeSearchEngineProviderInTor, - base::Bind(&BraveNewTabUI::OnPreferenceChanged, base::Unretained(this))); - - web_ui->AddMessageHandler(std::make_unique()); + web_ui->AddMessageHandler(std::make_unique(this)); } BraveNewTabUI::~BraveNewTabUI() { } -void BraveNewTabUI::CustomizeNewTabWebUIProperties(content::RenderViewHost* render_view_host) { +void BraveNewTabUI::UpdateWebUIProperties() { + // TODO(petemill): move all this data to set on loadTimeData + // on the DataSource via the MessageHandler + auto* render_view_host = GetRenderViewHost(); + SetStatsWebUIProperties(render_view_host); + SetPrivateWebUIProperties(render_view_host); +} + +void BraveNewTabUI::SetStatsWebUIProperties( + content::RenderViewHost* render_view_host) { DCHECK(IsSafeToSetWebUIProperties()); Profile* profile = Profile::FromWebUI(web_ui()); PrefService* prefs = profile->GetPrefs(); @@ -99,13 +69,31 @@ void BraveNewTabUI::CustomizeNewTabWebUIProperties(content::RenderViewHost* rend } } -void BraveNewTabUI::UpdateWebUIProperties() { +void BraveNewTabUI::SetPrivateWebUIProperties( + content::RenderViewHost* render_view_host) { + DCHECK(IsSafeToSetWebUIProperties()); + Profile* profile = Profile::FromWebUI(web_ui()); + PrefService* prefs = profile->GetPrefs(); + if (render_view_host) { + render_view_host->SetWebUIProperty( + "useAlternativePrivateSearchEngine", + prefs->GetBoolean(kUseAlternativeSearchEngineProvider) ? "true" + : "false"); + render_view_host->SetWebUIProperty( + "isTor", profile->IsTorProfile() ? "true" : "false"); + render_view_host->SetWebUIProperty( + "isQwant", brave::IsRegionForQwant(profile) ? "true" : "false"); + } +} + +void BraveNewTabUI::OnPrivatePropertiesChanged() { if (IsSafeToSetWebUIProperties()) { - CustomizeNewTabWebUIProperties(GetRenderViewHost()); - web_ui()->CallJavascriptFunctionUnsafe("brave_new_tab.statsUpdated"); + SetPrivateWebUIProperties(GetRenderViewHost()); } } -void BraveNewTabUI::OnPreferenceChanged() { - UpdateWebUIProperties(); +void BraveNewTabUI::OnStatsChanged() { + if (IsSafeToSetWebUIProperties()) { + SetStatsWebUIProperties(GetRenderViewHost()); + } } diff --git a/browser/ui/webui/brave_new_tab_ui.h b/browser/ui/webui/brave_new_tab_ui.h index 14778a722880..d537430a9652 100644 --- a/browser/ui/webui/brave_new_tab_ui.h +++ b/browser/ui/webui/brave_new_tab_ui.h @@ -1,29 +1,36 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this file, - * You can obtain one at http://mozilla.org/MPL/2.0/. */ +// Copyright (c) 2019 The Brave Authors. All rights reserved. +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// you can obtain one at http://mozilla.org/MPL/2.0/. #ifndef BRAVE_BROWSER_UI_WEBUI_BRAVE_NEW_TAB_UI_H_ #define BRAVE_BROWSER_UI_WEBUI_BRAVE_NEW_TAB_UI_H_ #include +#include #include "brave/browser/ui/webui/basic_ui.h" class PrefChangeRegistrar; +class BraveNewTabMessageHandler; + +namespace content { +class RenderViewHost; +} class BraveNewTabUI : public BasicUI { public: BraveNewTabUI(content::WebUI* web_ui, const std::string& host); ~BraveNewTabUI() override; + void OnPreferencesChanged(); + void OnPrivatePropertiesChanged(); + void OnStatsChanged(); private: // BasicUI overrides void UpdateWebUIProperties() override; - - void CustomizeNewTabWebUIProperties(content::RenderViewHost* render_view_host); - void OnPreferenceChanged(); - - std::unique_ptr pref_change_registrar_; + void SetStatsWebUIProperties(content::RenderViewHost* render_view_host); + void SetPrivateWebUIProperties(content::RenderViewHost* render_view_host); DISALLOW_COPY_AND_ASSIGN(BraveNewTabUI); }; diff --git a/components/brave_new_tab_ui/brave_new_tab.tsx b/components/brave_new_tab_ui/brave_new_tab.tsx index c24439a5d376..f774f039711c 100644 --- a/components/brave_new_tab_ui/brave_new_tab.tsx +++ b/components/brave_new_tab_ui/brave_new_tab.tsx @@ -1,14 +1,14 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this file, - * You can obtain one at http://mozilla.org/MPL/2.0/. */ +// Copyright (c) 2019 The Brave Authors. All rights reserved. +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// you can obtain one at http://mozilla.org/MPL/2.0/. import * as React from 'react' import { render } from 'react-dom' import { Provider } from 'react-redux' -import * as dataFetchAPI from './api/dataFetch' - import Theme from 'brave-ui/theme/brave-default' import { ThemeProvider } from 'brave-ui/theme' +import * as dataFetchAPI from './api/dataFetch' // Components import App from './components/app' @@ -21,29 +21,27 @@ import 'emptykit.css' import '../fonts/poppins.css' import '../fonts/muli.css' -window.cr.define('brave_new_tab', function () { - 'use strict' - - function initialize () { - render( - - - - - , - document.getElementById('root')) - window.i18nTemplate.process(window.document, window.loadTimeData) - } - - function statsUpdated () { - const actions = dataFetchAPI.getActions() - actions.statsUpdated() - } - - return { - initialize, - statsUpdated - } -}) - -document.addEventListener('DOMContentLoaded', window.brave_new_tab.initialize) +function initialize () { + render( + + + + + , + document.getElementById('root') + ) + window.i18nTemplate.process(window.document, window.loadTimeData) + handleAPIEvents() +} + +function updateStats() { + const actions = dataFetchAPI.getActions() + actions.statsUpdated() +} + +function handleAPIEvents () { + chrome.send('newTabPageInitialized', []) + window.cr.addWebUIListener('stats-updated', updateStats) +} + +document.addEventListener('DOMContentLoaded', initialize) diff --git a/components/definitions/global.d.ts b/components/definitions/global.d.ts index 273946ec8db3..6fefe4cd578f 100644 --- a/components/definitions/global.d.ts +++ b/components/definitions/global.d.ts @@ -1,6 +1,8 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this file, - * You can obtain one at http://mozilla.org/MPL/2.0/. */ +// Copyright (c) 2019 The Brave Authors. All rights reserved. +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// you can obtain one at http://mozilla.org/MPL/2.0/. + export {} type loadTimeData = { @@ -14,6 +16,7 @@ declare global { cr: { define: (name: string, init: () => void) => void sendWithPromise: (method: string, ...args: any[]) => any + addWebUIListener: (eventName: string, callback: (...args: any[]) => void) => void } i18nTemplate: { process: (document: Document, translations: loadTimeData) => void