diff --git a/apps/weblibre/lib/features/geckoview/features/browser/domain/services/engine_settings_replication.dart b/apps/weblibre/lib/features/geckoview/features/browser/domain/services/engine_settings_replication.dart index ac0445df..ea7af716 100644 --- a/apps/weblibre/lib/features/geckoview/features/browser/domain/services/engine_settings_replication.dart +++ b/apps/weblibre/lib/features/geckoview/features/browser/domain/services/engine_settings_replication.dart @@ -375,6 +375,12 @@ class EngineSettingsReplicationService settings.inputAutoZoomEnabled, ); } + if (previous.value?.forceUserScalableContent != + settings.forceUserScalableContent) { + await _service.forceUserScalableContent( + settings.forceUserScalableContent, + ); + } // LNA Settings if (previous.value?.lnaBlocking != settings.lnaBlocking) { await _service.lnaBlocking(settings.lnaBlocking); diff --git a/apps/weblibre/lib/features/geckoview/features/browser/domain/services/engine_settings_replication.g.dart b/apps/weblibre/lib/features/geckoview/features/browser/domain/services/engine_settings_replication.g.dart index 09ccf097..b49b85e8 100644 --- a/apps/weblibre/lib/features/geckoview/features/browser/domain/services/engine_settings_replication.g.dart +++ b/apps/weblibre/lib/features/geckoview/features/browser/domain/services/engine_settings_replication.g.dart @@ -44,7 +44,7 @@ final class EngineSettingsReplicationServiceProvider } String _$engineSettingsReplicationServiceHash() => - r'41c07a48bbc90a90dd6f5a0bd48d55a3e02a1b64'; + r'cceb6359fd11a1e570208615fde0e9cb5e5f7ba3'; abstract class _$EngineSettingsReplicationService extends $Notifier { void build(); diff --git a/apps/weblibre/lib/features/settings/presentation/screens/web_content_settings.dart b/apps/weblibre/lib/features/settings/presentation/screens/web_content_settings.dart index 0c2d3a58..7c477662 100644 --- a/apps/weblibre/lib/features/settings/presentation/screens/web_content_settings.dart +++ b/apps/weblibre/lib/features/settings/presentation/screens/web_content_settings.dart @@ -62,6 +62,14 @@ const List webContentSettingsSections = [ keywords: ['forms'], child: _InputAutoZoomEnabledTile(), ), + SettingsEntryDefinition( + title: 'Zoom on All Websites', + subtitle: + 'Allow pinch and zoom, even on websites that prevent this ' + 'gesture', + keywords: ['pinch', 'accessibility'], + child: _ForceUserScalableContentTile(), + ), ], ), SettingsSectionDefinition( @@ -308,6 +316,36 @@ class _InputAutoZoomEnabledTile extends HookConsumerWidget { } } +class _ForceUserScalableContentTile extends HookConsumerWidget { + const _ForceUserScalableContentTile(); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final forceUserScalableContent = ref.watch( + engineSettingsWithDefaultsProvider.select( + (s) => s.forceUserScalableContent, + ), + ); + + return SwitchListTile.adaptive( + title: const Text('Zoom on All Websites'), + subtitle: const Text( + 'Allow pinch and zoom, even on websites that prevent this gesture', + ), + secondary: const Icon(MdiIcons.gesturePinch), + value: forceUserScalableContent, + onChanged: (value) async { + await ref + .read(saveEngineSettingsControllerProvider.notifier) + .save( + (currentSettings) => + currentSettings.copyWith.forceUserScalableContent(value), + ); + }, + ); + } +} + class _PdfViewerTile extends HookConsumerWidget { const _PdfViewerTile(); diff --git a/apps/weblibre/lib/features/user/data/models/engine_settings.dart b/apps/weblibre/lib/features/user/data/models/engine_settings.dart index 0a181ee3..f1015a51 100644 --- a/apps/weblibre/lib/features/user/data/models/engine_settings.dart +++ b/apps/weblibre/lib/features/user/data/models/engine_settings.dart @@ -122,6 +122,8 @@ class EngineSettings extends GeckoEngineSettings with FastEquatable { bool get fontInflationEnabled => super.fontInflationEnabled!; @override bool get inputAutoZoomEnabled => super.inputAutoZoomEnabled!; + @override + bool get forceUserScalableContent => super.forceUserScalableContent!; // Process Isolation Settings (require app restart) @override @@ -223,6 +225,7 @@ class EngineSettings extends GeckoEngineSettings with FastEquatable { required super.screenWidthOverride, required super.screenHeightOverride, required super.inputAutoZoomEnabled, + required super.forceUserScalableContent, required super.fissionEnabled, required super.isolatedProcessEnabled, required super.appZygoteProcessEnabled, @@ -279,6 +282,7 @@ class EngineSettings extends GeckoEngineSettings with FastEquatable { super.screenWidthOverride, super.screenHeightOverride, bool? inputAutoZoomEnabled, + bool? forceUserScalableContent, bool? fissionEnabled, bool? isolatedProcessEnabled, bool? appZygoteProcessEnabled, @@ -349,6 +353,7 @@ class EngineSettings extends GeckoEngineSettings with FastEquatable { fontSizeFactor: fontSizeFactor ?? 1.0, fontInflationEnabled: fontInflationEnabled ?? false, inputAutoZoomEnabled: inputAutoZoomEnabled ?? true, + forceUserScalableContent: forceUserScalableContent ?? false, fissionEnabled: fissionEnabled ?? true, isolatedProcessEnabled: isolatedProcessEnabled ?? false, appZygoteProcessEnabled: appZygoteProcessEnabled ?? false, @@ -432,6 +437,7 @@ class EngineSettings extends GeckoEngineSettings with FastEquatable { screenWidthOverride, screenHeightOverride, inputAutoZoomEnabled, + forceUserScalableContent, fissionEnabled, isolatedProcessEnabled, appZygoteProcessEnabled, diff --git a/apps/weblibre/lib/features/user/data/models/engine_settings.g.dart b/apps/weblibre/lib/features/user/data/models/engine_settings.g.dart index 6c148c40..7c1cc3ed 100644 --- a/apps/weblibre/lib/features/user/data/models/engine_settings.g.dart +++ b/apps/weblibre/lib/features/user/data/models/engine_settings.g.dart @@ -125,6 +125,8 @@ abstract class _$EngineSettingsCWProxy { EngineSettings inputAutoZoomEnabled(bool? inputAutoZoomEnabled); + EngineSettings forceUserScalableContent(bool? forceUserScalableContent); + EngineSettings fissionEnabled(bool? fissionEnabled); EngineSettings isolatedProcessEnabled(bool? isolatedProcessEnabled); @@ -193,6 +195,7 @@ abstract class _$EngineSettingsCWProxy { int? screenWidthOverride, int? screenHeightOverride, bool? inputAutoZoomEnabled, + bool? forceUserScalableContent, bool? fissionEnabled, bool? isolatedProcessEnabled, bool? appZygoteProcessEnabled, @@ -416,6 +419,10 @@ class _$EngineSettingsCWProxyImpl implements _$EngineSettingsCWProxy { EngineSettings inputAutoZoomEnabled(bool? inputAutoZoomEnabled) => call(inputAutoZoomEnabled: inputAutoZoomEnabled); + @override + EngineSettings forceUserScalableContent(bool? forceUserScalableContent) => + call(forceUserScalableContent: forceUserScalableContent); + @override EngineSettings fissionEnabled(bool? fissionEnabled) => call(fissionEnabled: fissionEnabled); @@ -500,6 +507,7 @@ class _$EngineSettingsCWProxyImpl implements _$EngineSettingsCWProxy { Object? screenWidthOverride = const $CopyWithPlaceholder(), Object? screenHeightOverride = const $CopyWithPlaceholder(), Object? inputAutoZoomEnabled = const $CopyWithPlaceholder(), + Object? forceUserScalableContent = const $CopyWithPlaceholder(), Object? fissionEnabled = const $CopyWithPlaceholder(), Object? isolatedProcessEnabled = const $CopyWithPlaceholder(), Object? appZygoteProcessEnabled = const $CopyWithPlaceholder(), @@ -731,6 +739,11 @@ class _$EngineSettingsCWProxyImpl implements _$EngineSettingsCWProxy { ? _value.inputAutoZoomEnabled // ignore: cast_nullable_to_non_nullable : inputAutoZoomEnabled as bool?, + forceUserScalableContent: + forceUserScalableContent == const $CopyWithPlaceholder() + ? _value.forceUserScalableContent + // ignore: cast_nullable_to_non_nullable + : forceUserScalableContent as bool?, fissionEnabled: fissionEnabled == const $CopyWithPlaceholder() ? _value.fissionEnabled // ignore: cast_nullable_to_non_nullable @@ -874,6 +887,7 @@ EngineSettings _$EngineSettingsFromJson( screenWidthOverride: (json['screenWidthOverride'] as num?)?.toInt(), screenHeightOverride: (json['screenHeightOverride'] as num?)?.toInt(), inputAutoZoomEnabled: json['inputAutoZoomEnabled'] as bool?, + forceUserScalableContent: json['forceUserScalableContent'] as bool?, fissionEnabled: json['fissionEnabled'] as bool?, isolatedProcessEnabled: json['isolatedProcessEnabled'] as bool?, appZygoteProcessEnabled: json['appZygoteProcessEnabled'] as bool?, @@ -935,6 +949,7 @@ Map _$EngineSettingsToJson( 'fontSizeFactor': instance.fontSizeFactor, 'fontInflationEnabled': instance.fontInflationEnabled, 'inputAutoZoomEnabled': instance.inputAutoZoomEnabled, + 'forceUserScalableContent': instance.forceUserScalableContent, 'fissionEnabled': instance.fissionEnabled, 'isolatedProcessEnabled': instance.isolatedProcessEnabled, 'appZygoteProcessEnabled': instance.appZygoteProcessEnabled, diff --git a/apps/weblibre/lib/features/user/domain/repositories/engine_settings.dart b/apps/weblibre/lib/features/user/domain/repositories/engine_settings.dart index 9ab6dcb1..1443f9a0 100644 --- a/apps/weblibre/lib/features/user/domain/repositories/engine_settings.dart +++ b/apps/weblibre/lib/features/user/domain/repositories/engine_settings.dart @@ -214,6 +214,8 @@ class EngineSettingsRepository extends _$EngineSettingsRepository { DriftSqlType.bool, db.typeMapping, ), + 'forceUserScalableContent': settings['forceUserScalableContent'] + ?.readAs(DriftSqlType.bool, db.typeMapping), // Process Isolation Settings 'fissionEnabled': settings['fissionEnabled']?.readAs( DriftSqlType.bool, diff --git a/apps/weblibre/lib/features/user/domain/repositories/engine_settings.g.dart b/apps/weblibre/lib/features/user/domain/repositories/engine_settings.g.dart index 152f36fa..90ff941b 100644 --- a/apps/weblibre/lib/features/user/domain/repositories/engine_settings.g.dart +++ b/apps/weblibre/lib/features/user/domain/repositories/engine_settings.g.dart @@ -34,7 +34,7 @@ final class EngineSettingsRepositoryProvider } String _$engineSettingsRepositoryHash() => - r'db077d5aa6a7aec5cdb019308cc942079567bab9'; + r'1442aa09d8f77bacaed9265e59c16dc555c74b16'; abstract class _$EngineSettingsRepository extends $StreamNotifier { diff --git a/packages/flutter_mozilla_components/android/src/main/kotlin/eu/weblibre/flutter_mozilla_components/api/GeckoEngineSettingsApiImpl.kt b/packages/flutter_mozilla_components/android/src/main/kotlin/eu/weblibre/flutter_mozilla_components/api/GeckoEngineSettingsApiImpl.kt index 53261c3e..7070026a 100644 --- a/packages/flutter_mozilla_components/android/src/main/kotlin/eu/weblibre/flutter_mozilla_components/api/GeckoEngineSettingsApiImpl.kt +++ b/packages/flutter_mozilla_components/android/src/main/kotlin/eu/weblibre/flutter_mozilla_components/api/GeckoEngineSettingsApiImpl.kt @@ -300,6 +300,9 @@ class GeckoEngineSettingsApiImpl( if(settings.inputAutoZoomEnabled != null) { components.core.runtime.settings.inputAutoZoomEnabled = settings.inputAutoZoomEnabled } + if(settings.forceUserScalableContent != null) { + components.core.engineSettings.forceUserScalableContent = settings.forceUserScalableContent + } // LNA Settings if(settings.lnaBlocking != null) { @@ -405,6 +408,9 @@ class GeckoEngineSettingsApiImpl( components.core.engine.settings.fontInflationEnabled = components.core.engineSettings.fontInflationEnabled reloadSession = true } + if(settings.forceUserScalableContent != null) { + components.core.engine.settings.forceUserScalableContent = components.core.engineSettings.forceUserScalableContent + } // LNA settings if(settings.lnaEnabled != null) { components.core.engine.settings.lnaFeatureEnabled = components.core.engineSettings.lnaFeatureEnabled 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 708d6382..e811d5e7 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 @@ -3634,6 +3634,11 @@ data class GeckoEngineSettings ( val screenWidthOverride: Long? = null, val screenHeightOverride: Long? = null, val inputAutoZoomEnabled: Boolean? = null, + /** + * Forces pinch-to-zoom to work even on websites that set + * `user-scalable=no` (or a restrictive `maximum-scale`) on the viewport. + */ + val forceUserScalableContent: Boolean? = null, val fissionEnabled: Boolean? = null, val isolatedProcessEnabled: Boolean? = null, val appZygoteProcessEnabled: Boolean? = null, @@ -3682,14 +3687,15 @@ data class GeckoEngineSettings ( val screenWidthOverride = pigeonVar_list[34] as Long? val screenHeightOverride = pigeonVar_list[35] as Long? val inputAutoZoomEnabled = pigeonVar_list[36] as Boolean? - val fissionEnabled = pigeonVar_list[37] as Boolean? - val isolatedProcessEnabled = pigeonVar_list[38] as Boolean? - val appZygoteProcessEnabled = pigeonVar_list[39] as Boolean? - val extensionsWebAPIEnabled = pigeonVar_list[40] as Boolean? - val lnaBlocking = pigeonVar_list[41] as Boolean? - val lnaBlockTrackers = pigeonVar_list[42] as Boolean? - val lnaEnabled = pigeonVar_list[43] as Boolean? - return GeckoEngineSettings(javascriptEnabled, trackingProtectionPolicy, httpsOnlyMode, globalPrivacyControlEnabled, preferredColorScheme, cookieBannerHandlingMode, cookieBannerHandlingModePrivateBrowsing, cookieBannerHandlingGlobalRules, cookieBannerHandlingGlobalRulesSubFrames, webContentIsolationStrategy, userAgent, contentBlocking, enterpriseRootsEnabled, dohSettings, fingerprintingProtectionOverrides, locales, useContentBlockingDatabase, blockCookies, customCookiePolicy, blockTrackingContent, trackingContentScope, blockCryptominers, blockFingerprinters, blockRedirectTrackers, blockSuspectedFingerprinters, suspectedFingerprintersScope, allowListBaseline, allowListConvenience, blockAdsAnalyticsSocialTrackers, webFontsEnabled, automaticFontSizeAdjustment, fontSizeFactor, fontInflationEnabled, displayDensityOverride, screenWidthOverride, screenHeightOverride, inputAutoZoomEnabled, fissionEnabled, isolatedProcessEnabled, appZygoteProcessEnabled, extensionsWebAPIEnabled, lnaBlocking, lnaBlockTrackers, lnaEnabled) + val forceUserScalableContent = pigeonVar_list[37] as Boolean? + val fissionEnabled = pigeonVar_list[38] as Boolean? + val isolatedProcessEnabled = pigeonVar_list[39] as Boolean? + val appZygoteProcessEnabled = pigeonVar_list[40] as Boolean? + val extensionsWebAPIEnabled = pigeonVar_list[41] as Boolean? + val lnaBlocking = pigeonVar_list[42] as Boolean? + val lnaBlockTrackers = pigeonVar_list[43] as Boolean? + val lnaEnabled = pigeonVar_list[44] as Boolean? + return GeckoEngineSettings(javascriptEnabled, trackingProtectionPolicy, httpsOnlyMode, globalPrivacyControlEnabled, preferredColorScheme, cookieBannerHandlingMode, cookieBannerHandlingModePrivateBrowsing, cookieBannerHandlingGlobalRules, cookieBannerHandlingGlobalRulesSubFrames, webContentIsolationStrategy, userAgent, contentBlocking, enterpriseRootsEnabled, dohSettings, fingerprintingProtectionOverrides, 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) } } fun toList(): List { @@ -3731,6 +3737,7 @@ data class GeckoEngineSettings ( screenWidthOverride, screenHeightOverride, inputAutoZoomEnabled, + forceUserScalableContent, fissionEnabled, isolatedProcessEnabled, appZygoteProcessEnabled, @@ -3748,7 +3755,7 @@ data class GeckoEngineSettings ( return true } val other = other as GeckoEngineSettings - return GeckoPigeonUtils.deepEquals(this.javascriptEnabled, other.javascriptEnabled) && GeckoPigeonUtils.deepEquals(this.trackingProtectionPolicy, other.trackingProtectionPolicy) && GeckoPigeonUtils.deepEquals(this.httpsOnlyMode, other.httpsOnlyMode) && GeckoPigeonUtils.deepEquals(this.globalPrivacyControlEnabled, other.globalPrivacyControlEnabled) && GeckoPigeonUtils.deepEquals(this.preferredColorScheme, other.preferredColorScheme) && GeckoPigeonUtils.deepEquals(this.cookieBannerHandlingMode, other.cookieBannerHandlingMode) && GeckoPigeonUtils.deepEquals(this.cookieBannerHandlingModePrivateBrowsing, other.cookieBannerHandlingModePrivateBrowsing) && GeckoPigeonUtils.deepEquals(this.cookieBannerHandlingGlobalRules, other.cookieBannerHandlingGlobalRules) && GeckoPigeonUtils.deepEquals(this.cookieBannerHandlingGlobalRulesSubFrames, other.cookieBannerHandlingGlobalRulesSubFrames) && GeckoPigeonUtils.deepEquals(this.webContentIsolationStrategy, other.webContentIsolationStrategy) && GeckoPigeonUtils.deepEquals(this.userAgent, other.userAgent) && GeckoPigeonUtils.deepEquals(this.contentBlocking, other.contentBlocking) && GeckoPigeonUtils.deepEquals(this.enterpriseRootsEnabled, other.enterpriseRootsEnabled) && GeckoPigeonUtils.deepEquals(this.dohSettings, other.dohSettings) && GeckoPigeonUtils.deepEquals(this.fingerprintingProtectionOverrides, other.fingerprintingProtectionOverrides) && GeckoPigeonUtils.deepEquals(this.locales, other.locales) && GeckoPigeonUtils.deepEquals(this.useContentBlockingDatabase, other.useContentBlockingDatabase) && GeckoPigeonUtils.deepEquals(this.blockCookies, other.blockCookies) && GeckoPigeonUtils.deepEquals(this.customCookiePolicy, other.customCookiePolicy) && GeckoPigeonUtils.deepEquals(this.blockTrackingContent, other.blockTrackingContent) && GeckoPigeonUtils.deepEquals(this.trackingContentScope, other.trackingContentScope) && GeckoPigeonUtils.deepEquals(this.blockCryptominers, other.blockCryptominers) && GeckoPigeonUtils.deepEquals(this.blockFingerprinters, other.blockFingerprinters) && GeckoPigeonUtils.deepEquals(this.blockRedirectTrackers, other.blockRedirectTrackers) && GeckoPigeonUtils.deepEquals(this.blockSuspectedFingerprinters, other.blockSuspectedFingerprinters) && GeckoPigeonUtils.deepEquals(this.suspectedFingerprintersScope, other.suspectedFingerprintersScope) && GeckoPigeonUtils.deepEquals(this.allowListBaseline, other.allowListBaseline) && GeckoPigeonUtils.deepEquals(this.allowListConvenience, other.allowListConvenience) && GeckoPigeonUtils.deepEquals(this.blockAdsAnalyticsSocialTrackers, other.blockAdsAnalyticsSocialTrackers) && GeckoPigeonUtils.deepEquals(this.webFontsEnabled, other.webFontsEnabled) && GeckoPigeonUtils.deepEquals(this.automaticFontSizeAdjustment, other.automaticFontSizeAdjustment) && GeckoPigeonUtils.deepEquals(this.fontSizeFactor, other.fontSizeFactor) && GeckoPigeonUtils.deepEquals(this.fontInflationEnabled, other.fontInflationEnabled) && GeckoPigeonUtils.deepEquals(this.displayDensityOverride, other.displayDensityOverride) && GeckoPigeonUtils.deepEquals(this.screenWidthOverride, other.screenWidthOverride) && GeckoPigeonUtils.deepEquals(this.screenHeightOverride, other.screenHeightOverride) && GeckoPigeonUtils.deepEquals(this.inputAutoZoomEnabled, other.inputAutoZoomEnabled) && GeckoPigeonUtils.deepEquals(this.fissionEnabled, other.fissionEnabled) && GeckoPigeonUtils.deepEquals(this.isolatedProcessEnabled, other.isolatedProcessEnabled) && GeckoPigeonUtils.deepEquals(this.appZygoteProcessEnabled, other.appZygoteProcessEnabled) && GeckoPigeonUtils.deepEquals(this.extensionsWebAPIEnabled, other.extensionsWebAPIEnabled) && GeckoPigeonUtils.deepEquals(this.lnaBlocking, other.lnaBlocking) && GeckoPigeonUtils.deepEquals(this.lnaBlockTrackers, other.lnaBlockTrackers) && GeckoPigeonUtils.deepEquals(this.lnaEnabled, other.lnaEnabled) + return GeckoPigeonUtils.deepEquals(this.javascriptEnabled, other.javascriptEnabled) && GeckoPigeonUtils.deepEquals(this.trackingProtectionPolicy, other.trackingProtectionPolicy) && GeckoPigeonUtils.deepEquals(this.httpsOnlyMode, other.httpsOnlyMode) && GeckoPigeonUtils.deepEquals(this.globalPrivacyControlEnabled, other.globalPrivacyControlEnabled) && GeckoPigeonUtils.deepEquals(this.preferredColorScheme, other.preferredColorScheme) && GeckoPigeonUtils.deepEquals(this.cookieBannerHandlingMode, other.cookieBannerHandlingMode) && GeckoPigeonUtils.deepEquals(this.cookieBannerHandlingModePrivateBrowsing, other.cookieBannerHandlingModePrivateBrowsing) && GeckoPigeonUtils.deepEquals(this.cookieBannerHandlingGlobalRules, other.cookieBannerHandlingGlobalRules) && GeckoPigeonUtils.deepEquals(this.cookieBannerHandlingGlobalRulesSubFrames, other.cookieBannerHandlingGlobalRulesSubFrames) && GeckoPigeonUtils.deepEquals(this.webContentIsolationStrategy, other.webContentIsolationStrategy) && GeckoPigeonUtils.deepEquals(this.userAgent, other.userAgent) && GeckoPigeonUtils.deepEquals(this.contentBlocking, other.contentBlocking) && GeckoPigeonUtils.deepEquals(this.enterpriseRootsEnabled, other.enterpriseRootsEnabled) && GeckoPigeonUtils.deepEquals(this.dohSettings, other.dohSettings) && GeckoPigeonUtils.deepEquals(this.fingerprintingProtectionOverrides, other.fingerprintingProtectionOverrides) && GeckoPigeonUtils.deepEquals(this.locales, other.locales) && GeckoPigeonUtils.deepEquals(this.useContentBlockingDatabase, other.useContentBlockingDatabase) && GeckoPigeonUtils.deepEquals(this.blockCookies, other.blockCookies) && GeckoPigeonUtils.deepEquals(this.customCookiePolicy, other.customCookiePolicy) && GeckoPigeonUtils.deepEquals(this.blockTrackingContent, other.blockTrackingContent) && GeckoPigeonUtils.deepEquals(this.trackingContentScope, other.trackingContentScope) && GeckoPigeonUtils.deepEquals(this.blockCryptominers, other.blockCryptominers) && GeckoPigeonUtils.deepEquals(this.blockFingerprinters, other.blockFingerprinters) && GeckoPigeonUtils.deepEquals(this.blockRedirectTrackers, other.blockRedirectTrackers) && GeckoPigeonUtils.deepEquals(this.blockSuspectedFingerprinters, other.blockSuspectedFingerprinters) && GeckoPigeonUtils.deepEquals(this.suspectedFingerprintersScope, other.suspectedFingerprintersScope) && GeckoPigeonUtils.deepEquals(this.allowListBaseline, other.allowListBaseline) && GeckoPigeonUtils.deepEquals(this.allowListConvenience, other.allowListConvenience) && GeckoPigeonUtils.deepEquals(this.blockAdsAnalyticsSocialTrackers, other.blockAdsAnalyticsSocialTrackers) && GeckoPigeonUtils.deepEquals(this.webFontsEnabled, other.webFontsEnabled) && GeckoPigeonUtils.deepEquals(this.automaticFontSizeAdjustment, other.automaticFontSizeAdjustment) && GeckoPigeonUtils.deepEquals(this.fontSizeFactor, other.fontSizeFactor) && GeckoPigeonUtils.deepEquals(this.fontInflationEnabled, other.fontInflationEnabled) && GeckoPigeonUtils.deepEquals(this.displayDensityOverride, other.displayDensityOverride) && GeckoPigeonUtils.deepEquals(this.screenWidthOverride, other.screenWidthOverride) && GeckoPigeonUtils.deepEquals(this.screenHeightOverride, other.screenHeightOverride) && GeckoPigeonUtils.deepEquals(this.inputAutoZoomEnabled, other.inputAutoZoomEnabled) && GeckoPigeonUtils.deepEquals(this.forceUserScalableContent, other.forceUserScalableContent) && GeckoPigeonUtils.deepEquals(this.fissionEnabled, other.fissionEnabled) && GeckoPigeonUtils.deepEquals(this.isolatedProcessEnabled, other.isolatedProcessEnabled) && GeckoPigeonUtils.deepEquals(this.appZygoteProcessEnabled, other.appZygoteProcessEnabled) && GeckoPigeonUtils.deepEquals(this.extensionsWebAPIEnabled, other.extensionsWebAPIEnabled) && GeckoPigeonUtils.deepEquals(this.lnaBlocking, other.lnaBlocking) && GeckoPigeonUtils.deepEquals(this.lnaBlockTrackers, other.lnaBlockTrackers) && GeckoPigeonUtils.deepEquals(this.lnaEnabled, other.lnaEnabled) } override fun hashCode(): Int { @@ -3790,6 +3797,7 @@ data class GeckoEngineSettings ( result = 31 * result + GeckoPigeonUtils.deepHash(this.screenWidthOverride) result = 31 * result + GeckoPigeonUtils.deepHash(this.screenHeightOverride) result = 31 * result + GeckoPigeonUtils.deepHash(this.inputAutoZoomEnabled) + result = 31 * result + GeckoPigeonUtils.deepHash(this.forceUserScalableContent) result = 31 * result + GeckoPigeonUtils.deepHash(this.fissionEnabled) result = 31 * result + GeckoPigeonUtils.deepHash(this.isolatedProcessEnabled) result = 31 * result + GeckoPigeonUtils.deepHash(this.appZygoteProcessEnabled) @@ -3800,7 +3808,7 @@ data class GeckoEngineSettings ( return result } override fun toString(): String { - return "GeckoEngineSettings(javascriptEnabled=$javascriptEnabled, trackingProtectionPolicy=$trackingProtectionPolicy, httpsOnlyMode=$httpsOnlyMode, globalPrivacyControlEnabled=$globalPrivacyControlEnabled, preferredColorScheme=$preferredColorScheme, cookieBannerHandlingMode=$cookieBannerHandlingMode, cookieBannerHandlingModePrivateBrowsing=$cookieBannerHandlingModePrivateBrowsing, cookieBannerHandlingGlobalRules=$cookieBannerHandlingGlobalRules, cookieBannerHandlingGlobalRulesSubFrames=$cookieBannerHandlingGlobalRulesSubFrames, webContentIsolationStrategy=$webContentIsolationStrategy, userAgent=$userAgent, contentBlocking=$contentBlocking, enterpriseRootsEnabled=$enterpriseRootsEnabled, dohSettings=$dohSettings, fingerprintingProtectionOverrides=$fingerprintingProtectionOverrides, locales=$locales, useContentBlockingDatabase=$useContentBlockingDatabase, blockCookies=$blockCookies, customCookiePolicy=$customCookiePolicy, blockTrackingContent=$blockTrackingContent, trackingContentScope=$trackingContentScope, blockCryptominers=$blockCryptominers, blockFingerprinters=$blockFingerprinters, blockRedirectTrackers=$blockRedirectTrackers, blockSuspectedFingerprinters=$blockSuspectedFingerprinters, suspectedFingerprintersScope=$suspectedFingerprintersScope, allowListBaseline=$allowListBaseline, allowListConvenience=$allowListConvenience, blockAdsAnalyticsSocialTrackers=$blockAdsAnalyticsSocialTrackers, webFontsEnabled=$webFontsEnabled, automaticFontSizeAdjustment=$automaticFontSizeAdjustment, fontSizeFactor=$fontSizeFactor, fontInflationEnabled=$fontInflationEnabled, displayDensityOverride=$displayDensityOverride, screenWidthOverride=$screenWidthOverride, screenHeightOverride=$screenHeightOverride, inputAutoZoomEnabled=$inputAutoZoomEnabled, fissionEnabled=$fissionEnabled, isolatedProcessEnabled=$isolatedProcessEnabled, appZygoteProcessEnabled=$appZygoteProcessEnabled, extensionsWebAPIEnabled=$extensionsWebAPIEnabled, lnaBlocking=$lnaBlocking, lnaBlockTrackers=$lnaBlockTrackers, lnaEnabled=$lnaEnabled)" + return "GeckoEngineSettings(javascriptEnabled=$javascriptEnabled, trackingProtectionPolicy=$trackingProtectionPolicy, httpsOnlyMode=$httpsOnlyMode, globalPrivacyControlEnabled=$globalPrivacyControlEnabled, preferredColorScheme=$preferredColorScheme, cookieBannerHandlingMode=$cookieBannerHandlingMode, cookieBannerHandlingModePrivateBrowsing=$cookieBannerHandlingModePrivateBrowsing, cookieBannerHandlingGlobalRules=$cookieBannerHandlingGlobalRules, cookieBannerHandlingGlobalRulesSubFrames=$cookieBannerHandlingGlobalRulesSubFrames, webContentIsolationStrategy=$webContentIsolationStrategy, userAgent=$userAgent, contentBlocking=$contentBlocking, enterpriseRootsEnabled=$enterpriseRootsEnabled, dohSettings=$dohSettings, fingerprintingProtectionOverrides=$fingerprintingProtectionOverrides, locales=$locales, useContentBlockingDatabase=$useContentBlockingDatabase, blockCookies=$blockCookies, customCookiePolicy=$customCookiePolicy, blockTrackingContent=$blockTrackingContent, trackingContentScope=$trackingContentScope, blockCryptominers=$blockCryptominers, blockFingerprinters=$blockFingerprinters, blockRedirectTrackers=$blockRedirectTrackers, blockSuspectedFingerprinters=$blockSuspectedFingerprinters, suspectedFingerprintersScope=$suspectedFingerprintersScope, allowListBaseline=$allowListBaseline, allowListConvenience=$allowListConvenience, blockAdsAnalyticsSocialTrackers=$blockAdsAnalyticsSocialTrackers, webFontsEnabled=$webFontsEnabled, automaticFontSizeAdjustment=$automaticFontSizeAdjustment, fontSizeFactor=$fontSizeFactor, fontInflationEnabled=$fontInflationEnabled, displayDensityOverride=$displayDensityOverride, screenWidthOverride=$screenWidthOverride, screenHeightOverride=$screenHeightOverride, inputAutoZoomEnabled=$inputAutoZoomEnabled, forceUserScalableContent=$forceUserScalableContent, fissionEnabled=$fissionEnabled, isolatedProcessEnabled=$isolatedProcessEnabled, appZygoteProcessEnabled=$appZygoteProcessEnabled, extensionsWebAPIEnabled=$extensionsWebAPIEnabled, lnaBlocking=$lnaBlocking, lnaBlockTrackers=$lnaBlockTrackers, lnaEnabled=$lnaEnabled)" } } diff --git a/packages/flutter_mozilla_components/lib/src/domain/services/gecko_engine_settings.dart b/packages/flutter_mozilla_components/lib/src/domain/services/gecko_engine_settings.dart index 97400ffd..ed4d5e9e 100644 --- a/packages/flutter_mozilla_components/lib/src/domain/services/gecko_engine_settings.dart +++ b/packages/flutter_mozilla_components/lib/src/domain/services/gecko_engine_settings.dart @@ -176,6 +176,12 @@ class GeckoEngineSettingsService { ); } + Future forceUserScalableContent(bool state) { + return _api.updateRuntimeSettings( + GeckoEngineSettings(forceUserScalableContent: state), + ); + } + // LNA Settings Future lnaBlocking(bool? state) { return _api.updateRuntimeSettings(GeckoEngineSettings(lnaBlocking: state)); 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 67d86211..88bcb418 100644 --- a/packages/flutter_mozilla_components/lib/src/pigeons/gecko.g.dart +++ b/packages/flutter_mozilla_components/lib/src/pigeons/gecko.g.dart @@ -3739,6 +3739,7 @@ class GeckoEngineSettings { this.screenWidthOverride, this.screenHeightOverride, this.inputAutoZoomEnabled, + this.forceUserScalableContent, this.fissionEnabled, this.isolatedProcessEnabled, this.appZygoteProcessEnabled, @@ -3837,6 +3838,10 @@ class GeckoEngineSettings { bool? inputAutoZoomEnabled; + /// Forces pinch-to-zoom to work even on websites that set + /// `user-scalable=no` (or a restrictive `maximum-scale`) on the viewport. + bool? forceUserScalableContent; + bool? fissionEnabled; bool? isolatedProcessEnabled; @@ -3890,6 +3895,7 @@ class GeckoEngineSettings { screenWidthOverride, screenHeightOverride, inputAutoZoomEnabled, + forceUserScalableContent, fissionEnabled, isolatedProcessEnabled, appZygoteProcessEnabled, @@ -3943,13 +3949,14 @@ class GeckoEngineSettings { screenWidthOverride: result[34] as int?, screenHeightOverride: result[35] as int?, inputAutoZoomEnabled: result[36] as bool?, - fissionEnabled: result[37] as bool?, - isolatedProcessEnabled: result[38] as bool?, - appZygoteProcessEnabled: result[39] as bool?, - extensionsWebAPIEnabled: result[40] as bool?, - lnaBlocking: result[41] as bool?, - lnaBlockTrackers: result[42] as bool?, - lnaEnabled: result[43] as bool?, + forceUserScalableContent: result[37] as bool?, + fissionEnabled: result[38] as bool?, + isolatedProcessEnabled: result[39] as bool?, + appZygoteProcessEnabled: result[40] as bool?, + extensionsWebAPIEnabled: result[41] as bool?, + lnaBlocking: result[42] as bool?, + lnaBlockTrackers: result[43] as bool?, + lnaEnabled: result[44] as bool?, ); } @@ -3962,7 +3969,7 @@ class GeckoEngineSettings { if (identical(this, other)) { return true; } - return _deepEquals(javascriptEnabled, other.javascriptEnabled) && _deepEquals(trackingProtectionPolicy, other.trackingProtectionPolicy) && _deepEquals(httpsOnlyMode, other.httpsOnlyMode) && _deepEquals(globalPrivacyControlEnabled, other.globalPrivacyControlEnabled) && _deepEquals(preferredColorScheme, other.preferredColorScheme) && _deepEquals(cookieBannerHandlingMode, other.cookieBannerHandlingMode) && _deepEquals(cookieBannerHandlingModePrivateBrowsing, other.cookieBannerHandlingModePrivateBrowsing) && _deepEquals(cookieBannerHandlingGlobalRules, other.cookieBannerHandlingGlobalRules) && _deepEquals(cookieBannerHandlingGlobalRulesSubFrames, other.cookieBannerHandlingGlobalRulesSubFrames) && _deepEquals(webContentIsolationStrategy, other.webContentIsolationStrategy) && _deepEquals(userAgent, other.userAgent) && _deepEquals(contentBlocking, other.contentBlocking) && _deepEquals(enterpriseRootsEnabled, other.enterpriseRootsEnabled) && _deepEquals(dohSettings, other.dohSettings) && _deepEquals(fingerprintingProtectionOverrides, other.fingerprintingProtectionOverrides) && _deepEquals(locales, other.locales) && _deepEquals(useContentBlockingDatabase, other.useContentBlockingDatabase) && _deepEquals(blockCookies, other.blockCookies) && _deepEquals(customCookiePolicy, other.customCookiePolicy) && _deepEquals(blockTrackingContent, other.blockTrackingContent) && _deepEquals(trackingContentScope, other.trackingContentScope) && _deepEquals(blockCryptominers, other.blockCryptominers) && _deepEquals(blockFingerprinters, other.blockFingerprinters) && _deepEquals(blockRedirectTrackers, other.blockRedirectTrackers) && _deepEquals(blockSuspectedFingerprinters, other.blockSuspectedFingerprinters) && _deepEquals(suspectedFingerprintersScope, other.suspectedFingerprintersScope) && _deepEquals(allowListBaseline, other.allowListBaseline) && _deepEquals(allowListConvenience, other.allowListConvenience) && _deepEquals(blockAdsAnalyticsSocialTrackers, other.blockAdsAnalyticsSocialTrackers) && _deepEquals(webFontsEnabled, other.webFontsEnabled) && _deepEquals(automaticFontSizeAdjustment, other.automaticFontSizeAdjustment) && _deepEquals(fontSizeFactor, other.fontSizeFactor) && _deepEquals(fontInflationEnabled, other.fontInflationEnabled) && _deepEquals(displayDensityOverride, other.displayDensityOverride) && _deepEquals(screenWidthOverride, other.screenWidthOverride) && _deepEquals(screenHeightOverride, other.screenHeightOverride) && _deepEquals(inputAutoZoomEnabled, other.inputAutoZoomEnabled) && _deepEquals(fissionEnabled, other.fissionEnabled) && _deepEquals(isolatedProcessEnabled, other.isolatedProcessEnabled) && _deepEquals(appZygoteProcessEnabled, other.appZygoteProcessEnabled) && _deepEquals(extensionsWebAPIEnabled, other.extensionsWebAPIEnabled) && _deepEquals(lnaBlocking, other.lnaBlocking) && _deepEquals(lnaBlockTrackers, other.lnaBlockTrackers) && _deepEquals(lnaEnabled, other.lnaEnabled); + return _deepEquals(javascriptEnabled, other.javascriptEnabled) && _deepEquals(trackingProtectionPolicy, other.trackingProtectionPolicy) && _deepEquals(httpsOnlyMode, other.httpsOnlyMode) && _deepEquals(globalPrivacyControlEnabled, other.globalPrivacyControlEnabled) && _deepEquals(preferredColorScheme, other.preferredColorScheme) && _deepEquals(cookieBannerHandlingMode, other.cookieBannerHandlingMode) && _deepEquals(cookieBannerHandlingModePrivateBrowsing, other.cookieBannerHandlingModePrivateBrowsing) && _deepEquals(cookieBannerHandlingGlobalRules, other.cookieBannerHandlingGlobalRules) && _deepEquals(cookieBannerHandlingGlobalRulesSubFrames, other.cookieBannerHandlingGlobalRulesSubFrames) && _deepEquals(webContentIsolationStrategy, other.webContentIsolationStrategy) && _deepEquals(userAgent, other.userAgent) && _deepEquals(contentBlocking, other.contentBlocking) && _deepEquals(enterpriseRootsEnabled, other.enterpriseRootsEnabled) && _deepEquals(dohSettings, other.dohSettings) && _deepEquals(fingerprintingProtectionOverrides, other.fingerprintingProtectionOverrides) && _deepEquals(locales, other.locales) && _deepEquals(useContentBlockingDatabase, other.useContentBlockingDatabase) && _deepEquals(blockCookies, other.blockCookies) && _deepEquals(customCookiePolicy, other.customCookiePolicy) && _deepEquals(blockTrackingContent, other.blockTrackingContent) && _deepEquals(trackingContentScope, other.trackingContentScope) && _deepEquals(blockCryptominers, other.blockCryptominers) && _deepEquals(blockFingerprinters, other.blockFingerprinters) && _deepEquals(blockRedirectTrackers, other.blockRedirectTrackers) && _deepEquals(blockSuspectedFingerprinters, other.blockSuspectedFingerprinters) && _deepEquals(suspectedFingerprintersScope, other.suspectedFingerprintersScope) && _deepEquals(allowListBaseline, other.allowListBaseline) && _deepEquals(allowListConvenience, other.allowListConvenience) && _deepEquals(blockAdsAnalyticsSocialTrackers, other.blockAdsAnalyticsSocialTrackers) && _deepEquals(webFontsEnabled, other.webFontsEnabled) && _deepEquals(automaticFontSizeAdjustment, other.automaticFontSizeAdjustment) && _deepEquals(fontSizeFactor, other.fontSizeFactor) && _deepEquals(fontInflationEnabled, other.fontInflationEnabled) && _deepEquals(displayDensityOverride, other.displayDensityOverride) && _deepEquals(screenWidthOverride, other.screenWidthOverride) && _deepEquals(screenHeightOverride, other.screenHeightOverride) && _deepEquals(inputAutoZoomEnabled, other.inputAutoZoomEnabled) && _deepEquals(forceUserScalableContent, other.forceUserScalableContent) && _deepEquals(fissionEnabled, other.fissionEnabled) && _deepEquals(isolatedProcessEnabled, other.isolatedProcessEnabled) && _deepEquals(appZygoteProcessEnabled, other.appZygoteProcessEnabled) && _deepEquals(extensionsWebAPIEnabled, other.extensionsWebAPIEnabled) && _deepEquals(lnaBlocking, other.lnaBlocking) && _deepEquals(lnaBlockTrackers, other.lnaBlockTrackers) && _deepEquals(lnaEnabled, other.lnaEnabled); } @override @@ -3971,7 +3978,7 @@ class GeckoEngineSettings { @override String toString() { - return 'GeckoEngineSettings(javascriptEnabled: $javascriptEnabled, trackingProtectionPolicy: $trackingProtectionPolicy, httpsOnlyMode: $httpsOnlyMode, globalPrivacyControlEnabled: $globalPrivacyControlEnabled, preferredColorScheme: $preferredColorScheme, cookieBannerHandlingMode: $cookieBannerHandlingMode, cookieBannerHandlingModePrivateBrowsing: $cookieBannerHandlingModePrivateBrowsing, cookieBannerHandlingGlobalRules: $cookieBannerHandlingGlobalRules, cookieBannerHandlingGlobalRulesSubFrames: $cookieBannerHandlingGlobalRulesSubFrames, webContentIsolationStrategy: $webContentIsolationStrategy, userAgent: $userAgent, contentBlocking: $contentBlocking, enterpriseRootsEnabled: $enterpriseRootsEnabled, dohSettings: $dohSettings, fingerprintingProtectionOverrides: $fingerprintingProtectionOverrides, locales: $locales, useContentBlockingDatabase: $useContentBlockingDatabase, blockCookies: $blockCookies, customCookiePolicy: $customCookiePolicy, blockTrackingContent: $blockTrackingContent, trackingContentScope: $trackingContentScope, blockCryptominers: $blockCryptominers, blockFingerprinters: $blockFingerprinters, blockRedirectTrackers: $blockRedirectTrackers, blockSuspectedFingerprinters: $blockSuspectedFingerprinters, suspectedFingerprintersScope: $suspectedFingerprintersScope, allowListBaseline: $allowListBaseline, allowListConvenience: $allowListConvenience, blockAdsAnalyticsSocialTrackers: $blockAdsAnalyticsSocialTrackers, webFontsEnabled: $webFontsEnabled, automaticFontSizeAdjustment: $automaticFontSizeAdjustment, fontSizeFactor: $fontSizeFactor, fontInflationEnabled: $fontInflationEnabled, displayDensityOverride: $displayDensityOverride, screenWidthOverride: $screenWidthOverride, screenHeightOverride: $screenHeightOverride, inputAutoZoomEnabled: $inputAutoZoomEnabled, fissionEnabled: $fissionEnabled, isolatedProcessEnabled: $isolatedProcessEnabled, appZygoteProcessEnabled: $appZygoteProcessEnabled, extensionsWebAPIEnabled: $extensionsWebAPIEnabled, lnaBlocking: $lnaBlocking, lnaBlockTrackers: $lnaBlockTrackers, lnaEnabled: $lnaEnabled)'; + return 'GeckoEngineSettings(javascriptEnabled: $javascriptEnabled, trackingProtectionPolicy: $trackingProtectionPolicy, httpsOnlyMode: $httpsOnlyMode, globalPrivacyControlEnabled: $globalPrivacyControlEnabled, preferredColorScheme: $preferredColorScheme, cookieBannerHandlingMode: $cookieBannerHandlingMode, cookieBannerHandlingModePrivateBrowsing: $cookieBannerHandlingModePrivateBrowsing, cookieBannerHandlingGlobalRules: $cookieBannerHandlingGlobalRules, cookieBannerHandlingGlobalRulesSubFrames: $cookieBannerHandlingGlobalRulesSubFrames, webContentIsolationStrategy: $webContentIsolationStrategy, userAgent: $userAgent, contentBlocking: $contentBlocking, enterpriseRootsEnabled: $enterpriseRootsEnabled, dohSettings: $dohSettings, fingerprintingProtectionOverrides: $fingerprintingProtectionOverrides, locales: $locales, useContentBlockingDatabase: $useContentBlockingDatabase, blockCookies: $blockCookies, customCookiePolicy: $customCookiePolicy, blockTrackingContent: $blockTrackingContent, trackingContentScope: $trackingContentScope, blockCryptominers: $blockCryptominers, blockFingerprinters: $blockFingerprinters, blockRedirectTrackers: $blockRedirectTrackers, blockSuspectedFingerprinters: $blockSuspectedFingerprinters, suspectedFingerprintersScope: $suspectedFingerprintersScope, allowListBaseline: $allowListBaseline, allowListConvenience: $allowListConvenience, blockAdsAnalyticsSocialTrackers: $blockAdsAnalyticsSocialTrackers, webFontsEnabled: $webFontsEnabled, automaticFontSizeAdjustment: $automaticFontSizeAdjustment, fontSizeFactor: $fontSizeFactor, fontInflationEnabled: $fontInflationEnabled, displayDensityOverride: $displayDensityOverride, screenWidthOverride: $screenWidthOverride, screenHeightOverride: $screenHeightOverride, inputAutoZoomEnabled: $inputAutoZoomEnabled, forceUserScalableContent: $forceUserScalableContent, fissionEnabled: $fissionEnabled, isolatedProcessEnabled: $isolatedProcessEnabled, appZygoteProcessEnabled: $appZygoteProcessEnabled, extensionsWebAPIEnabled: $extensionsWebAPIEnabled, lnaBlocking: $lnaBlocking, lnaBlockTrackers: $lnaBlockTrackers, lnaEnabled: $lnaEnabled)'; } } diff --git a/packages/flutter_mozilla_components/pigeons/gecko.dart b/packages/flutter_mozilla_components/pigeons/gecko.dart index d5a546a9..5e09a5e4 100644 --- a/packages/flutter_mozilla_components/pigeons/gecko.dart +++ b/packages/flutter_mozilla_components/pigeons/gecko.dart @@ -1143,6 +1143,10 @@ class GeckoEngineSettings { final int? screenHeightOverride; final bool? inputAutoZoomEnabled; + /// Forces pinch-to-zoom to work even on websites that set + /// `user-scalable=no` (or a restrictive `maximum-scale`) on the viewport. + final bool? forceUserScalableContent; + // Process Isolation Settings (require app restart) final bool? fissionEnabled; final bool? isolatedProcessEnabled; @@ -1192,6 +1196,7 @@ class GeckoEngineSettings { this.screenWidthOverride, this.screenHeightOverride, this.inputAutoZoomEnabled, + this.forceUserScalableContent, this.fissionEnabled, this.isolatedProcessEnabled, this.appZygoteProcessEnabled,