add various engine settings

This commit is contained in:
Fabian Freund
2026-03-10 13:47:40 +01:00
parent 37b86e9068
commit e2eb38e541
17 changed files with 1193 additions and 92 deletions
@@ -77,12 +77,25 @@ object EngineProvider {
// About config it's no longer enabled by default
builder.aboutConfigEnabled(true)
builder.extensionsProcessEnabled(true)
builder.extensionsWebAPIEnabled(true)
builder.extensionsWebAPIEnabled(false)
//builder.debugLogging(components.logLevel == Log.Priority.DEBUG)
builder.consoleOutput(components.logLevel == Log.Priority.DEBUG)
builder.contentBlocking(contentBlocking.build())
builder.locales(arrayOf("en-US", "en")) // Will be overridden later
// Apply builder-only settings from startup config
GlobalComponents.startupSettings?.let { settings ->
settings.fissionEnabled?.let { builder.fissionEnabled(it) }
settings.isolatedProcessEnabled?.let { builder.isolatedProcessEnabled(it) }
settings.appZygoteProcessEnabled?.let { builder.appZygoteProcessEnabled(it) }
settings.displayDensityOverride?.let { builder.displayDensityOverride(it.toFloat()) }
val screenWidth = settings.screenWidthOverride
val screenHeight = settings.screenHeightOverride
if (screenWidth != null && screenHeight != null && screenWidth > 0 && screenHeight > 0) {
builder.screenSizeOverride(screenWidth.toInt(), screenHeight.toInt())
}
}
runtime = GeckoRuntime.create(context, builder.build())
}
@@ -12,6 +12,7 @@ import eu.weblibre.flutter_mozilla_components.pigeons.BrowserExtensionEvents
import eu.weblibre.flutter_mozilla_components.pigeons.BounceTrackingProtectionMode
import eu.weblibre.flutter_mozilla_components.pigeons.ContentBlocking
import eu.weblibre.flutter_mozilla_components.pigeons.GeckoAddonEvents
import eu.weblibre.flutter_mozilla_components.pigeons.GeckoEngineSettings
import eu.weblibre.flutter_mozilla_components.pigeons.GeckoSelectionActionEvents
import eu.weblibre.flutter_mozilla_components.pigeons.GeckoStateEvents
import eu.weblibre.flutter_mozilla_components.pigeons.GeckoSuggestionEvents
@@ -77,6 +78,9 @@ object GlobalComponents {
// External download manager setting
var useExternalDownloadManager: Boolean = false
// Startup settings for builder-only GeckoRuntimeSettings (fission, process isolation, etc.)
var startupSettings: GeckoEngineSettings? = null
fun shouldOpenLinksInApp(isExternalSession: Boolean = false): Boolean {
return when (engineSettingsApi!!.getAppLinksMode()) {
eu.weblibre.flutter_mozilla_components.pigeons.AppLinksMode.ALWAYS -> true
@@ -21,6 +21,7 @@ import eu.weblibre.flutter_mozilla_components.pigeons.AddonCollection
import eu.weblibre.flutter_mozilla_components.pigeons.BrowserExtensionEvents
import eu.weblibre.flutter_mozilla_components.pigeons.ContentBlocking
import eu.weblibre.flutter_mozilla_components.pigeons.GeckoAddonEvents
import eu.weblibre.flutter_mozilla_components.pigeons.GeckoEngineSettings
import eu.weblibre.flutter_mozilla_components.pigeons.GeckoAddonsApi
import eu.weblibre.flutter_mozilla_components.pigeons.GeckoAppLinksApi
import eu.weblibre.flutter_mozilla_components.pigeons.GeckoBookmarksApi
@@ -165,6 +166,7 @@ class GeckoBrowserApiImpl : GeckoBrowserApi {
addonCollection: AddonCollection?,
fxaServerOverride: String?,
syncTokenServerOverride: String?,
startupSettings: GeckoEngineSettings?,
) {
synchronized(this) {
if (!isGeckoInitialized) {
@@ -179,6 +181,9 @@ class GeckoBrowserApiImpl : GeckoBrowserApi {
Log.addSink(PriorityAwareLogSink(level, geckoLogging))
// Store startup settings before runtime creation
GlobalComponents.startupSettings = startupSettings
setupGeckoEngine(
profileFolder,
level,
@@ -242,6 +242,34 @@ class GeckoEngineSettingsApiImpl : GeckoEngineSettingsApi {
// components.core.engineSettings.automaticLanguageAdjustment = false
components.core.runtime.settings.locales = settings.locales.toTypedArray()
}
// Web Content Settings
if(settings.webFontsEnabled != null) {
components.core.engineSettings.webFontsEnabled = settings.webFontsEnabled
}
if(settings.automaticFontSizeAdjustment != null) {
components.core.engineSettings.automaticFontSizeAdjustment = settings.automaticFontSizeAdjustment
}
if(settings.fontSizeFactor != null && settings.automaticFontSizeAdjustment != true) {
components.core.engineSettings.fontSizeFactor = settings.fontSizeFactor.toFloat()
}
if(settings.fontInflationEnabled != null && settings.automaticFontSizeAdjustment != true) {
components.core.engineSettings.fontInflationEnabled = settings.fontInflationEnabled
}
if(settings.inputAutoZoomEnabled != null) {
components.core.runtime.settings.inputAutoZoomEnabled = settings.inputAutoZoomEnabled
}
// LNA Settings
if(settings.lnaBlocking != null) {
components.core.engineSettings.lnaBlockingEnabled = settings.lnaBlocking
}
if(settings.lnaBlockTrackers != null) {
components.core.engineSettings.lnaTrackerBlockingEnabled = settings.lnaBlockTrackers
}
if(settings.lnaEnabled != null) {
components.core.engineSettings.lnaFeatureEnabled = settings.lnaEnabled
}
}
override fun updateRuntimeSettings(settings: GeckoEngineSettings) {
@@ -313,6 +341,36 @@ class GeckoEngineSettingsApiImpl : GeckoEngineSettingsApi {
components.core.engine.settings.fingerprintingProtectionOverrides = components.core.engineSettings.fingerprintingProtectionOverrides
}
// Web Content runtime settings
if(settings.webFontsEnabled != null) {
components.core.engine.settings.webFontsEnabled = components.core.engineSettings.webFontsEnabled
reloadSession = true
}
if(settings.automaticFontSizeAdjustment != null) {
components.core.engine.settings.automaticFontSizeAdjustment = components.core.engineSettings.automaticFontSizeAdjustment
}
if(settings.fontSizeFactor != null) {
components.core.engine.settings.fontSizeFactor = components.core.engineSettings.fontSizeFactor
reloadSession = true
}
if(settings.fontInflationEnabled != null) {
components.core.engine.settings.fontInflationEnabled = components.core.engineSettings.fontInflationEnabled
reloadSession = true
}
// LNA settings
if(settings.lnaEnabled != null) {
components.core.engine.settings.lnaFeatureEnabled = components.core.engineSettings.lnaFeatureEnabled
reloadSession = true
}
if(settings.lnaBlocking != null) {
components.core.engine.settings.lnaBlockingEnabled = components.core.engineSettings.lnaBlockingEnabled
reloadSession = true
}
if(settings.lnaBlockTrackers != null) {
components.core.engine.settings.lnaTrackerBlockingEnabled = components.core.engineSettings.lnaTrackerBlockingEnabled
reloadSession = true
}
if(reloadSession) {
components.useCases.sessionUseCases.reload()
}
@@ -2291,7 +2291,21 @@ data class GeckoEngineSettings (
/** Allow baseline tracking protection exceptions (prevents major site breakage) */
val allowListBaseline: Boolean? = null,
/** Allow convenience tracking protection exceptions (fixes minor issues) */
val allowListConvenience: Boolean? = null
val allowListConvenience: Boolean? = null,
val webFontsEnabled: Boolean? = null,
val automaticFontSizeAdjustment: Boolean? = null,
val fontSizeFactor: Double? = null,
val fontInflationEnabled: Boolean? = null,
val displayDensityOverride: Double? = null,
val screenWidthOverride: Long? = null,
val screenHeightOverride: Long? = null,
val inputAutoZoomEnabled: Boolean? = null,
val fissionEnabled: Boolean? = null,
val isolatedProcessEnabled: Boolean? = null,
val appZygoteProcessEnabled: Boolean? = null,
val lnaBlocking: Boolean? = null,
val lnaBlockTrackers: Boolean? = null,
val lnaEnabled: Boolean? = null
)
{
companion object {
@@ -2323,7 +2337,21 @@ data class GeckoEngineSettings (
val suspectedFingerprintersScope = pigeonVar_list[24] as TrackingScope?
val allowListBaseline = pigeonVar_list[25] as Boolean?
val allowListConvenience = pigeonVar_list[26] 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)
val webFontsEnabled = pigeonVar_list[27] as Boolean?
val automaticFontSizeAdjustment = pigeonVar_list[28] as Boolean?
val fontSizeFactor = pigeonVar_list[29] as Double?
val fontInflationEnabled = pigeonVar_list[30] as Boolean?
val displayDensityOverride = pigeonVar_list[31] as Double?
val screenWidthOverride = pigeonVar_list[32] as Long?
val screenHeightOverride = pigeonVar_list[33] as Long?
val inputAutoZoomEnabled = pigeonVar_list[34] as Boolean?
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)
}
}
fun toList(): List<Any?> {
@@ -2355,6 +2383,20 @@ data class GeckoEngineSettings (
suspectedFingerprintersScope,
allowListBaseline,
allowListConvenience,
webFontsEnabled,
automaticFontSizeAdjustment,
fontSizeFactor,
fontInflationEnabled,
displayDensityOverride,
screenWidthOverride,
screenHeightOverride,
inputAutoZoomEnabled,
fissionEnabled,
isolatedProcessEnabled,
appZygoteProcessEnabled,
lnaBlocking,
lnaBlockTrackers,
lnaEnabled,
)
}
override fun equals(other: Any?): Boolean {
@@ -4793,7 +4835,7 @@ private open class GeckoPigeonCodec : StandardMessageCodec() {
/** Generated interface from Pigeon that represents a handler of messages from Flutter. */
interface GeckoBrowserApi {
fun getGeckoVersion(): String
fun initialize(profileFolder: String, logLevel: LogLevel, contentBlocking: ContentBlocking, addonCollection: AddonCollection?, fxaServerOverride: String?, syncTokenServerOverride: String?)
fun initialize(profileFolder: String, logLevel: LogLevel, contentBlocking: ContentBlocking, addonCollection: AddonCollection?, fxaServerOverride: String?, syncTokenServerOverride: String?, startupSettings: GeckoEngineSettings?)
fun showNativeFragment(): Boolean
fun onTrimMemory(level: Long)
fun openInCustomTab(url: String, private: Boolean, contextId: String?)
@@ -4833,8 +4875,9 @@ interface GeckoBrowserApi {
val addonCollectionArg = args[3] as AddonCollection?
val fxaServerOverrideArg = args[4] as String?
val syncTokenServerOverrideArg = args[5] as String?
val startupSettingsArg = args[6] as GeckoEngineSettings?
val wrapped: List<Any?> = try {
api.initialize(profileFolderArg, logLevelArg, contentBlockingArg, addonCollectionArg, fxaServerOverrideArg, syncTokenServerOverrideArg)
api.initialize(profileFolderArg, logLevelArg, contentBlockingArg, addonCollectionArg, fxaServerOverrideArg, syncTokenServerOverrideArg, startupSettingsArg)
listOf(null)
} catch (exception: Throwable) {
GeckoPigeonUtils.wrapError(exception)