diff --git a/browser/ui/BUILD.gn b/browser/ui/BUILD.gn index a97f2542633..cbcf37d08e7 100644 --- a/browser/ui/BUILD.gn +++ b/browser/ui/BUILD.gn @@ -149,7 +149,10 @@ source_set("ui") { } if (enable_brave_rewards) { - deps += [ "//brave/browser/brave_rewards" ] + deps += [ + "//brave/browser/brave_rewards", + "//chrome/browser:flags", + ] sources += [ "webui/brave_rewards/rewards_page_data_source.cc", diff --git a/browser/ui/webui/brave_rewards_internals_ui.cc b/browser/ui/webui/brave_rewards_internals_ui.cc index 3a66d55472e..361034edfae 100644 --- a/browser/ui/webui/brave_rewards_internals_ui.cc +++ b/browser/ui/webui/brave_rewards_internals_ui.cc @@ -13,6 +13,7 @@ #include "base/check.h" #include "base/dcheck_is_on.h" +#include "base/feature_list.h" #include "base/json/json_reader.h" #include "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" @@ -21,13 +22,19 @@ #include "brave/components/brave_ads/buildflags/buildflags.h" #include "brave/components/brave_ads/core/browser/service/ads_service.h" #include "brave/components/brave_rewards/content/rewards_service.h" +#include "brave/components/brave_rewards/core/features.h" #include "brave/components/brave_rewards/core/mojom/rewards.mojom.h" #include "brave/components/brave_rewards/core/pref_names.h" #include "brave/components/brave_rewards/resources/grit/brave_rewards_resources.h" #include "brave/components/brave_rewards/resources/grit/rewards_internals_generated_map.h" +#include "chrome/browser/about_flags.h" +#include "chrome/browser/browser_process.h" +#include "chrome/browser/lifetime/application_lifetime.h" #include "chrome/browser/profiles/profile.h" #include "components/prefs/pref_service.h" +#include "components/webui/flags/pref_service_flags_storage.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 BUILDFLAG(ENABLE_BRAVE_ADS) @@ -77,6 +84,7 @@ class RewardsInternalsDOMHandler : public content::WebUIMessageHandler { void GetAdDiagnostics(const base::ListValue& args); void OnGetAdDiagnostics(std::optional diagnostics); void SetAdDiagnosticId(const base::ListValue& args); + void ToggleVerboseLoggingAndRestart(const base::ListValue& args); void GetEnvironment(const base::ListValue& args); void OnGetEnvironment(brave_rewards::mojom::Environment environment); @@ -134,6 +142,11 @@ void RewardsInternalsDOMHandler::RegisterMessages() { "brave_rewards_internals.setAdDiagnosticId", base::BindRepeating(&RewardsInternalsDOMHandler::SetAdDiagnosticId, base::Unretained(this))); + web_ui()->RegisterMessageCallback( + "brave_rewards_internals.toggleVerboseLoggingAndRestart", + base::BindRepeating( + &RewardsInternalsDOMHandler::ToggleVerboseLoggingAndRestart, + base::Unretained(this))); web_ui()->RegisterMessageCallback( "brave_rewards_internals.getEnvironment", base::BindRepeating(&RewardsInternalsDOMHandler::GetEnvironment, @@ -455,6 +468,21 @@ void RewardsInternalsDOMHandler::SetAdDiagnosticId( #endif // BUILDFLAG(ENABLE_BRAVE_ADS) } +void RewardsInternalsDOMHandler::ToggleVerboseLoggingAndRestart( + const base::ListValue& args) { + std::string internal_name = "brave-rewards-verbose-logging"; + if (base::FeatureList::IsEnabled( + brave_rewards::features::kVerboseLoggingFeature)) { + internal_name += "@0"; // The "Default" (disabled) option. + } else { + internal_name += "@1"; // The "Enabled" option. + } + flags_ui::PrefServiceFlagsStorage flags_storage( + g_browser_process->local_state()); + about_flags::SetFeatureEntryEnabled(&flags_storage, internal_name, true); + chrome::AttemptRestart(); +} + void RewardsInternalsDOMHandler::GetEnvironment(const base::ListValue& args) { if (!rewards_service_) { return; @@ -482,8 +510,13 @@ void RewardsInternalsDOMHandler::OnGetEnvironment( BraveRewardsInternalsUI::BraveRewardsInternalsUI(content::WebUI* web_ui, std::string_view name) : WebUIController(web_ui) { - CreateAndAddWebUIDataSource(web_ui, name, kRewardsInternalsGenerated, - IDR_BRAVE_REWARDS_INTERNALS_HTML); + auto* source = + CreateAndAddWebUIDataSource(web_ui, name, kRewardsInternalsGenerated, + IDR_BRAVE_REWARDS_INTERNALS_HTML); + + source->AddBoolean("verboseLoggingEnabled", + base::FeatureList::IsEnabled( + brave_rewards::features::kVerboseLoggingFeature)); auto handler_owner = std::make_unique(); RewardsInternalsDOMHandler* handler = handler_owner.get(); diff --git a/components/brave_rewards/resources/rewards_internals/components/rewards_log.style.ts b/components/brave_rewards/resources/rewards_internals/components/rewards_log.style.ts index 714c1e47743..a7554410c0c 100644 --- a/components/brave_rewards/resources/rewards_internals/components/rewards_log.style.ts +++ b/components/brave_rewards/resources/rewards_internals/components/rewards_log.style.ts @@ -7,6 +7,10 @@ import { color, font } from '@brave/leo/tokens/css/variables' import { scoped } from '$web-common/scoped_css' export const style = scoped.css` + & { + --leo-dialog-padding: 32px; + } + h4 { display: flex; align-items: center; @@ -33,8 +37,22 @@ export const style = scoped.css` border: none; } - .auto-refresh { - padding: 0 16px; + leo-toggle { font: ${font.small.semibold}; + margin-inline-end: 4px; + } + + .verbose-logging-info { + --leo-icon-size: 48px; + --leo-icon-color: ${color.systemfeedback.warningIcon}; + + display: flex; + flex-direction: column; + gap: 16px; + background: ${color.systemfeedback.warningBackground}; + padding: 24px; + border-radius: 8px; + border: solid 1px ${color.systemfeedback.warningVibrant}; + color: ${color.systemfeedback.warningText}; } ` diff --git a/components/brave_rewards/resources/rewards_internals/components/rewards_log.tsx b/components/brave_rewards/resources/rewards_internals/components/rewards_log.tsx index aaf0bee0627..f80401f38f3 100644 --- a/components/brave_rewards/resources/rewards_internals/components/rewards_log.tsx +++ b/components/brave_rewards/resources/rewards_internals/components/rewards_log.tsx @@ -5,6 +5,8 @@ import * as React from 'react' import Button from '@brave/leo/react/button' +import Dialog from '@brave/leo/react/dialog' +import Icon from '@brave/leo/react/icon' import Toggle from '@brave/leo/react/toggle' import { useAppState, useAppActions } from '../lib/app_context' @@ -15,10 +17,14 @@ export function RewardsLog() { const actions = useAppActions() const { getString } = actions const log = useAppState((state) => state.rewardsLog) + const verboseLoggingEnabled = useAppState( + (state) => state.verboseLoggingEnabled, + ) const textAreaRef = React.useRef(null) const [logLoaded, setLogLoaded] = React.useState(log.length > 0) const [autoRefresh, setAutoRefresh] = React.useState(false) + const [showVerboseDialog, setShowVerboseDialog] = React.useState(false) React.useEffect(() => { actions.loadRewardsLog() @@ -77,15 +83,20 @@ export function RewardsLog() { >

Rewards Log - - setAutoRefresh(!autoRefresh)} - > - Auto-refresh - - + setAutoRefresh(!autoRefresh)} + > + Auto-refresh + + setShowVerboseDialog(true)} + > + Verbose mode + + + + ) } diff --git a/components/brave_rewards/resources/rewards_internals/lib/app_store.ts b/components/brave_rewards/resources/rewards_internals/lib/app_store.ts index 84a6f65733b..238d5e748e1 100644 --- a/components/brave_rewards/resources/rewards_internals/lib/app_store.ts +++ b/components/brave_rewards/resources/rewards_internals/lib/app_store.ts @@ -18,6 +18,7 @@ export interface AppState { creationEnvironment: Environment | null contributions: ContributionInfo[] rewardsLog: string + verboseLoggingEnabled: boolean externalWallet: ExternalWallet | null externalWalletId: string externalWalletAccountId: string @@ -30,6 +31,7 @@ export interface AppState { clearRewardsLog: () => void loadRewardsLog: () => void fetchFullRewardsLog: () => Promise + toggleVerboseLoggingAndRestart: () => void loadContributions: () => void loadRewardsEvents: () => void } @@ -88,6 +90,7 @@ export function defaultAppStore() { creationEnvironment: null, contributions: [], rewardsLog: '', + verboseLoggingEnabled: false, externalWallet: null, externalWalletId: '', externalWalletAccountId: '', @@ -104,6 +107,7 @@ export function defaultAppStore() { async fetchFullRewardsLog() { return '' }, + toggleVerboseLoggingAndRestart() {}, loadContributions() {}, loadRewardsEvents() {}, }, diff --git a/components/brave_rewards/resources/rewards_internals/lib/browser_app_store.ts b/components/brave_rewards/resources/rewards_internals/lib/browser_app_store.ts index cdac10c4c3d..365adb68bbe 100644 --- a/components/brave_rewards/resources/rewards_internals/lib/browser_app_store.ts +++ b/components/brave_rewards/resources/rewards_internals/lib/browser_app_store.ts @@ -192,6 +192,9 @@ export function createAppStore(): AppStore { }) function loadData() { + store.update({ + verboseLoggingEnabled: loadTimeData.getBoolean('verboseLoggingEnabled'), + }) chrome.send('brave_rewards_internals.getRewardsInternalsInfo') chrome.send('brave_rewards_internals.getBalance') chrome.send('brave_rewards_internals.getExternalWallet') @@ -228,6 +231,10 @@ export function createAppStore(): AppStore { }) }, + toggleVerboseLoggingAndRestart() { + chrome.send('brave_rewards_internals.toggleVerboseLoggingAndRestart') + }, + loadContributions() { chrome.send('brave_rewards_internals.getContributions') }, diff --git a/components/brave_rewards/resources/rewards_internals/lib/mock_app_store.ts b/components/brave_rewards/resources/rewards_internals/lib/mock_app_store.ts index 91839be01a9..80ab5eb81de 100644 --- a/components/brave_rewards/resources/rewards_internals/lib/mock_app_store.ts +++ b/components/brave_rewards/resources/rewards_internals/lib/mock_app_store.ts @@ -75,6 +75,12 @@ export function createAppStore(): AppStore { return 'full log' }, + toggleVerboseLoggingAndRestart() { + store.update((state) => ({ + verboseLoggingEnabled: !state.verboseLoggingEnabled, + })) + }, + loadContributions() { store.update({ contributions: [