fine grained blocking settings

This commit is contained in:
Fabian Freund
2026-06-30 07:51:11 +02:00
parent 9c2c8d4ba6
commit e6f7ccc71c
13 changed files with 221 additions and 74 deletions
@@ -57,7 +57,9 @@ bool _customEtpSettingsChanged(
previous.suspectedFingerprintersScope !=
current.suspectedFingerprintersScope ||
previous.allowListBaseline != current.allowListBaseline ||
previous.allowListConvenience != current.allowListConvenience;
previous.allowListConvenience != current.allowListConvenience ||
previous.blockAdsAnalyticsSocialTrackers !=
current.blockAdsAnalyticsSocialTrackers;
}
Future<void> syncUBlockFilterLists(
@@ -248,6 +250,8 @@ class EngineSettingsReplicationService
settings.suspectedFingerprintersScope,
allowListBaseline: settings.allowListBaseline,
allowListConvenience: settings.allowListConvenience,
blockAdsAnalyticsSocialTrackers:
settings.blockAdsAnalyticsSocialTrackers,
);
} else {
await _service.trackingProtectionPolicy(
@@ -44,7 +44,7 @@ final class EngineSettingsReplicationServiceProvider
}
String _$engineSettingsReplicationServiceHash() =>
r'a3d7628b7662ca8b828586e3fcf4e8925adbe062';
r'41c07a48bbc90a90dd6f5a0bd48d55a3e02a1b64';
abstract class _$EngineSettingsReplicationService extends $Notifier<void> {
void build();
@@ -301,15 +301,26 @@ class _TrackersSection extends HookConsumerWidget {
final blockRedirectTrackers = ref.watch(
engineSettingsWithDefaultsProvider.select((s) => s.blockRedirectTrackers),
);
final blockAdsAnalyticsSocialTrackers = ref.watch(
engineSettingsWithDefaultsProvider.select(
(s) => s.blockAdsAnalyticsSocialTrackers,
),
);
return Column(
children: [
const ListTile(
title: Text('Always Blocked'),
subtitle: Text(
'Ads, analytics, social trackers, and Mozilla social trackers are always blocked in Custom mode.',
SwitchListTile.adaptive(
title: const Text('Ads, Analytics, and Social Trackers'),
subtitle: const Text(
'Block advertising, analytics, social, and Mozilla social tracker categories',
),
leading: Icon(MdiIcons.shieldLock),
secondary: const Icon(Icons.block),
value: blockAdsAnalyticsSocialTrackers,
onChanged: (value) async {
await ref
.read(saveEngineSettingsControllerProvider.notifier)
.save((s) => s.copyWith.blockAdsAnalyticsSocialTrackers(value));
},
),
SwitchListTile.adaptive(
title: const Text('Cryptominers'),
@@ -47,6 +47,12 @@ const List<SettingsSectionDefinition> privacySecuritySettingsSections = [
keywords: ['etp', 'standard', 'strict', 'custom'],
child: _EnhancedTrackingProtectionSection(),
),
SettingsEntryDefinition(
title: 'Content Blocking Database',
subtitle: 'Use GeckoView blocker lists for ETP categories',
keywords: ['ads', 'trackers', 'content blocking'],
child: _ContentBlockingDatabaseTile(),
),
SettingsEntryDefinition(
title: 'Bounce Tracking Protection',
subtitle: 'Remove tracking state left by redirect-based trackers',
@@ -680,14 +686,14 @@ class _EnhancedTrackingProtectionSection extends HookConsumerWidget {
value: TrackingProtectionPolicy.recommended,
title: Text('Standard'),
subtitle: Text(
'Pages will load normally, but block fewer trackers.',
'Balances protection and compatibility by blocking fewer tracker categories.',
),
),
RadioListTile<TrackingProtectionPolicy>.adaptive(
value: TrackingProtectionPolicy.strict,
title: Text('Strict'),
subtitle: Text(
'Stronger tracking protection and faster performance, but some sites may not work properly.',
'Blocks more tracker categories, including tracking content, but may break some sites.',
),
),
RadioListTile<TrackingProtectionPolicy>.adaptive(
@@ -706,6 +712,39 @@ class _EnhancedTrackingProtectionSection extends HookConsumerWidget {
}
}
class _ContentBlockingDatabaseTile extends HookConsumerWidget {
const _ContentBlockingDatabaseTile();
@override
Widget build(BuildContext context, WidgetRef ref) {
final useContentBlockingDatabase = ref.watch(
engineSettingsWithDefaultsProvider.select(
(s) => s.useContentBlockingDatabase,
),
);
return SwitchListTile.adaptive(
title: const Text('Content Blocking Database'),
subtitle: const Text(
'Use GeckoView blocker lists for ETP categories such as ads, analytics, and social trackers. Requires app restart.',
),
secondary: const Icon(Icons.storage),
value: useContentBlockingDatabase,
onChanged: (value) async {
await ref
.read(saveEngineSettingsControllerProvider.notifier)
.save(
(currentSettings) =>
currentSettings.copyWith.useContentBlockingDatabase(value),
);
if (context.mounted) {
await _showRestartDialog(context, ref);
}
},
);
}
}
class _BounceTrackingProtectionTile extends HookConsumerWidget {
const _BounceTrackingProtectionTile();
@@ -80,6 +80,9 @@ class EngineSettings extends GeckoEngineSettings with FastEquatable {
@override
List<String> get locales => super.locales!;
@override
bool get useContentBlockingDatabase => super.useContentBlockingDatabase!;
// Custom Tracking Protection overrides
@override
bool get blockCookies => super.blockCookies!;
@@ -104,6 +107,9 @@ class EngineSettings extends GeckoEngineSettings with FastEquatable {
bool get allowListBaseline => super.allowListBaseline!;
@override
bool get allowListConvenience => super.allowListConvenience!;
@override
bool get blockAdsAnalyticsSocialTrackers =>
super.blockAdsAnalyticsSocialTrackers!;
// Web Content Settings
@override
@@ -196,6 +202,7 @@ class EngineSettings extends GeckoEngineSettings with FastEquatable {
required this.safeBrowsingMalwareEnabled,
required this.safeBrowsingPhishingEnabled,
required super.locales,
required super.useContentBlockingDatabase,
required super.blockCookies,
required super.customCookiePolicy,
required super.blockTrackingContent,
@@ -207,6 +214,7 @@ class EngineSettings extends GeckoEngineSettings with FastEquatable {
required super.suspectedFingerprintersScope,
required super.allowListBaseline,
required super.allowListConvenience,
required super.blockAdsAnalyticsSocialTrackers,
required super.webFontsEnabled,
required super.automaticFontSizeAdjustment,
required super.fontSizeFactor,
@@ -250,6 +258,7 @@ class EngineSettings extends GeckoEngineSettings with FastEquatable {
bool? safeBrowsingMalwareEnabled,
bool? safeBrowsingPhishingEnabled,
List<String>? locales,
bool? useContentBlockingDatabase,
bool? blockCookies,
CustomCookiePolicy? customCookiePolicy,
bool? blockTrackingContent,
@@ -261,6 +270,7 @@ class EngineSettings extends GeckoEngineSettings with FastEquatable {
TrackingScope? suspectedFingerprintersScope,
bool? allowListBaseline,
bool? allowListConvenience,
bool? blockAdsAnalyticsSocialTrackers,
bool? webFontsEnabled,
bool? automaticFontSizeAdjustment,
double? fontSizeFactor,
@@ -318,6 +328,7 @@ class EngineSettings extends GeckoEngineSettings with FastEquatable {
WidgetsBinding.instance.platformDispatcher.locales
.map((x) => x.toLanguageTag())
.toList(),
useContentBlockingDatabase: useContentBlockingDatabase ?? true,
blockCookies: blockCookies ?? true,
customCookiePolicy:
customCookiePolicy ?? CustomCookiePolicy.totalProtection,
@@ -331,6 +342,8 @@ class EngineSettings extends GeckoEngineSettings with FastEquatable {
suspectedFingerprintersScope ?? TrackingScope.all,
allowListBaseline: allowListBaseline ?? true,
allowListConvenience: allowListConvenience ?? false,
blockAdsAnalyticsSocialTrackers:
blockAdsAnalyticsSocialTrackers ?? true,
webFontsEnabled: webFontsEnabled ?? true,
automaticFontSizeAdjustment: automaticFontSizeAdjustment ?? true,
fontSizeFactor: fontSizeFactor ?? 1.0,
@@ -398,6 +411,7 @@ class EngineSettings extends GeckoEngineSettings with FastEquatable {
safeBrowsingMalwareEnabled,
safeBrowsingPhishingEnabled,
locales,
useContentBlockingDatabase,
blockCookies,
customCookiePolicy,
blockTrackingContent,
@@ -409,6 +423,7 @@ class EngineSettings extends GeckoEngineSettings with FastEquatable {
suspectedFingerprintersScope,
allowListBaseline,
allowListConvenience,
blockAdsAnalyticsSocialTrackers,
webFontsEnabled,
automaticFontSizeAdjustment,
fontSizeFactor,
@@ -77,6 +77,8 @@ abstract class _$EngineSettingsCWProxy {
EngineSettings locales(List<String>? locales);
EngineSettings useContentBlockingDatabase(bool? useContentBlockingDatabase);
EngineSettings blockCookies(bool? blockCookies);
EngineSettings customCookiePolicy(CustomCookiePolicy? customCookiePolicy);
@@ -103,6 +105,10 @@ abstract class _$EngineSettingsCWProxy {
EngineSettings allowListConvenience(bool? allowListConvenience);
EngineSettings blockAdsAnalyticsSocialTrackers(
bool? blockAdsAnalyticsSocialTrackers,
);
EngineSettings webFontsEnabled(bool? webFontsEnabled);
EngineSettings automaticFontSizeAdjustment(bool? automaticFontSizeAdjustment);
@@ -166,6 +172,7 @@ abstract class _$EngineSettingsCWProxy {
bool safeBrowsingMalwareEnabled,
bool safeBrowsingPhishingEnabled,
List<String>? locales,
bool? useContentBlockingDatabase,
bool? blockCookies,
CustomCookiePolicy? customCookiePolicy,
bool? blockTrackingContent,
@@ -177,6 +184,7 @@ abstract class _$EngineSettingsCWProxy {
TrackingScope? suspectedFingerprintersScope,
bool? allowListBaseline,
bool? allowListConvenience,
bool? blockAdsAnalyticsSocialTrackers,
bool? webFontsEnabled,
bool? automaticFontSizeAdjustment,
double? fontSizeFactor,
@@ -320,6 +328,10 @@ class _$EngineSettingsCWProxyImpl implements _$EngineSettingsCWProxy {
@override
EngineSettings locales(List<String>? locales) => call(locales: locales);
@override
EngineSettings useContentBlockingDatabase(bool? useContentBlockingDatabase) =>
call(useContentBlockingDatabase: useContentBlockingDatabase);
@override
EngineSettings blockCookies(bool? blockCookies) =>
call(blockCookies: blockCookies);
@@ -366,6 +378,11 @@ class _$EngineSettingsCWProxyImpl implements _$EngineSettingsCWProxy {
EngineSettings allowListConvenience(bool? allowListConvenience) =>
call(allowListConvenience: allowListConvenience);
@override
EngineSettings blockAdsAnalyticsSocialTrackers(
bool? blockAdsAnalyticsSocialTrackers,
) => call(blockAdsAnalyticsSocialTrackers: blockAdsAnalyticsSocialTrackers);
@override
EngineSettings webFontsEnabled(bool? webFontsEnabled) =>
call(webFontsEnabled: webFontsEnabled);
@@ -462,6 +479,7 @@ class _$EngineSettingsCWProxyImpl implements _$EngineSettingsCWProxy {
Object? safeBrowsingMalwareEnabled = const $CopyWithPlaceholder(),
Object? safeBrowsingPhishingEnabled = const $CopyWithPlaceholder(),
Object? locales = const $CopyWithPlaceholder(),
Object? useContentBlockingDatabase = const $CopyWithPlaceholder(),
Object? blockCookies = const $CopyWithPlaceholder(),
Object? customCookiePolicy = const $CopyWithPlaceholder(),
Object? blockTrackingContent = const $CopyWithPlaceholder(),
@@ -473,6 +491,7 @@ class _$EngineSettingsCWProxyImpl implements _$EngineSettingsCWProxy {
Object? suspectedFingerprintersScope = const $CopyWithPlaceholder(),
Object? allowListBaseline = const $CopyWithPlaceholder(),
Object? allowListConvenience = const $CopyWithPlaceholder(),
Object? blockAdsAnalyticsSocialTrackers = const $CopyWithPlaceholder(),
Object? webFontsEnabled = const $CopyWithPlaceholder(),
Object? automaticFontSizeAdjustment = const $CopyWithPlaceholder(),
Object? fontSizeFactor = const $CopyWithPlaceholder(),
@@ -621,6 +640,11 @@ class _$EngineSettingsCWProxyImpl implements _$EngineSettingsCWProxy {
? _value.locales
// ignore: cast_nullable_to_non_nullable
: locales as List<String>?,
useContentBlockingDatabase:
useContentBlockingDatabase == const $CopyWithPlaceholder()
? _value.useContentBlockingDatabase
// ignore: cast_nullable_to_non_nullable
: useContentBlockingDatabase as bool?,
blockCookies: blockCookies == const $CopyWithPlaceholder()
? _value.blockCookies
// ignore: cast_nullable_to_non_nullable
@@ -668,6 +692,11 @@ class _$EngineSettingsCWProxyImpl implements _$EngineSettingsCWProxy {
? _value.allowListConvenience
// ignore: cast_nullable_to_non_nullable
: allowListConvenience as bool?,
blockAdsAnalyticsSocialTrackers:
blockAdsAnalyticsSocialTrackers == const $CopyWithPlaceholder()
? _value.blockAdsAnalyticsSocialTrackers
// ignore: cast_nullable_to_non_nullable
: blockAdsAnalyticsSocialTrackers as bool?,
webFontsEnabled: webFontsEnabled == const $CopyWithPlaceholder()
? _value.webFontsEnabled
// ignore: cast_nullable_to_non_nullable
@@ -814,6 +843,7 @@ EngineSettings _$EngineSettingsFromJson(
locales: (json['locales'] as List<dynamic>?)
?.map((e) => e as String)
.toList(),
useContentBlockingDatabase: json['useContentBlockingDatabase'] as bool?,
blockCookies: json['blockCookies'] as bool?,
customCookiePolicy: $enumDecodeNullable(
_$CustomCookiePolicyEnumMap,
@@ -834,6 +864,8 @@ EngineSettings _$EngineSettingsFromJson(
),
allowListBaseline: json['allowListBaseline'] as bool?,
allowListConvenience: json['allowListConvenience'] as bool?,
blockAdsAnalyticsSocialTrackers:
json['blockAdsAnalyticsSocialTrackers'] as bool?,
webFontsEnabled: json['webFontsEnabled'] as bool?,
automaticFontSizeAdjustment: json['automaticFontSizeAdjustment'] as bool?,
fontSizeFactor: (json['fontSizeFactor'] as num?)?.toDouble(),
@@ -882,6 +914,7 @@ Map<String, dynamic> _$EngineSettingsToJson(
.webContentIsolationStrategy]!,
'enterpriseRootsEnabled': instance.enterpriseRootsEnabled,
'locales': instance.locales,
'useContentBlockingDatabase': instance.useContentBlockingDatabase,
'blockCookies': instance.blockCookies,
'customCookiePolicy':
_$CustomCookiePolicyEnumMap[instance.customCookiePolicy]!,
@@ -896,6 +929,7 @@ Map<String, dynamic> _$EngineSettingsToJson(
_$TrackingScopeEnumMap[instance.suspectedFingerprintersScope]!,
'allowListBaseline': instance.allowListBaseline,
'allowListConvenience': instance.allowListConvenience,
'blockAdsAnalyticsSocialTrackers': instance.blockAdsAnalyticsSocialTrackers,
'webFontsEnabled': instance.webFontsEnabled,
'automaticFontSizeAdjustment': instance.automaticFontSizeAdjustment,
'fontSizeFactor': instance.fontSizeFactor,
@@ -135,6 +135,8 @@ class EngineSettingsRepository extends _$EngineSettingsRepository {
'locales': settings['locales']
?.readAs(DriftSqlType.string, db.typeMapping)
.mapNotNull(jsonDecode),
'useContentBlockingDatabase': settings['useContentBlockingDatabase']
?.readAs(DriftSqlType.bool, db.typeMapping),
// Custom Tracking Protection
'blockCookies': settings['blockCookies']?.readAs(
DriftSqlType.bool,
@@ -176,6 +178,11 @@ class EngineSettingsRepository extends _$EngineSettingsRepository {
DriftSqlType.bool,
db.typeMapping,
),
'blockAdsAnalyticsSocialTrackers':
settings['blockAdsAnalyticsSocialTrackers']?.readAs(
DriftSqlType.bool,
db.typeMapping,
),
// Web Content Settings
'webFontsEnabled': settings['webFontsEnabled']?.readAs(
DriftSqlType.bool,