diff --git a/app/assets/preferences/settings.json b/app/assets/preferences/settings.json index 784cea6b..451f7a72 100644 --- a/app/assets/preferences/settings.json +++ b/app/assets/preferences/settings.json @@ -1106,11 +1106,6 @@ "title": "Disable add-on metadata cache updates", "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": { "value": false, "title": "Never bypass extension install prompts", diff --git a/app/lib/features/settings/presentation/screens/privacy_security_settings.dart b/app/lib/features/settings/presentation/screens/privacy_security_settings.dart index 173c88fe..f0553d34 100644 --- a/app/lib/features/settings/presentation/screens/privacy_security_settings.dart +++ b/app/lib/features/settings/presentation/screens/privacy_security_settings.dart @@ -206,6 +206,7 @@ class _AdvancedSection extends StatelessWidget { _FissionEnabledTile(), _IsolatedProcessEnabledTile(), _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 _showRestartDialog(BuildContext context, WidgetRef ref) async { final result = await showQuitBrowserDialog(context); if (result == true && context.mounted) { diff --git a/app/lib/features/user/data/models/engine_settings.dart b/app/lib/features/user/data/models/engine_settings.dart index 5caf8221..e8aec7aa 100644 --- a/app/lib/features/user/data/models/engine_settings.dart +++ b/app/lib/features/user/data/models/engine_settings.dart @@ -123,6 +123,8 @@ class EngineSettings extends GeckoEngineSettings with FastEquatable { bool get isolatedProcessEnabled => super.isolatedProcessEnabled!; @override bool get appZygoteProcessEnabled => super.appZygoteProcessEnabled!; + @override + bool get extensionsWebAPIEnabled => super.extensionsWebAPIEnabled!; final QueryParameterStripping queryParameterStripping; @@ -202,6 +204,7 @@ class EngineSettings extends GeckoEngineSettings with FastEquatable { required super.fissionEnabled, required super.isolatedProcessEnabled, required super.appZygoteProcessEnabled, + required super.extensionsWebAPIEnabled, required super.lnaBlocking, required super.lnaBlockTrackers, required super.lnaEnabled, @@ -252,6 +255,7 @@ class EngineSettings extends GeckoEngineSettings with FastEquatable { bool? fissionEnabled, bool? isolatedProcessEnabled, bool? appZygoteProcessEnabled, + bool? extensionsWebAPIEnabled, bool? lnaBlocking, bool? lnaBlockTrackers, bool? lnaEnabled, @@ -317,6 +321,7 @@ class EngineSettings extends GeckoEngineSettings with FastEquatable { fissionEnabled: fissionEnabled ?? true, isolatedProcessEnabled: isolatedProcessEnabled ?? false, appZygoteProcessEnabled: appZygoteProcessEnabled ?? false, + extensionsWebAPIEnabled: extensionsWebAPIEnabled ?? true, lnaBlocking: lnaBlocking, lnaBlockTrackers: lnaBlockTrackers, lnaEnabled: lnaEnabled, @@ -381,6 +386,7 @@ class EngineSettings extends GeckoEngineSettings with FastEquatable { fissionEnabled, isolatedProcessEnabled, appZygoteProcessEnabled, + extensionsWebAPIEnabled, lnaBlocking, lnaBlockTrackers, lnaEnabled, diff --git a/app/lib/features/user/data/models/engine_settings.g.dart b/app/lib/features/user/data/models/engine_settings.g.dart index a0f9c3ed..6d826579 100644 --- a/app/lib/features/user/data/models/engine_settings.g.dart +++ b/app/lib/features/user/data/models/engine_settings.g.dart @@ -117,6 +117,8 @@ abstract class _$EngineSettingsCWProxy { EngineSettings appZygoteProcessEnabled(bool? appZygoteProcessEnabled); + EngineSettings extensionsWebAPIEnabled(bool? extensionsWebAPIEnabled); + EngineSettings lnaBlocking(bool? lnaBlocking); EngineSettings lnaBlockTrackers(bool? lnaBlockTrackers); @@ -175,6 +177,7 @@ abstract class _$EngineSettingsCWProxy { bool? fissionEnabled, bool? isolatedProcessEnabled, bool? appZygoteProcessEnabled, + bool? extensionsWebAPIEnabled, bool? lnaBlocking, bool? lnaBlockTrackers, bool? lnaEnabled, @@ -383,6 +386,10 @@ class _$EngineSettingsCWProxyImpl implements _$EngineSettingsCWProxy { EngineSettings appZygoteProcessEnabled(bool? appZygoteProcessEnabled) => call(appZygoteProcessEnabled: appZygoteProcessEnabled); + @override + EngineSettings extensionsWebAPIEnabled(bool? extensionsWebAPIEnabled) => + call(extensionsWebAPIEnabled: extensionsWebAPIEnabled); + @override EngineSettings lnaBlocking(bool? lnaBlocking) => call(lnaBlocking: lnaBlocking); @@ -449,6 +456,7 @@ class _$EngineSettingsCWProxyImpl implements _$EngineSettingsCWProxy { Object? fissionEnabled = const $CopyWithPlaceholder(), Object? isolatedProcessEnabled = const $CopyWithPlaceholder(), Object? appZygoteProcessEnabled = const $CopyWithPlaceholder(), + Object? extensionsWebAPIEnabled = const $CopyWithPlaceholder(), Object? lnaBlocking = const $CopyWithPlaceholder(), Object? lnaBlockTrackers = const $CopyWithPlaceholder(), Object? lnaEnabled = const $CopyWithPlaceholder(), @@ -662,6 +670,11 @@ class _$EngineSettingsCWProxyImpl implements _$EngineSettingsCWProxy { ? _value.appZygoteProcessEnabled // ignore: cast_nullable_to_non_nullable : appZygoteProcessEnabled as bool?, + extensionsWebAPIEnabled: + extensionsWebAPIEnabled == const $CopyWithPlaceholder() + ? _value.extensionsWebAPIEnabled + // ignore: cast_nullable_to_non_nullable + : extensionsWebAPIEnabled as bool?, lnaBlocking: lnaBlocking == const $CopyWithPlaceholder() ? _value.lnaBlocking // ignore: cast_nullable_to_non_nullable @@ -781,6 +794,7 @@ EngineSettings _$EngineSettingsFromJson( fissionEnabled: json['fissionEnabled'] as bool?, isolatedProcessEnabled: json['isolatedProcessEnabled'] as bool?, appZygoteProcessEnabled: json['appZygoteProcessEnabled'] as bool?, + extensionsWebAPIEnabled: json['extensionsWebAPIEnabled'] as bool?, lnaBlocking: json['lnaBlocking'] as bool?, lnaBlockTrackers: json['lnaBlockTrackers'] as bool?, lnaEnabled: json['lnaEnabled'] as bool?, @@ -839,6 +853,7 @@ Map _$EngineSettingsToJson( 'fissionEnabled': instance.fissionEnabled, 'isolatedProcessEnabled': instance.isolatedProcessEnabled, 'appZygoteProcessEnabled': instance.appZygoteProcessEnabled, + 'extensionsWebAPIEnabled': instance.extensionsWebAPIEnabled, 'queryParameterStripping': _$QueryParameterStrippingEnumMap[instance.queryParameterStripping]!, 'bounceTrackingProtectionMode': diff --git a/app/lib/features/user/domain/repositories/engine_settings.dart b/app/lib/features/user/domain/repositories/engine_settings.dart index f678b4a6..871fbd8b 100644 --- a/app/lib/features/user/domain/repositories/engine_settings.dart +++ b/app/lib/features/user/domain/repositories/engine_settings.dart @@ -212,6 +212,10 @@ class EngineSettingsRepository extends _$EngineSettingsRepository { DriftSqlType.bool, db.typeMapping, ), + 'extensionsWebAPIEnabled': settings['extensionsWebAPIEnabled']?.readAs( + DriftSqlType.bool, + db.typeMapping, + ), // LNA Settings 'lnaBlocking': settings['lnaBlocking']?.readAs( DriftSqlType.bool, diff --git a/app/lib/features/user/domain/repositories/engine_settings.g.dart b/app/lib/features/user/domain/repositories/engine_settings.g.dart index 405f9ffc..165c466f 100644 --- a/app/lib/features/user/domain/repositories/engine_settings.g.dart +++ b/app/lib/features/user/domain/repositories/engine_settings.g.dart @@ -34,7 +34,7 @@ final class EngineSettingsRepositoryProvider } String _$engineSettingsRepositoryHash() => - r'3d062d316bfcb86f3216846ed2cf5edd148460eb'; + r'4abe41cfeba8e39484683033f11c54be644fa2b2'; abstract class _$EngineSettingsRepository extends $StreamNotifier { diff --git a/packages/flutter_mozilla_components/android/src/main/kotlin/eu/weblibre/flutter_mozilla_components/EngineProvider.kt b/packages/flutter_mozilla_components/android/src/main/kotlin/eu/weblibre/flutter_mozilla_components/EngineProvider.kt index 8173f45f..ac6764a6 100644 --- a/packages/flutter_mozilla_components/android/src/main/kotlin/eu/weblibre/flutter_mozilla_components/EngineProvider.kt +++ b/packages/flutter_mozilla_components/android/src/main/kotlin/eu/weblibre/flutter_mozilla_components/EngineProvider.kt @@ -85,7 +85,7 @@ object EngineProvider { // About config it's no longer enabled by default builder.aboutConfigEnabled(true) builder.extensionsProcessEnabled(true) - builder.extensionsWebAPIEnabled(false) + builder.extensionsWebAPIEnabled(true) //builder.debugLogging(components.logLevel == Log.Priority.DEBUG) builder.consoleOutput(components.logLevel == Log.Priority.DEBUG) builder.contentBlocking(contentBlocking.build()) @@ -96,6 +96,7 @@ object EngineProvider { settings.fissionEnabled?.let { builder.fissionEnabled(it) } settings.isolatedProcessEnabled?.let { builder.isolatedProcessEnabled(it) } settings.appZygoteProcessEnabled?.let { builder.appZygoteProcessEnabled(it) } + settings.extensionsWebAPIEnabled?.let { builder.extensionsWebAPIEnabled(it) } settings.displayDensityOverride?.let { builder.displayDensityOverride(it.toFloat()) } val screenWidth = settings.screenWidthOverride val screenHeight = settings.screenHeightOverride diff --git a/packages/flutter_mozilla_components/android/src/main/kotlin/eu/weblibre/flutter_mozilla_components/pigeons/Gecko.g.kt b/packages/flutter_mozilla_components/android/src/main/kotlin/eu/weblibre/flutter_mozilla_components/pigeons/Gecko.g.kt index f7f039f3..edef1515 100644 --- a/packages/flutter_mozilla_components/android/src/main/kotlin/eu/weblibre/flutter_mozilla_components/pigeons/Gecko.g.kt +++ b/packages/flutter_mozilla_components/android/src/main/kotlin/eu/weblibre/flutter_mozilla_components/pigeons/Gecko.g.kt @@ -2303,6 +2303,7 @@ data class GeckoEngineSettings ( val fissionEnabled: Boolean? = null, val isolatedProcessEnabled: Boolean? = null, val appZygoteProcessEnabled: Boolean? = null, + val extensionsWebAPIEnabled: Boolean? = null, val lnaBlocking: Boolean? = null, val lnaBlockTrackers: Boolean? = null, val lnaEnabled: Boolean? = null @@ -2348,10 +2349,11 @@ data class GeckoEngineSettings ( val fissionEnabled = pigeonVar_list[35] as Boolean? val isolatedProcessEnabled = pigeonVar_list[36] as Boolean? val appZygoteProcessEnabled = pigeonVar_list[37] as Boolean? - val lnaBlocking = pigeonVar_list[38] as Boolean? - val lnaBlockTrackers = pigeonVar_list[39] as Boolean? - val lnaEnabled = 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 extensionsWebAPIEnabled = pigeonVar_list[38] as Boolean? + val lnaBlocking = pigeonVar_list[39] as Boolean? + val lnaBlockTrackers = pigeonVar_list[40] as Boolean? + 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 { @@ -2394,6 +2396,7 @@ data class GeckoEngineSettings ( fissionEnabled, isolatedProcessEnabled, appZygoteProcessEnabled, + extensionsWebAPIEnabled, lnaBlocking, lnaBlockTrackers, lnaEnabled, diff --git a/packages/flutter_mozilla_components/lib/src/pigeons/gecko.g.dart b/packages/flutter_mozilla_components/lib/src/pigeons/gecko.g.dart index b350bcad..2c34de50 100644 --- a/packages/flutter_mozilla_components/lib/src/pigeons/gecko.g.dart +++ b/packages/flutter_mozilla_components/lib/src/pigeons/gecko.g.dart @@ -2721,6 +2721,7 @@ class GeckoEngineSettings { this.fissionEnabled, this.isolatedProcessEnabled, this.appZygoteProcessEnabled, + this.extensionsWebAPIEnabled, this.lnaBlocking, this.lnaBlockTrackers, this.lnaEnabled, @@ -2814,6 +2815,8 @@ class GeckoEngineSettings { bool? appZygoteProcessEnabled; + bool? extensionsWebAPIEnabled; + bool? lnaBlocking; bool? lnaBlockTrackers; @@ -2860,6 +2863,7 @@ class GeckoEngineSettings { fissionEnabled, isolatedProcessEnabled, appZygoteProcessEnabled, + extensionsWebAPIEnabled, lnaBlocking, lnaBlockTrackers, lnaEnabled, @@ -2910,9 +2914,10 @@ class GeckoEngineSettings { fissionEnabled: result[35] as bool?, isolatedProcessEnabled: result[36] as bool?, appZygoteProcessEnabled: result[37] as bool?, - lnaBlocking: result[38] as bool?, - lnaBlockTrackers: result[39] as bool?, - lnaEnabled: result[40] as bool?, + extensionsWebAPIEnabled: result[38] as bool?, + lnaBlocking: result[39] as bool?, + lnaBlockTrackers: result[40] as bool?, + lnaEnabled: result[41] as bool?, ); } diff --git a/packages/flutter_mozilla_components/pigeons/gecko.dart b/packages/flutter_mozilla_components/pigeons/gecko.dart index 611f5526..67d44558 100644 --- a/packages/flutter_mozilla_components/pigeons/gecko.dart +++ b/packages/flutter_mozilla_components/pigeons/gecko.dart @@ -892,6 +892,7 @@ class GeckoEngineSettings { final bool? fissionEnabled; final bool? isolatedProcessEnabled; final bool? appZygoteProcessEnabled; + final bool? extensionsWebAPIEnabled; // Local Network Access (LNA) Settings final bool? lnaBlocking; @@ -937,6 +938,7 @@ class GeckoEngineSettings { this.fissionEnabled, this.isolatedProcessEnabled, this.appZygoteProcessEnabled, + this.extensionsWebAPIEnabled, this.lnaBlocking, this.lnaBlockTrackers, this.lnaEnabled,