Files
MrbWebLibre/apps/weblibre/lib/features/user/data/models/engine_settings.dart
T

450 lines
17 KiB
Dart

/*
* Copyright (c) 2024-2026 Fabian Freund.
*
* This file is part of WebLibre
* (see https://weblibre.eu).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
import 'dart:convert';
import 'package:copy_with_extension/copy_with_extension.dart';
import 'package:fast_equatable/fast_equatable.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_mozilla_components/flutter_mozilla_components.dart';
import 'package:json_annotation/json_annotation.dart';
import 'package:nullability/nullability.dart';
import 'package:weblibre/features/user/data/models/ublock_filter_list_settings.dart';
import 'package:weblibre/features/user/domain/entities/fingerprint_overrides.dart';
part 'engine_settings.g.dart';
enum BuiltInDohProviders {
quad9('Quad9', 'https://dns.quad9.net/dns-query'),
mullvad('Mullvad', 'https://dns.mullvad.net/dns-query'),
adguard('AdGuard', 'https://dns.adguard-dns.com/dns-query'),
ffmuc('Freifunk München', 'https://doh.ffmuc.net/dns-query');
final String name;
final String url;
static bool isBuiltin(String url) =>
BuiltInDohProviders.values.any((provider) => provider.url == url);
const BuiltInDohProviders(this.name, this.url);
}
@CopyWith()
@JsonSerializable(includeIfNull: true, constructor: 'withDefaults')
class EngineSettings extends GeckoEngineSettings with FastEquatable {
@override
bool get javascriptEnabled => super.javascriptEnabled!;
@override
TrackingProtectionPolicy get trackingProtectionPolicy =>
super.trackingProtectionPolicy!;
@override
HttpsOnlyMode get httpsOnlyMode => super.httpsOnlyMode!;
@override
ColorScheme get preferredColorScheme => super.preferredColorScheme!;
@override
bool get globalPrivacyControlEnabled => super.globalPrivacyControlEnabled!;
@override
CookieBannerHandlingMode get cookieBannerHandlingMode =>
super.cookieBannerHandlingMode!;
@override
CookieBannerHandlingMode get cookieBannerHandlingModePrivateBrowsing =>
super.cookieBannerHandlingModePrivateBrowsing!;
@override
bool get cookieBannerHandlingGlobalRules =>
super.cookieBannerHandlingGlobalRules!;
@override
bool get cookieBannerHandlingGlobalRulesSubFrames =>
super.cookieBannerHandlingGlobalRulesSubFrames!;
@override
WebContentIsolationStrategy get webContentIsolationStrategy =>
super.webContentIsolationStrategy!;
@override
bool get enterpriseRootsEnabled => super.enterpriseRootsEnabled!;
@override
List<String> get locales => super.locales!;
@override
bool get useContentBlockingDatabase => super.useContentBlockingDatabase!;
// Custom Tracking Protection overrides
@override
bool get blockCookies => super.blockCookies!;
@override
CustomCookiePolicy get customCookiePolicy => super.customCookiePolicy!;
@override
bool get blockTrackingContent => super.blockTrackingContent!;
@override
TrackingScope get trackingContentScope => super.trackingContentScope!;
@override
bool get blockCryptominers => super.blockCryptominers!;
@override
bool get blockFingerprinters => super.blockFingerprinters!;
@override
bool get blockRedirectTrackers => super.blockRedirectTrackers!;
@override
bool get blockSuspectedFingerprinters => super.blockSuspectedFingerprinters!;
@override
TrackingScope get suspectedFingerprintersScope =>
super.suspectedFingerprintersScope!;
@override
bool get allowListBaseline => super.allowListBaseline!;
@override
bool get allowListConvenience => super.allowListConvenience!;
@override
bool get blockAdsAnalyticsSocialTrackers =>
super.blockAdsAnalyticsSocialTrackers!;
// Web Content Settings
@override
bool get webFontsEnabled => super.webFontsEnabled!;
@override
bool get automaticFontSizeAdjustment => super.automaticFontSizeAdjustment!;
@override
double get fontSizeFactor => super.fontSizeFactor!;
@override
bool get fontInflationEnabled => super.fontInflationEnabled!;
@override
bool get inputAutoZoomEnabled => super.inputAutoZoomEnabled!;
@override
bool get forceUserScalableContent => super.forceUserScalableContent!;
// Process Isolation Settings (require app restart)
@override
bool get fissionEnabled => super.fissionEnabled!;
@override
bool get isolatedProcessEnabled => super.isolatedProcessEnabled!;
@override
bool get appZygoteProcessEnabled => super.appZygoteProcessEnabled!;
@override
bool get extensionsWebAPIEnabled => super.extensionsWebAPIEnabled!;
final QueryParameterStripping queryParameterStripping;
final BounceTrackingProtectionMode bounceTrackingProtectionMode;
@JsonKey(fromJson: _addonCollectionFromJson, toJson: _addonCollectionToJson)
final AddonCollection? addonCollection;
@JsonKey(
fromJson: _ublockFilterListSettingsFromJson,
toJson: _ublockFilterListSettingsToJson,
)
final UBlockFilterListSettings ublockFilterListSettings;
final DohSettingsMode dohSettingsMode;
final String dohProviderUrl;
final String dohDefaultProviderUrl;
final List<String> dohExceptionsList;
@override
@JsonKey(includeFromJson: false, includeToJson: false)
DohSettings get dohSettings => DohSettings(
dohSettingsMode: dohSettingsMode,
dohProviderUrl: dohProviderUrl,
dohDefaultProviderUrl: dohDefaultProviderUrl,
dohExceptionsList: dohExceptionsList,
);
@override
@JsonKey(includeFromJson: false, includeToJson: false)
ContentBlocking get contentBlocking => ContentBlocking(
queryParameterStripping: queryParameterStripping,
queryParameterStrippingAllowList: '',
queryParameterStrippingStripList:
'__hsfp __hssc __hstc __s _bhlid _branch_match_id _branch_referrer _gl _hsenc _kx _openstat at_recipient_id at_recipient_list bbeml bsft_clkid bsft_uid dclid et_rid fb_action_ids fb_comment_id fbclid gbraid gclid guce_referrer guce_referrer_sig hsCtaTracking igshid irclickid mc_eid mkt_tok ml_subscriber ml_subscriber_hash msclkid mtm_cid oft_c oft_ck oft_d oft_id oft_ids oft_k oft_lk oft_sk oly_anon_id oly_enc_id pk_cid rb_clickid s_cid sc_customer sc_eh sc_uid sms_click sms_source sms_uph srsltid ss_email_id syclid ttclid twclid unicorn_click_id vero_conv vero_id vgo_ee wbraid wickedid yclid ymclid ysclid',
bounceTrackingProtectionMode: bounceTrackingProtectionMode,
);
final bool enablePdfJs;
final bool safeBrowsingMalwareEnabled;
final bool safeBrowsingPhishingEnabled;
EngineSettings({
required super.javascriptEnabled,
required super.trackingProtectionPolicy,
required super.httpsOnlyMode,
required super.globalPrivacyControlEnabled,
required super.preferredColorScheme,
required super.cookieBannerHandlingMode,
required super.cookieBannerHandlingModePrivateBrowsing,
required super.cookieBannerHandlingGlobalRules,
required super.cookieBannerHandlingGlobalRulesSubFrames,
required super.webContentIsolationStrategy,
required super.userAgent,
required super.enterpriseRootsEnabled,
required this.queryParameterStripping,
required this.bounceTrackingProtectionMode,
required this.addonCollection,
required this.ublockFilterListSettings,
required this.dohSettingsMode,
required this.dohProviderUrl,
required this.dohDefaultProviderUrl,
required this.dohExceptionsList,
required super.fingerprintingProtectionOverrides,
required this.enablePdfJs,
required this.safeBrowsingMalwareEnabled,
required this.safeBrowsingPhishingEnabled,
required super.locales,
required super.useContentBlockingDatabase,
required super.blockCookies,
required super.customCookiePolicy,
required super.blockTrackingContent,
required super.trackingContentScope,
required super.blockCryptominers,
required super.blockFingerprinters,
required super.blockRedirectTrackers,
required super.blockSuspectedFingerprinters,
required super.suspectedFingerprintersScope,
required super.allowListBaseline,
required super.allowListConvenience,
required super.blockAdsAnalyticsSocialTrackers,
required super.webFontsEnabled,
required super.automaticFontSizeAdjustment,
required super.fontSizeFactor,
required super.fontInflationEnabled,
required super.displayDensityOverride,
required super.screenWidthOverride,
required super.screenHeightOverride,
required super.inputAutoZoomEnabled,
required super.forceUserScalableContent,
required super.fissionEnabled,
required super.isolatedProcessEnabled,
required super.appZygoteProcessEnabled,
required super.extensionsWebAPIEnabled,
required super.lnaBlocking,
required super.lnaBlockTrackers,
required super.lnaEnabled,
});
EngineSettings.withDefaults({
bool? javascriptEnabled,
TrackingProtectionPolicy? trackingProtectionPolicy,
HttpsOnlyMode? httpsOnlyMode,
bool? globalPrivacyControlEnabled,
ColorScheme? preferredColorScheme,
CookieBannerHandlingMode? cookieBannerHandlingMode,
CookieBannerHandlingMode? cookieBannerHandlingModePrivateBrowsing,
bool? cookieBannerHandlingGlobalRules,
bool? cookieBannerHandlingGlobalRulesSubFrames,
WebContentIsolationStrategy? webContentIsolationStrategy,
QueryParameterStripping? queryParameterStripping,
BounceTrackingProtectionMode? bounceTrackingProtectionMode,
super.userAgent,
bool? enterpriseRootsEnabled,
this.addonCollection,
UBlockFilterListSettings? ublockFilterListSettings,
DohSettingsMode? dohSettingsMode,
String? dohProviderUrl,
String? dohDefaultProviderUrl,
List<String>? dohExceptionsList,
String? fingerprintingProtectionOverrides,
bool? enablePdfJs,
bool? safeBrowsingMalwareEnabled,
bool? safeBrowsingPhishingEnabled,
List<String>? locales,
bool? useContentBlockingDatabase,
bool? blockCookies,
CustomCookiePolicy? customCookiePolicy,
bool? blockTrackingContent,
TrackingScope? trackingContentScope,
bool? blockCryptominers,
bool? blockFingerprinters,
bool? blockRedirectTrackers,
bool? blockSuspectedFingerprinters,
TrackingScope? suspectedFingerprintersScope,
bool? allowListBaseline,
bool? allowListConvenience,
bool? blockAdsAnalyticsSocialTrackers,
bool? webFontsEnabled,
bool? automaticFontSizeAdjustment,
double? fontSizeFactor,
bool? fontInflationEnabled,
super.displayDensityOverride,
super.screenWidthOverride,
super.screenHeightOverride,
bool? inputAutoZoomEnabled,
bool? forceUserScalableContent,
bool? fissionEnabled,
bool? isolatedProcessEnabled,
bool? appZygoteProcessEnabled,
bool? extensionsWebAPIEnabled,
super.lnaBlocking,
bool? lnaBlockTrackers,
bool? lnaEnabled,
}) : ublockFilterListSettings =
ublockFilterListSettings ?? UBlockFilterListSettings(),
queryParameterStripping =
queryParameterStripping ?? QueryParameterStripping.enabled,
bounceTrackingProtectionMode =
bounceTrackingProtectionMode ?? BounceTrackingProtectionMode.enabled,
dohSettingsMode = dohSettingsMode ?? DohSettingsMode.increased,
dohProviderUrl = dohProviderUrl ?? BuiltInDohProviders.quad9.url,
dohDefaultProviderUrl =
dohDefaultProviderUrl ?? BuiltInDohProviders.quad9.url,
dohExceptionsList = dohExceptionsList ?? [],
enablePdfJs = enablePdfJs ?? true,
safeBrowsingMalwareEnabled = safeBrowsingMalwareEnabled ?? true,
safeBrowsingPhishingEnabled = safeBrowsingPhishingEnabled ?? true,
super(
javascriptEnabled: javascriptEnabled ?? true,
trackingProtectionPolicy:
trackingProtectionPolicy ?? TrackingProtectionPolicy.strict,
httpsOnlyMode: httpsOnlyMode ?? HttpsOnlyMode.enabled,
globalPrivacyControlEnabled: globalPrivacyControlEnabled ?? true,
preferredColorScheme: preferredColorScheme ?? ColorScheme.system,
cookieBannerHandlingMode:
cookieBannerHandlingMode ?? CookieBannerHandlingMode.rejectAll,
cookieBannerHandlingModePrivateBrowsing:
cookieBannerHandlingModePrivateBrowsing ??
CookieBannerHandlingMode.rejectAll,
cookieBannerHandlingGlobalRules:
cookieBannerHandlingGlobalRules ?? true,
cookieBannerHandlingGlobalRulesSubFrames:
cookieBannerHandlingGlobalRulesSubFrames ?? true,
webContentIsolationStrategy:
webContentIsolationStrategy ??
WebContentIsolationStrategy.isolateHighValue,
enterpriseRootsEnabled: enterpriseRootsEnabled ?? false,
fingerprintingProtectionOverrides:
fingerprintingProtectionOverrides ??
FingerprintOverrides.defaults().toString(),
locales:
locales ??
WidgetsBinding.instance.platformDispatcher.locales
.map((x) => x.toLanguageTag())
.toList(),
useContentBlockingDatabase: useContentBlockingDatabase ?? true,
blockCookies: blockCookies ?? true,
customCookiePolicy:
customCookiePolicy ?? CustomCookiePolicy.totalProtection,
blockTrackingContent: blockTrackingContent ?? true,
trackingContentScope: trackingContentScope ?? TrackingScope.all,
blockCryptominers: blockCryptominers ?? true,
blockFingerprinters: blockFingerprinters ?? true,
blockRedirectTrackers: blockRedirectTrackers ?? true,
blockSuspectedFingerprinters: blockSuspectedFingerprinters ?? true,
suspectedFingerprintersScope:
suspectedFingerprintersScope ?? TrackingScope.all,
allowListBaseline: allowListBaseline ?? true,
allowListConvenience: allowListConvenience ?? false,
blockAdsAnalyticsSocialTrackers:
blockAdsAnalyticsSocialTrackers ?? true,
webFontsEnabled: webFontsEnabled ?? true,
automaticFontSizeAdjustment: automaticFontSizeAdjustment ?? true,
fontSizeFactor: fontSizeFactor ?? 1.0,
fontInflationEnabled: fontInflationEnabled ?? false,
inputAutoZoomEnabled: inputAutoZoomEnabled ?? true,
forceUserScalableContent: forceUserScalableContent ?? false,
fissionEnabled: fissionEnabled ?? true,
isolatedProcessEnabled: isolatedProcessEnabled ?? false,
appZygoteProcessEnabled: appZygoteProcessEnabled ?? false,
extensionsWebAPIEnabled: extensionsWebAPIEnabled ?? true,
lnaBlockTrackers: lnaBlockTrackers ?? true,
lnaEnabled: lnaEnabled ?? true,
);
static AddonCollection? _addonCollectionFromJson(String? json) =>
json.mapNotNull(
(collection) => AddonCollection.decode(jsonDecode(collection) as List),
);
static String? _addonCollectionToJson(AddonCollection? collection) =>
collection.mapNotNull((collection) => jsonEncode(collection.encode()));
static UBlockFilterListSettings _ublockFilterListSettingsFromJson(
String? json,
) =>
json.mapNotNull(
(encoded) => UBlockFilterListSettings.fromJson(
jsonDecode(encoded) as Map<String, dynamic>,
),
) ??
UBlockFilterListSettings();
static String _ublockFilterListSettingsToJson(
UBlockFilterListSettings settings,
) => jsonEncode(settings.toJson());
factory EngineSettings.fromJson(Map<String, dynamic> json) =>
_$EngineSettingsFromJson(json);
Map<String, dynamic> toJson() => _$EngineSettingsToJson(this);
@override
List<Object?> get hashParameters => [
javascriptEnabled,
trackingProtectionPolicy,
httpsOnlyMode,
globalPrivacyControlEnabled,
preferredColorScheme,
cookieBannerHandlingMode,
cookieBannerHandlingModePrivateBrowsing,
cookieBannerHandlingGlobalRules,
cookieBannerHandlingGlobalRulesSubFrames,
webContentIsolationStrategy,
userAgent,
enterpriseRootsEnabled,
queryParameterStripping,
bounceTrackingProtectionMode,
addonCollection,
ublockFilterListSettings,
dohSettingsMode,
dohProviderUrl,
dohDefaultProviderUrl,
dohExceptionsList,
fingerprintingProtectionOverrides,
enablePdfJs,
safeBrowsingMalwareEnabled,
safeBrowsingPhishingEnabled,
locales,
useContentBlockingDatabase,
blockCookies,
customCookiePolicy,
blockTrackingContent,
trackingContentScope,
blockCryptominers,
blockFingerprinters,
blockRedirectTrackers,
blockSuspectedFingerprinters,
suspectedFingerprintersScope,
allowListBaseline,
allowListConvenience,
blockAdsAnalyticsSocialTrackers,
webFontsEnabled,
automaticFontSizeAdjustment,
fontSizeFactor,
fontInflationEnabled,
displayDensityOverride,
screenWidthOverride,
screenHeightOverride,
inputAutoZoomEnabled,
forceUserScalableContent,
fissionEnabled,
isolatedProcessEnabled,
appZygoteProcessEnabled,
extensionsWebAPIEnabled,
lnaBlocking,
lnaBlockTrackers,
lnaEnabled,
];
}