[Shields UI] Add advanced view to new panel UI (#34192)

This commit is contained in:
Kevin Smith
2026-02-27 18:38:29 -05:00
committed by GitHub
parent fb05f5c7a7
commit 14332c8693
6 changed files with 549 additions and 22 deletions
@@ -0,0 +1,98 @@
/* Copyright (c) 2026 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 https://mozilla.org/MPL/2.0/. */
import { color, font } from '@brave/leo/tokens/css/variables'
import { scoped } from '$web-common/scoped_css'
export const style = scoped.css`
& {
--leo-icon-size: 20px;
padding: 8px;
display: flex;
flex-direction: column;
gap: 8px;
> * {
display: flex;
align-items: center;
gap: 8px;
padding: 0 4px 0 8px;
> :last-child {
padding: 4px;
min-width: 28px;
margin-inline-start: -4px;
}
> button {
border-radius: 8px;
}
> button:hover {
background: ${color.button.hover};
}
> button:disabled {
visibility: hidden;
}
}
}
.toggle {
flex: 1 1 auto;
display: flex;
align-items: center;
gap: 8px;
padding: 11px 8px;
& > *:last-child {
margin-inline-start: auto;
}
}
leo-dropdown {
flex: 1 1 auto;
[slot=value] {
display: flex;
width: 100%;
align-items: center;
gap: 8px;
}
}
.counter {
border-radius: 6px;
padding: 2px 4px;
background-color: ${color.neutral[10]};
font: ${font.small.semibold};
color: ${color.neutral[60]};
}
.block-scripts-text {
> * {
display: flex;
align-items: center;
gap: 8px;
}
.note {
font: ${font.small.regular};
color: ${color.text.tertiary};
}
}
.block-elements {
padding: 11px 8px;
button {
color: ${color.text.interactive};
font: ${font.small.regular};
text-decoration: underline;
}
}
`
@@ -0,0 +1,414 @@
/* Copyright (c) 2026 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 https://mozilla.org/MPL/2.0/. */
import * as React from 'react'
import Dropdown from '@brave/leo/react/dropdown'
import Icon from '@brave/leo/react/icon'
import Toggle from '@brave/leo/react/toggle'
import { useShieldsApi } from '../api/shields_api_context'
import { StringKey, getString } from './strings'
import {
AdBlockMode,
HttpsUpgradeMode,
FingerprintMode,
CookieBlockMode,
ContentSettingSource,
} from 'gen/brave/components/brave_shields/core/common/shields_settings.mojom.m.js'
import { ContentSetting } from 'gen/components/content_settings/core/common/content_settings.mojom.m'
import { style } from './advanced_settings.style'
interface Props {
showFingerprintingDetails: () => void
showAdsBlocked: () => void
showScriptsBlocked: () => void
}
export function AdvancedSettings(props: Props) {
const api = useShieldsApi()
const { data: siteBlockInfo } = api.useGetSiteBlockInfo()
const showAdvancedView = api.useGetAdvancedViewEnabledData()
const shieldsEnabled = siteBlockInfo?.isBraveShieldsEnabled
const adblockOnlyEnabled = siteBlockInfo?.isBraveShieldsAdBlockOnlyModeEnabled
if (!shieldsEnabled || !showAdvancedView || adblockOnlyEnabled) {
return null
}
return (
<div
data-css-scope={style.scope}
className='scrollable'
>
<AdBlockControl showDetails={props.showAdsBlocked} />
<HttpsUpgradeControls />
<BlockScriptsControls showDetails={props.showScriptsBlocked} />
<FingerprintingControls showDetails={props.showFingerprintingDetails} />
<CookieBlockControls />
<ForgetFirstPartyStorageControls />
<BlockElementsControls />
</div>
)
}
function AdBlockControl(props: { showDetails: () => void }) {
const api = useShieldsApi()
const { data: siteSettings } = api.useGetSiteSettings()
const { data: siteBlockInfo } = api.useGetSiteBlockInfo()
if (!siteSettings || !siteBlockInfo) {
return null
}
const adBlockMode = siteSettings.adBlockMode
const adsBlocked = siteBlockInfo.adsList.length
const isManaged = siteBlockInfo.isBraveShieldsManaged
return (
<div>
<Icon name='hand-raised' />
<Dropdown
value={String(adBlockMode)}
disabled={isManaged}
onChange={({ value }) => {
withEnumValue(value, (mode) => api.setAdBlockMode([mode]))
}}
>
<span slot='value'>
{getString(getAdBlockModeLabel(adBlockMode))}
<Counter count={adsBlocked} />
</span>
<leo-option value={String(AdBlockMode.AGGRESSIVE)}>
{getString(getAdBlockModeLabel(AdBlockMode.AGGRESSIVE))}
</leo-option>
<leo-option value={String(AdBlockMode.STANDARD)}>
{getString(getAdBlockModeLabel(AdBlockMode.STANDARD))}
</leo-option>
<leo-option value={String(AdBlockMode.ALLOW)}>
{getString(getAdBlockModeLabel(AdBlockMode.ALLOW))}
</leo-option>
</Dropdown>
<button
onClick={props.showDetails}
disabled={adsBlocked <= 0}
>
<Icon name='carat-right' />
</button>
</div>
)
}
function getAdBlockModeLabel(mode: number | undefined) {
switch (mode) {
case AdBlockMode.AGGRESSIVE:
return 'BRAVE_SHIELDS_TRACKERS_AND_ADS_BLOCKED_AGG'
case AdBlockMode.STANDARD:
return 'BRAVE_SHIELDS_TRACKERS_AND_ADS_BLOCKED_STD'
case AdBlockMode.ALLOW:
return 'BRAVE_SHIELDS_TRACKERS_AND_ADS_ALLOW_ALL'
}
throw new Error(`Unrecognized AdBlockMode value: ${mode}`)
}
function HttpsUpgradeControls() {
const api = useShieldsApi()
const { data: siteSettings } = api.useGetSiteSettings()
const isHttpsByDefaultEnabled = api.useIsHttpsByDefaultEnabledData()
const isTorProfile = api.useIsTorProfileData()
if (!siteSettings) {
return null
}
const httpsUpgradeMode = siteSettings.httpsUpgradeMode
if (!isHttpsByDefaultEnabled || isTorProfile) {
return null
}
return (
<div>
<Icon name='lock-dots' />
<Dropdown
value={String(httpsUpgradeMode)}
onChange={({ value }) => {
withEnumValue(value, (mode) => api.setHttpsUpgradeMode([mode]))
}}
>
<leo-option value={String(HttpsUpgradeMode.STRICT_MODE)}>
{getString('BRAVE_SHIELDS_HTTPS_UPGRADE_MODE_STRICT')}
</leo-option>
<leo-option value={String(HttpsUpgradeMode.STANDARD_MODE)}>
{getString('BRAVE_SHIELDS_HTTPS_UPGRADE_MODE_STANDARD')}
</leo-option>
<leo-option value={String(HttpsUpgradeMode.DISABLED_MODE)}>
{getString('BRAVE_SHIELDS_HTTPS_UPGRADE_MODE_DISABLED')}
</leo-option>
</Dropdown>
<div />
</div>
)
}
function BlockScriptsControls(props: { showDetails: () => void }) {
const api = useShieldsApi()
const { data: siteBlockInfo } = api.useGetSiteBlockInfo()
const { data: siteSettings } = api.useGetSiteSettings()
if (!siteBlockInfo || !siteSettings) {
return null
}
const jsBlocked = siteBlockInfo.blockedJsList.length
const jsAllowed = siteBlockInfo.allowedJsList.length
const isNoscriptEnabled = siteSettings.isNoscriptEnabled
const isManaged = siteBlockInfo.isBraveShieldsManaged
const hasBlockedOrAllowed = jsBlocked > 0 || jsAllowed > 0
const overrideStatus = siteSettings.scriptsBlockedOverrideStatus
const overrideSource = overrideStatus?.overrideSource
const scriptsBlockedEnforced =
overrideStatus
&& overrideStatus.status !== ContentSetting.DEFAULT
&& overrideSource !== ContentSettingSource.kUser
&& overrideSource !== ContentSettingSource.kNone
return (
<div>
<Icon name='code' />
<div className='toggle'>
<div className='block-scripts-text'>
<div>
{getString('BRAVE_SHIELDS_SCRIPTS_BLOCKED')}
<Counter count={jsBlocked} />
</div>
{scriptsBlockedEnforced && (
<div className='note'>
{getString(getEnforcedDescription(overrideSource))}
</div>
)}
</div>
<Toggle
checked={isNoscriptEnabled}
disabled={isManaged || scriptsBlockedEnforced}
size='small'
onChange={(event) => {
api.setIsNoScriptsEnabled([event.checked])
}}
/>
</div>
<button
onClick={props.showDetails}
disabled={
!isNoscriptEnabled || !hasBlockedOrAllowed || scriptsBlockedEnforced
}
>
<Icon name='carat-right' />
</button>
</div>
)
}
function getEnforcedDescription(overrideSource: number | undefined): StringKey {
switch (overrideSource) {
case ContentSettingSource.kExtension:
return 'BRAVE_SHIELDS_SCRIPTS_BLOCKED_OVERRIDDEN_BY_EXTENSION'
case ContentSettingSource.kPolicy:
return 'BRAVE_SHIELDS_SCRIPTS_BLOCKED_OVERRIDDEN_BY_POLICY'
case ContentSettingSource.kAllowList:
return 'BRAVE_SHIELDS_SCRIPTS_BLOCKED_OVERRIDDEN_BY_ALLOWLIST'
case ContentSettingSource.kSupervised:
return 'BRAVE_SHIELDS_SCRIPTS_BLOCKED_OVERRIDDEN_BY_SUPERVISOR'
case ContentSettingSource.kInstalledWebApp:
return 'BRAVE_SHIELDS_SCRIPTS_BLOCKED_OVERRIDDEN_BY_PWA'
default:
return 'BRAVE_SHIELDS_SCRIPTS_BLOCKED_OVERRIDDEN'
}
}
function FingerprintingControls(props: { showDetails: () => void }) {
const api = useShieldsApi()
const { data: siteBlockInfo } = api.useGetSiteBlockInfo()
const { data: siteSettings } = api.useGetSiteSettings()
const showStrictMode = api.useShowStrictFingerprintingModeData()
const webcompatExceptionsEnabled =
api.useIsWebcompatExceptionsServiceEnabledData()
if (!siteBlockInfo || !siteSettings) {
return null
}
const isManaged = siteBlockInfo.isBraveShieldsManaged
const fingerprintMode = siteSettings.fingerprintMode
const invokedWebcompatCount = siteBlockInfo.invokedWebcompatList.length
return (
<div>
<Icon name='biometric-login' />
{showStrictMode ? (
<Dropdown
value={String(fingerprintMode)}
disabled={isManaged}
onChange={({ value }) => {
withEnumValue(value, (mode) => api.setFingerprintMode([mode]))
}}
>
<leo-option value={String(FingerprintMode.STRICT_MODE)}>
{getString('BRAVE_SHIELDS_FINGERPRINTING_BLOCKED_AGG')}
</leo-option>
<leo-option value={String(FingerprintMode.STANDARD_MODE)}>
{getString('BRAVE_SHIELDS_FINGERPRINTING_BLOCKED_STD')}
</leo-option>
<leo-option value={String(FingerprintMode.ALLOW_MODE)}>
{getString('BRAVE_SHIELDS_FINGERPRINTING_ALLOW_ALL')}
</leo-option>
</Dropdown>
) : (
<div className='toggle'>
{getString('BRAVE_SHIELDS_FINGERPRINTING_BLOCKED_STD')}
<Toggle
checked={fingerprintMode !== FingerprintMode.ALLOW_MODE}
disabled={isManaged}
size='small'
onChange={(event) => {
api.setFingerprintMode([
event.checked
? FingerprintMode.STANDARD_MODE
: FingerprintMode.ALLOW_MODE,
])
}}
/>
</div>
)}
<button
onClick={props.showDetails}
disabled={
!webcompatExceptionsEnabled
|| invokedWebcompatCount <= 0
|| fingerprintMode === FingerprintMode.ALLOW_MODE
}
>
<Icon name='carat-right' />
</button>
</div>
)
}
function CookieBlockControls() {
const api = useShieldsApi()
const { data: siteSettings } = api.useGetSiteSettings()
const { data: siteBlockInfo } = api.useGetSiteBlockInfo()
if (!siteBlockInfo || !siteSettings) {
return null
}
const cookieBlockMode = siteSettings.cookieBlockMode
const isManaged = siteBlockInfo.isBraveShieldsManaged
return (
<div>
<Icon name='cookie' />
<Dropdown
value={String(cookieBlockMode)}
disabled={isManaged}
onChange={({ value }) => {
withEnumValue(value, (mode) => api.setCookieBlockMode([mode]))
}}
>
<leo-option value={String(CookieBlockMode.BLOCKED)}>
{getString('BRAVE_SHIELDS_COOKIES_BLOCKED')}
</leo-option>
<leo-option value={String(CookieBlockMode.CROSS_SITE_BLOCKED)}>
{getString('BRAVE_SHIELDS_THIRD_PARTY_COOKIES_BLOCKED')}
</leo-option>
<leo-option value={String(CookieBlockMode.ALLOW)}>
{getString('BRAVE_SHIELDS_COOKIES_ALLOWED_ALL')}
</leo-option>
</Dropdown>
<div />
</div>
)
}
function ForgetFirstPartyStorageControls() {
const api = useShieldsApi()
const { data: siteSettings } = api.useGetSiteSettings()
const { data: siteBlockInfo } = api.useGetSiteBlockInfo()
const forgetFeatureEnabled =
api.useIsBraveForgetFirstPartyStorageFeatureEnabledData()
if (!siteBlockInfo || !siteSettings) {
return null
}
const isForgetEnabled = siteSettings.isForgetFirstPartyStorageEnabled
const isManaged = siteBlockInfo.isBraveShieldsManaged
if (!forgetFeatureEnabled) {
return null
}
return (
<div>
<Icon name='eye-off' />
<div className='toggle'>
{getString('BRAVE_SHIELDS_FORGET_FIRST_PARTY_STORAGE_LABEL')}
<Toggle
checked={isForgetEnabled}
disabled={isManaged}
size='small'
onChange={(event) => {
api.setForgetFirstPartyStorageEnabled([event.checked])
}}
/>
</div>
<div />
</div>
)
}
function BlockElementsControls() {
const api = useShieldsApi()
const blockedElementsPresent = api.useAreAnyBlockedElementsPresentData()
if (!blockedElementsPresent) {
return null
}
return (
<div>
<Icon name='disable-outline' />
<div className='block-elements'>
<div>{getString('BRAVE_SHIELDS_BLOCK_ELEMENTS')}</div>
<button onClick={() => api.resetBlockedElements()}>
{getString('BRAVE_SHIELDS_SHOW_ALL_BLOCKED_ELEMENTS')}
</button>
</div>
<div />
</div>
)
}
function Counter(props: { count: number }) {
if (props.count <= 0) {
return null
}
return (
<span className='counter'>{props.count > 99 ? '99+' : props.count}</span>
)
}
function withEnumValue(s: string | undefined, fn: (value: number) => void) {
const value = parseInt(s ?? '', 10)
if (!isNaN(value)) {
fn(value)
}
}
@@ -8,6 +8,7 @@ import * as React from 'react'
import { MainCard } from './main_card'
import { Footer } from './footer'
import { AdvancedSettingsHeader } from './advanced_settings_header'
import { AdvancedSettings } from './advanced_settings'
import { useInitializedStatus } from './use_initialized_status'
import { useCacheInvalidator } from './use_cache_invalidator'
@@ -61,6 +62,13 @@ function MainView(props: { showView: (view: AppView) => void }) {
<main>
<MainCard />
<AdvancedSettingsHeader />
<AdvancedSettings
showAdsBlocked={() => props.showView('ads-blocked')}
showScriptsBlocked={() => props.showView('scripts-blocked')}
showFingerprintingDetails={() =>
props.showView('fingerprinting-details')
}
/>
<Footer />
</main>
)
@@ -6,6 +6,6 @@
import { getLocale } from '$web-common/locale'
import { BraveShieldsStrings } from 'gen/components/grit/brave_components_webui_strings'
type StringKey = keyof typeof BraveShieldsStrings
export type StringKey = keyof typeof BraveShieldsStrings
export const getString = <(key: StringKey) => string>getLocale
+25 -21
View File
@@ -132,7 +132,11 @@
Global Settings
</message>
<message name="IDS_BRAVE_SHIELDS_SHOW_ALL_BLOCKED_ELEMENTS" desc="Button that shows all blocked elements">
<message name="IDS_BRAVE_SHIELDS_BLOCK_ELEMENTS" desc="Label for block elements section." formatter_data="webui=BraveShields">
Block elements
</message>
<message name="IDS_BRAVE_SHIELDS_SHOW_ALL_BLOCKED_ELEMENTS" desc="Button that shows all blocked elements" formatter_data="webui=BraveShields">
Clear all blocked elements
</message>
@@ -168,31 +172,31 @@
Enable HTTPS
</message>
<message name="IDS_BRAVE_SHIELDS_SCRIPTS_BLOCKED" desc="A label for scripts Scripts blocked option.">
<message name="IDS_BRAVE_SHIELDS_SCRIPTS_BLOCKED" desc="A label for scripts Scripts blocked option." formatter_data="webui=BraveShields">
Block scripts
</message>
<message name="IDS_BRAVE_SHIELDS_SCRIPTS_BLOCKED_OVERRIDDEN" desc="A label for scripts Scripts blocked option which is overridden by rule.">
<message name="IDS_BRAVE_SHIELDS_SCRIPTS_BLOCKED_OVERRIDDEN" desc="A label for scripts Scripts blocked option which is overridden by rule." formatter_data="webui=BraveShields">
(enforced)
</message>
<message name="IDS_BRAVE_SHIELDS_SCRIPTS_BLOCKED_OVERRIDDEN_BY_EXTENSION" desc="A label for scripts Scripts blocked option which is overridden by extension rule.">
<message name="IDS_BRAVE_SHIELDS_SCRIPTS_BLOCKED_OVERRIDDEN_BY_EXTENSION" desc="A label for scripts Scripts blocked option which is overridden by extension rule." formatter_data="webui=BraveShields">
(enforced by extension)
</message>
<message name="IDS_BRAVE_SHIELDS_SCRIPTS_BLOCKED_OVERRIDDEN_BY_POLICY" desc="A label for scripts Scripts blocked option which is overridden by a policy rule.">
<message name="IDS_BRAVE_SHIELDS_SCRIPTS_BLOCKED_OVERRIDDEN_BY_POLICY" desc="A label for scripts Scripts blocked option which is overridden by a policy rule." formatter_data="webui=BraveShields">
(enforced by policy)
</message>
<message name="IDS_BRAVE_SHIELDS_SCRIPTS_BLOCKED_OVERRIDDEN_BY_ALLOWLIST" desc="A label for scripts Scripts blocked option which is overridden by a allowlist built into the browser's WebUI.">
<message name="IDS_BRAVE_SHIELDS_SCRIPTS_BLOCKED_OVERRIDDEN_BY_ALLOWLIST" desc="A label for scripts Scripts blocked option which is overridden by a allowlist built into the browser's WebUI." formatter_data="webui=BraveShields">
(enforced by allowlist)
</message>
<message name="IDS_BRAVE_SHIELDS_SCRIPTS_BLOCKED_OVERRIDDEN_BY_SUPERVISOR" desc="A label for scripts Scripts blocked option which is overridden by a supervisor rule.">
<message name="IDS_BRAVE_SHIELDS_SCRIPTS_BLOCKED_OVERRIDDEN_BY_SUPERVISOR" desc="A label for scripts Scripts blocked option which is overridden by a supervisor rule." formatter_data="webui=BraveShields">
(enforced by supervisor)
</message>
<message name="IDS_BRAVE_SHIELDS_SCRIPTS_BLOCKED_OVERRIDDEN_BY_PWA" desc="A label for scripts Scripts blocked option which is overridden by a PWA.">
<message name="IDS_BRAVE_SHIELDS_SCRIPTS_BLOCKED_OVERRIDDEN_BY_PWA" desc="A label for scripts Scripts blocked option which is overridden by a PWA." formatter_data="webui=BraveShields">
(enforced by PWA)
</message>
@@ -204,23 +208,23 @@
Trackers &amp; ads
</message>
<message name="IDS_BRAVE_SHIELDS_TRACKERS_AND_ADS_BLOCKED_STD" desc="Menu option that would block some trackers and advertisement website scripts.">
<message name="IDS_BRAVE_SHIELDS_TRACKERS_AND_ADS_BLOCKED_STD" desc="Menu option that would block some trackers and advertisement website scripts." formatter_data="webui=BraveShields">
Block trackers &amp; ads
</message>
<message name="IDS_BRAVE_SHIELDS_TRACKERS_AND_ADS_BLOCKED_AGG" desc="Menu option that would block all trackers and advertisement website scripts.">
<message name="IDS_BRAVE_SHIELDS_TRACKERS_AND_ADS_BLOCKED_AGG" desc="Menu option that would block all trackers and advertisement website scripts." formatter_data="webui=BraveShields">
Aggressively block trackers &amp; ads
</message>
<message name="IDS_BRAVE_SHIELDS_TRACKERS_AND_ADS_ALLOW_ALL" desc="Menu option that would stop blocking all trackers and advertisement website scripts">
<message name="IDS_BRAVE_SHIELDS_TRACKERS_AND_ADS_ALLOW_ALL" desc="Menu option that would stop blocking all trackers and advertisement website scripts" formatter_data="webui=BraveShields">
Allow all trackers &amp; ads
</message>
<message name="IDS_BRAVE_SHIELDS_THIRD_PARTY_COOKIES_BLOCKED" desc="Menu option that would block third-party cookies.">
<message name="IDS_BRAVE_SHIELDS_THIRD_PARTY_COOKIES_BLOCKED" desc="Menu option that would block third-party cookies." formatter_data="webui=BraveShields">
Block third-party cookies
</message>
<message name="IDS_BRAVE_SHIELDS_FORGET_FIRST_PARTY_STORAGE_LABEL" desc="Shields panel toggle label that would forget first party website storage when enabled.">
<message name="IDS_BRAVE_SHIELDS_FORGET_FIRST_PARTY_STORAGE_LABEL" desc="Shields panel toggle label that would forget first party website storage when enabled." formatter_data="webui=BraveShields">
Forget me when I close this site
</message>
@@ -244,11 +248,11 @@
Enables the Shields Block Elements feature in private windows. Note that elements blocked in private windows will also be blocked in non-private windows.
</message>
<message name="IDS_BRAVE_SHIELDS_COOKIES_BLOCKED" desc="Menu option that would block current website cookies.">
<message name="IDS_BRAVE_SHIELDS_COOKIES_BLOCKED" desc="Menu option that would block current website cookies." formatter_data="webui=BraveShields">
Block all cookies
</message>
<message name="IDS_BRAVE_SHIELDS_COOKIES_ALLOWED_ALL" desc="Menu option that would allow all cookies on the current website.">
<message name="IDS_BRAVE_SHIELDS_COOKIES_ALLOWED_ALL" desc="Menu option that would allow all cookies on the current website." formatter_data="webui=BraveShields">
Allow all cookies
</message>
@@ -256,27 +260,27 @@
Fingerprinting blocked
</message>
<message name="IDS_BRAVE_SHIELDS_FINGERPRINTING_BLOCKED_STD" desc="Menu option that would block some fingerprinting website scripts.">
<message name="IDS_BRAVE_SHIELDS_FINGERPRINTING_BLOCKED_STD" desc="Menu option that would block some fingerprinting website scripts." formatter_data="webui=BraveShields">
Block fingerprinting
</message>
<message name="IDS_BRAVE_SHIELDS_FINGERPRINTING_BLOCKED_AGG" desc="Menu option that would block all fingerprinting website scripts.">
<message name="IDS_BRAVE_SHIELDS_FINGERPRINTING_BLOCKED_AGG" desc="Menu option that would block all fingerprinting website scripts." formatter_data="webui=BraveShields">
Aggressively block fingerprinting
</message>
<message name="IDS_BRAVE_SHIELDS_FINGERPRINTING_ALLOW_ALL" desc="Menu option that would stop blocking all fingerprinting website scripts.">
<message name="IDS_BRAVE_SHIELDS_FINGERPRINTING_ALLOW_ALL" desc="Menu option that would stop blocking all fingerprinting website scripts." formatter_data="webui=BraveShields">
Allow fingerprinting
</message>
<message name="IDS_BRAVE_SHIELDS_HTTPS_UPGRADE_MODE_DISABLED" desc="Menu option that doesn't upgrade HTTP connections.">
<message name="IDS_BRAVE_SHIELDS_HTTPS_UPGRADE_MODE_DISABLED" desc="Menu option that doesn't upgrade HTTP connections." formatter_data="webui=BraveShields">
Don't upgrade HTTP connections
</message>
<message name="IDS_BRAVE_SHIELDS_HTTPS_UPGRADE_MODE_STANDARD" desc="Menu option that prefers to use HTTPS whenever possible.">
<message name="IDS_BRAVE_SHIELDS_HTTPS_UPGRADE_MODE_STANDARD" desc="Menu option that prefers to use HTTPS whenever possible." formatter_data="webui=BraveShields">
Upgrade connections to HTTPS
</message>
<message name="IDS_BRAVE_SHIELDS_HTTPS_UPGRADE_MODE_STRICT" desc="Menu option that requires HTTPS on all connections.">
<message name="IDS_BRAVE_SHIELDS_HTTPS_UPGRADE_MODE_STRICT" desc="Menu option that requires HTTPS on all connections." formatter_data="webui=BraveShields">
Only connect with HTTPS
</message>
+3
View File
@@ -181,6 +181,7 @@ leo_icons = [
"bar-chart.svg",
"bat-color.svg",
"bing-color.svg",
"biometric-login.svg",
"bluetooth-off.svg",
"bluetooth.svg",
"brave-icon-monochrome.svg",
@@ -283,6 +284,7 @@ leo_icons = [
"grid04.svg",
"hamburger-menu.svg",
"hand-coins.svg",
"hand-raised.svg",
"hearts.svg",
"help-outline.svg",
"history.svg",
@@ -308,6 +310,7 @@ leo_icons = [
"loading-spinner.svg",
"location-off.svg",
"location-on.svg",
"lock-dots.svg",
"lock-open.svg",
"lock-plain.svg",
"lock.svg",