add setting to control mozAddonManager API

This commit is contained in:
Fabian Freund
2026-03-11 13:06:23 +01:00
parent 05e68c1dab
commit c189987339
10 changed files with 79 additions and 14 deletions
-5
View File
@@ -1106,11 +1106,6 @@
"title": "Disable add-on metadata cache updates", "title": "Disable add-on metadata cache updates",
"description": "Reduces background refreshes of extension metadata" "description": "Reduces background refreshes of extension metadata"
}, },
"privacy.resistFingerprinting.block_mozAddonManager": {
"value": true,
"title": "Block mozAddonManager exposure",
"description": "Prevents websites from querying installed add-ons through this legacy API"
},
"extensions.postDownloadThirdPartyPrompt": { "extensions.postDownloadThirdPartyPrompt": {
"value": false, "value": false,
"title": "Never bypass extension install prompts", "title": "Never bypass extension install prompts",
@@ -206,6 +206,7 @@ class _AdvancedSection extends StatelessWidget {
_FissionEnabledTile(), _FissionEnabledTile(),
_IsolatedProcessEnabledTile(), _IsolatedProcessEnabledTile(),
_AppZygoteProcessEnabledTile(), _AppZygoteProcessEnabledTile(),
_ExtensionsWebAPIEnabledTile(),
], ],
); );
} }
@@ -839,6 +840,39 @@ class _AppZygoteProcessEnabledTile extends HookConsumerWidget {
} }
} }
class _ExtensionsWebAPIEnabledTile extends HookConsumerWidget {
const _ExtensionsWebAPIEnabledTile();
@override
Widget build(BuildContext context, WidgetRef ref) {
final extensionsWebAPIEnabled = ref.watch(
engineSettingsWithDefaultsProvider.select(
(s) => s.extensionsWebAPIEnabled,
),
);
return SwitchListTile.adaptive(
title: const Text('Extensions Web API'),
subtitle: const Text(
'Enable mozAddonManager API exposure for web content and extension pages. Requires app restart.',
),
secondary: const Icon(Icons.extension),
value: extensionsWebAPIEnabled,
onChanged: (value) async {
await ref
.read(saveEngineSettingsControllerProvider.notifier)
.save(
(currentSettings) =>
currentSettings.copyWith.extensionsWebAPIEnabled(value),
);
if (context.mounted) {
await _showRestartDialog(context, ref);
}
},
);
}
}
Future<void> _showRestartDialog(BuildContext context, WidgetRef ref) async { Future<void> _showRestartDialog(BuildContext context, WidgetRef ref) async {
final result = await showQuitBrowserDialog(context); final result = await showQuitBrowserDialog(context);
if (result == true && context.mounted) { if (result == true && context.mounted) {
@@ -123,6 +123,8 @@ class EngineSettings extends GeckoEngineSettings with FastEquatable {
bool get isolatedProcessEnabled => super.isolatedProcessEnabled!; bool get isolatedProcessEnabled => super.isolatedProcessEnabled!;
@override @override
bool get appZygoteProcessEnabled => super.appZygoteProcessEnabled!; bool get appZygoteProcessEnabled => super.appZygoteProcessEnabled!;
@override
bool get extensionsWebAPIEnabled => super.extensionsWebAPIEnabled!;
final QueryParameterStripping queryParameterStripping; final QueryParameterStripping queryParameterStripping;
@@ -202,6 +204,7 @@ class EngineSettings extends GeckoEngineSettings with FastEquatable {
required super.fissionEnabled, required super.fissionEnabled,
required super.isolatedProcessEnabled, required super.isolatedProcessEnabled,
required super.appZygoteProcessEnabled, required super.appZygoteProcessEnabled,
required super.extensionsWebAPIEnabled,
required super.lnaBlocking, required super.lnaBlocking,
required super.lnaBlockTrackers, required super.lnaBlockTrackers,
required super.lnaEnabled, required super.lnaEnabled,
@@ -252,6 +255,7 @@ class EngineSettings extends GeckoEngineSettings with FastEquatable {
bool? fissionEnabled, bool? fissionEnabled,
bool? isolatedProcessEnabled, bool? isolatedProcessEnabled,
bool? appZygoteProcessEnabled, bool? appZygoteProcessEnabled,
bool? extensionsWebAPIEnabled,
bool? lnaBlocking, bool? lnaBlocking,
bool? lnaBlockTrackers, bool? lnaBlockTrackers,
bool? lnaEnabled, bool? lnaEnabled,
@@ -317,6 +321,7 @@ class EngineSettings extends GeckoEngineSettings with FastEquatable {
fissionEnabled: fissionEnabled ?? true, fissionEnabled: fissionEnabled ?? true,
isolatedProcessEnabled: isolatedProcessEnabled ?? false, isolatedProcessEnabled: isolatedProcessEnabled ?? false,
appZygoteProcessEnabled: appZygoteProcessEnabled ?? false, appZygoteProcessEnabled: appZygoteProcessEnabled ?? false,
extensionsWebAPIEnabled: extensionsWebAPIEnabled ?? true,
lnaBlocking: lnaBlocking, lnaBlocking: lnaBlocking,
lnaBlockTrackers: lnaBlockTrackers, lnaBlockTrackers: lnaBlockTrackers,
lnaEnabled: lnaEnabled, lnaEnabled: lnaEnabled,
@@ -381,6 +386,7 @@ class EngineSettings extends GeckoEngineSettings with FastEquatable {
fissionEnabled, fissionEnabled,
isolatedProcessEnabled, isolatedProcessEnabled,
appZygoteProcessEnabled, appZygoteProcessEnabled,
extensionsWebAPIEnabled,
lnaBlocking, lnaBlocking,
lnaBlockTrackers, lnaBlockTrackers,
lnaEnabled, lnaEnabled,
@@ -117,6 +117,8 @@ abstract class _$EngineSettingsCWProxy {
EngineSettings appZygoteProcessEnabled(bool? appZygoteProcessEnabled); EngineSettings appZygoteProcessEnabled(bool? appZygoteProcessEnabled);
EngineSettings extensionsWebAPIEnabled(bool? extensionsWebAPIEnabled);
EngineSettings lnaBlocking(bool? lnaBlocking); EngineSettings lnaBlocking(bool? lnaBlocking);
EngineSettings lnaBlockTrackers(bool? lnaBlockTrackers); EngineSettings lnaBlockTrackers(bool? lnaBlockTrackers);
@@ -175,6 +177,7 @@ abstract class _$EngineSettingsCWProxy {
bool? fissionEnabled, bool? fissionEnabled,
bool? isolatedProcessEnabled, bool? isolatedProcessEnabled,
bool? appZygoteProcessEnabled, bool? appZygoteProcessEnabled,
bool? extensionsWebAPIEnabled,
bool? lnaBlocking, bool? lnaBlocking,
bool? lnaBlockTrackers, bool? lnaBlockTrackers,
bool? lnaEnabled, bool? lnaEnabled,
@@ -383,6 +386,10 @@ class _$EngineSettingsCWProxyImpl implements _$EngineSettingsCWProxy {
EngineSettings appZygoteProcessEnabled(bool? appZygoteProcessEnabled) => EngineSettings appZygoteProcessEnabled(bool? appZygoteProcessEnabled) =>
call(appZygoteProcessEnabled: appZygoteProcessEnabled); call(appZygoteProcessEnabled: appZygoteProcessEnabled);
@override
EngineSettings extensionsWebAPIEnabled(bool? extensionsWebAPIEnabled) =>
call(extensionsWebAPIEnabled: extensionsWebAPIEnabled);
@override @override
EngineSettings lnaBlocking(bool? lnaBlocking) => EngineSettings lnaBlocking(bool? lnaBlocking) =>
call(lnaBlocking: lnaBlocking); call(lnaBlocking: lnaBlocking);
@@ -449,6 +456,7 @@ class _$EngineSettingsCWProxyImpl implements _$EngineSettingsCWProxy {
Object? fissionEnabled = const $CopyWithPlaceholder(), Object? fissionEnabled = const $CopyWithPlaceholder(),
Object? isolatedProcessEnabled = const $CopyWithPlaceholder(), Object? isolatedProcessEnabled = const $CopyWithPlaceholder(),
Object? appZygoteProcessEnabled = const $CopyWithPlaceholder(), Object? appZygoteProcessEnabled = const $CopyWithPlaceholder(),
Object? extensionsWebAPIEnabled = const $CopyWithPlaceholder(),
Object? lnaBlocking = const $CopyWithPlaceholder(), Object? lnaBlocking = const $CopyWithPlaceholder(),
Object? lnaBlockTrackers = const $CopyWithPlaceholder(), Object? lnaBlockTrackers = const $CopyWithPlaceholder(),
Object? lnaEnabled = const $CopyWithPlaceholder(), Object? lnaEnabled = const $CopyWithPlaceholder(),
@@ -662,6 +670,11 @@ class _$EngineSettingsCWProxyImpl implements _$EngineSettingsCWProxy {
? _value.appZygoteProcessEnabled ? _value.appZygoteProcessEnabled
// ignore: cast_nullable_to_non_nullable // ignore: cast_nullable_to_non_nullable
: appZygoteProcessEnabled as bool?, : appZygoteProcessEnabled as bool?,
extensionsWebAPIEnabled:
extensionsWebAPIEnabled == const $CopyWithPlaceholder()
? _value.extensionsWebAPIEnabled
// ignore: cast_nullable_to_non_nullable
: extensionsWebAPIEnabled as bool?,
lnaBlocking: lnaBlocking == const $CopyWithPlaceholder() lnaBlocking: lnaBlocking == const $CopyWithPlaceholder()
? _value.lnaBlocking ? _value.lnaBlocking
// ignore: cast_nullable_to_non_nullable // ignore: cast_nullable_to_non_nullable
@@ -781,6 +794,7 @@ EngineSettings _$EngineSettingsFromJson(
fissionEnabled: json['fissionEnabled'] as bool?, fissionEnabled: json['fissionEnabled'] as bool?,
isolatedProcessEnabled: json['isolatedProcessEnabled'] as bool?, isolatedProcessEnabled: json['isolatedProcessEnabled'] as bool?,
appZygoteProcessEnabled: json['appZygoteProcessEnabled'] as bool?, appZygoteProcessEnabled: json['appZygoteProcessEnabled'] as bool?,
extensionsWebAPIEnabled: json['extensionsWebAPIEnabled'] as bool?,
lnaBlocking: json['lnaBlocking'] as bool?, lnaBlocking: json['lnaBlocking'] as bool?,
lnaBlockTrackers: json['lnaBlockTrackers'] as bool?, lnaBlockTrackers: json['lnaBlockTrackers'] as bool?,
lnaEnabled: json['lnaEnabled'] as bool?, lnaEnabled: json['lnaEnabled'] as bool?,
@@ -839,6 +853,7 @@ Map<String, dynamic> _$EngineSettingsToJson(
'fissionEnabled': instance.fissionEnabled, 'fissionEnabled': instance.fissionEnabled,
'isolatedProcessEnabled': instance.isolatedProcessEnabled, 'isolatedProcessEnabled': instance.isolatedProcessEnabled,
'appZygoteProcessEnabled': instance.appZygoteProcessEnabled, 'appZygoteProcessEnabled': instance.appZygoteProcessEnabled,
'extensionsWebAPIEnabled': instance.extensionsWebAPIEnabled,
'queryParameterStripping': 'queryParameterStripping':
_$QueryParameterStrippingEnumMap[instance.queryParameterStripping]!, _$QueryParameterStrippingEnumMap[instance.queryParameterStripping]!,
'bounceTrackingProtectionMode': 'bounceTrackingProtectionMode':
@@ -212,6 +212,10 @@ class EngineSettingsRepository extends _$EngineSettingsRepository {
DriftSqlType.bool, DriftSqlType.bool,
db.typeMapping, db.typeMapping,
), ),
'extensionsWebAPIEnabled': settings['extensionsWebAPIEnabled']?.readAs(
DriftSqlType.bool,
db.typeMapping,
),
// LNA Settings // LNA Settings
'lnaBlocking': settings['lnaBlocking']?.readAs( 'lnaBlocking': settings['lnaBlocking']?.readAs(
DriftSqlType.bool, DriftSqlType.bool,
@@ -34,7 +34,7 @@ final class EngineSettingsRepositoryProvider
} }
String _$engineSettingsRepositoryHash() => String _$engineSettingsRepositoryHash() =>
r'3d062d316bfcb86f3216846ed2cf5edd148460eb'; r'4abe41cfeba8e39484683033f11c54be644fa2b2';
abstract class _$EngineSettingsRepository abstract class _$EngineSettingsRepository
extends $StreamNotifier<EngineSettings> { extends $StreamNotifier<EngineSettings> {
@@ -85,7 +85,7 @@ object EngineProvider {
// About config it's no longer enabled by default // About config it's no longer enabled by default
builder.aboutConfigEnabled(true) builder.aboutConfigEnabled(true)
builder.extensionsProcessEnabled(true) builder.extensionsProcessEnabled(true)
builder.extensionsWebAPIEnabled(false) builder.extensionsWebAPIEnabled(true)
//builder.debugLogging(components.logLevel == Log.Priority.DEBUG) //builder.debugLogging(components.logLevel == Log.Priority.DEBUG)
builder.consoleOutput(components.logLevel == Log.Priority.DEBUG) builder.consoleOutput(components.logLevel == Log.Priority.DEBUG)
builder.contentBlocking(contentBlocking.build()) builder.contentBlocking(contentBlocking.build())
@@ -96,6 +96,7 @@ object EngineProvider {
settings.fissionEnabled?.let { builder.fissionEnabled(it) } settings.fissionEnabled?.let { builder.fissionEnabled(it) }
settings.isolatedProcessEnabled?.let { builder.isolatedProcessEnabled(it) } settings.isolatedProcessEnabled?.let { builder.isolatedProcessEnabled(it) }
settings.appZygoteProcessEnabled?.let { builder.appZygoteProcessEnabled(it) } settings.appZygoteProcessEnabled?.let { builder.appZygoteProcessEnabled(it) }
settings.extensionsWebAPIEnabled?.let { builder.extensionsWebAPIEnabled(it) }
settings.displayDensityOverride?.let { builder.displayDensityOverride(it.toFloat()) } settings.displayDensityOverride?.let { builder.displayDensityOverride(it.toFloat()) }
val screenWidth = settings.screenWidthOverride val screenWidth = settings.screenWidthOverride
val screenHeight = settings.screenHeightOverride val screenHeight = settings.screenHeightOverride
@@ -2303,6 +2303,7 @@ data class GeckoEngineSettings (
val fissionEnabled: Boolean? = null, val fissionEnabled: Boolean? = null,
val isolatedProcessEnabled: Boolean? = null, val isolatedProcessEnabled: Boolean? = null,
val appZygoteProcessEnabled: Boolean? = null, val appZygoteProcessEnabled: Boolean? = null,
val extensionsWebAPIEnabled: Boolean? = null,
val lnaBlocking: Boolean? = null, val lnaBlocking: Boolean? = null,
val lnaBlockTrackers: Boolean? = null, val lnaBlockTrackers: Boolean? = null,
val lnaEnabled: Boolean? = null val lnaEnabled: Boolean? = null
@@ -2348,10 +2349,11 @@ data class GeckoEngineSettings (
val fissionEnabled = pigeonVar_list[35] as Boolean? val fissionEnabled = pigeonVar_list[35] as Boolean?
val isolatedProcessEnabled = pigeonVar_list[36] as Boolean? val isolatedProcessEnabled = pigeonVar_list[36] as Boolean?
val appZygoteProcessEnabled = pigeonVar_list[37] as Boolean? val appZygoteProcessEnabled = pigeonVar_list[37] as Boolean?
val lnaBlocking = pigeonVar_list[38] as Boolean? val extensionsWebAPIEnabled = pigeonVar_list[38] as Boolean?
val lnaBlockTrackers = pigeonVar_list[39] as Boolean? val lnaBlocking = pigeonVar_list[39] as Boolean?
val lnaEnabled = pigeonVar_list[40] as Boolean? val lnaBlockTrackers = pigeonVar_list[40] as Boolean?
return GeckoEngineSettings(javascriptEnabled, trackingProtectionPolicy, httpsOnlyMode, globalPrivacyControlEnabled, preferredColorScheme, cookieBannerHandlingMode, cookieBannerHandlingModePrivateBrowsing, cookieBannerHandlingGlobalRules, cookieBannerHandlingGlobalRulesSubFrames, webContentIsolationStrategy, userAgent, contentBlocking, enterpriseRootsEnabled, dohSettings, fingerprintingProtectionOverrides, locales, blockCookies, customCookiePolicy, blockTrackingContent, trackingContentScope, blockCryptominers, blockFingerprinters, blockRedirectTrackers, blockSuspectedFingerprinters, suspectedFingerprintersScope, allowListBaseline, allowListConvenience, webFontsEnabled, automaticFontSizeAdjustment, fontSizeFactor, fontInflationEnabled, displayDensityOverride, screenWidthOverride, screenHeightOverride, inputAutoZoomEnabled, fissionEnabled, isolatedProcessEnabled, appZygoteProcessEnabled, lnaBlocking, lnaBlockTrackers, lnaEnabled) val lnaEnabled = pigeonVar_list[41] as Boolean?
return GeckoEngineSettings(javascriptEnabled, trackingProtectionPolicy, httpsOnlyMode, globalPrivacyControlEnabled, preferredColorScheme, cookieBannerHandlingMode, cookieBannerHandlingModePrivateBrowsing, cookieBannerHandlingGlobalRules, cookieBannerHandlingGlobalRulesSubFrames, webContentIsolationStrategy, userAgent, contentBlocking, enterpriseRootsEnabled, dohSettings, fingerprintingProtectionOverrides, locales, blockCookies, customCookiePolicy, blockTrackingContent, trackingContentScope, blockCryptominers, blockFingerprinters, blockRedirectTrackers, blockSuspectedFingerprinters, suspectedFingerprintersScope, allowListBaseline, allowListConvenience, webFontsEnabled, automaticFontSizeAdjustment, fontSizeFactor, fontInflationEnabled, displayDensityOverride, screenWidthOverride, screenHeightOverride, inputAutoZoomEnabled, fissionEnabled, isolatedProcessEnabled, appZygoteProcessEnabled, extensionsWebAPIEnabled, lnaBlocking, lnaBlockTrackers, lnaEnabled)
} }
} }
fun toList(): List<Any?> { fun toList(): List<Any?> {
@@ -2394,6 +2396,7 @@ data class GeckoEngineSettings (
fissionEnabled, fissionEnabled,
isolatedProcessEnabled, isolatedProcessEnabled,
appZygoteProcessEnabled, appZygoteProcessEnabled,
extensionsWebAPIEnabled,
lnaBlocking, lnaBlocking,
lnaBlockTrackers, lnaBlockTrackers,
lnaEnabled, lnaEnabled,
@@ -2721,6 +2721,7 @@ class GeckoEngineSettings {
this.fissionEnabled, this.fissionEnabled,
this.isolatedProcessEnabled, this.isolatedProcessEnabled,
this.appZygoteProcessEnabled, this.appZygoteProcessEnabled,
this.extensionsWebAPIEnabled,
this.lnaBlocking, this.lnaBlocking,
this.lnaBlockTrackers, this.lnaBlockTrackers,
this.lnaEnabled, this.lnaEnabled,
@@ -2814,6 +2815,8 @@ class GeckoEngineSettings {
bool? appZygoteProcessEnabled; bool? appZygoteProcessEnabled;
bool? extensionsWebAPIEnabled;
bool? lnaBlocking; bool? lnaBlocking;
bool? lnaBlockTrackers; bool? lnaBlockTrackers;
@@ -2860,6 +2863,7 @@ class GeckoEngineSettings {
fissionEnabled, fissionEnabled,
isolatedProcessEnabled, isolatedProcessEnabled,
appZygoteProcessEnabled, appZygoteProcessEnabled,
extensionsWebAPIEnabled,
lnaBlocking, lnaBlocking,
lnaBlockTrackers, lnaBlockTrackers,
lnaEnabled, lnaEnabled,
@@ -2910,9 +2914,10 @@ class GeckoEngineSettings {
fissionEnabled: result[35] as bool?, fissionEnabled: result[35] as bool?,
isolatedProcessEnabled: result[36] as bool?, isolatedProcessEnabled: result[36] as bool?,
appZygoteProcessEnabled: result[37] as bool?, appZygoteProcessEnabled: result[37] as bool?,
lnaBlocking: result[38] as bool?, extensionsWebAPIEnabled: result[38] as bool?,
lnaBlockTrackers: result[39] as bool?, lnaBlocking: result[39] as bool?,
lnaEnabled: result[40] as bool?, lnaBlockTrackers: result[40] as bool?,
lnaEnabled: result[41] as bool?,
); );
} }
@@ -892,6 +892,7 @@ class GeckoEngineSettings {
final bool? fissionEnabled; final bool? fissionEnabled;
final bool? isolatedProcessEnabled; final bool? isolatedProcessEnabled;
final bool? appZygoteProcessEnabled; final bool? appZygoteProcessEnabled;
final bool? extensionsWebAPIEnabled;
// Local Network Access (LNA) Settings // Local Network Access (LNA) Settings
final bool? lnaBlocking; final bool? lnaBlocking;
@@ -937,6 +938,7 @@ class GeckoEngineSettings {
this.fissionEnabled, this.fissionEnabled,
this.isolatedProcessEnabled, this.isolatedProcessEnabled,
this.appZygoteProcessEnabled, this.appZygoteProcessEnabled,
this.extensionsWebAPIEnabled,
this.lnaBlocking, this.lnaBlocking,
this.lnaBlockTrackers, this.lnaBlockTrackers,
this.lnaEnabled, this.lnaEnabled,