[Rewards] Add a toggle on the internals page to enable verbose mode (#34860)

This commit is contained in:
Kevin Smith
2026-03-26 14:03:06 -04:00
committed by GitHub
parent 4a1adbaa46
commit 78a11e9d93
7 changed files with 132 additions and 14 deletions
+4 -1
View File
@@ -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",
+35 -2
View File
@@ -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<base::ListValue> 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>();
RewardsInternalsDOMHandler* handler = handler_owner.get();
@@ -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};
}
`
@@ -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<HTMLTextAreaElement>(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() {
>
<h4>
<span className='title'>Rewards Log</span>
<span className='auto-refresh'>
<Toggle
size='small'
checked={autoRefresh}
onChange={() => setAutoRefresh(!autoRefresh)}
>
Auto-refresh
</Toggle>
</span>
<Toggle
size='small'
checked={autoRefresh}
onChange={() => setAutoRefresh(!autoRefresh)}
>
Auto-refresh
</Toggle>
<Toggle
size='small'
checked={verboseLoggingEnabled}
onChange={() => setShowVerboseDialog(true)}
>
Verbose mode
</Toggle>
<Button
size='small'
onClick={download}
@@ -105,6 +116,42 @@ export function RewardsLog() {
value={log}
readOnly
/>
<Dialog
isOpen={showVerboseDialog}
onClose={() => setShowVerboseDialog(false)}
backdropClickCloses={false}
>
<div slot='title'>Brave Rewards Verbose Logging</div>
<div className='verbose-logging-info'>
<Icon name='warning-triangle-filled' />
<div>
Enables detailed logging of Brave Rewards system events to a log
file stored on your device. Please note that this log file could
include information such as browsing history and credentials such as
passwords and access tokens depending on your activity. Please do
not share it unless asked to by Brave staff.
</div>
</div>
<div slot='actions'>
<Button
kind='plain-faint'
onClick={() => setShowVerboseDialog(false)}
>
Cancel
</Button>
<Button
onClick={() => {
setShowVerboseDialog(false)
actions.toggleVerboseLoggingAndRestart()
}}
>
{verboseLoggingEnabled
? 'Disable and Restart'
: 'Enable and Restart'}
</Button>
</div>
</Dialog>
</div>
)
}
@@ -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<string>
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() {},
},
@@ -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')
},
@@ -75,6 +75,12 @@ export function createAppStore(): AppStore {
return 'full log'
},
toggleVerboseLoggingAndRestart() {
store.update((state) => ({
verboseLoggingEnabled: !state.verboseLoggingEnabled,
}))
},
loadContributions() {
store.update({
contributions: [