summaryrefslogtreecommitdiffstats
path: root/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/RuntimeSettingsTest.kt
diff options
context:
space:
mode:
Diffstat (limited to 'mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/RuntimeSettingsTest.kt')
-rw-r--r--mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/RuntimeSettingsTest.kt415
1 files changed, 415 insertions, 0 deletions
diff --git a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/RuntimeSettingsTest.kt b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/RuntimeSettingsTest.kt
new file mode 100644
index 0000000000..6504af8a4c
--- /dev/null
+++ b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/RuntimeSettingsTest.kt
@@ -0,0 +1,415 @@
+/* -*- Mode: Java; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: nil; -*-
+ * Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+package org.mozilla.geckoview.test
+
+import android.provider.Settings
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.MediumTest
+import androidx.test.platform.app.InstrumentationRegistry
+import junit.framework.TestCase.assertTrue
+import org.hamcrest.Matchers.* // ktlint-disable no-wildcard-imports
+import org.junit.Assume.assumeThat
+import org.junit.Ignore
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mozilla.geckoview.BuildConfig
+import org.mozilla.geckoview.GeckoResult
+import org.mozilla.geckoview.GeckoSession
+import org.mozilla.geckoview.GeckoSession.NavigationDelegate
+import org.mozilla.geckoview.GeckoSession.ProgressDelegate
+import org.mozilla.geckoview.WebRequestError
+import org.mozilla.geckoview.test.rule.GeckoSessionTestRule.AssertCalled
+
+@RunWith(AndroidJUnit4::class)
+@MediumTest
+class RuntimeSettingsTest : BaseSessionTest() {
+
+ @Ignore("disable test for frequently failing Bug 1538430")
+ @Test
+ fun automaticFontSize() {
+ val settings = sessionRule.runtime.settings
+ var initialFontSize = 2.15f
+ var initialFontInflation = true
+ settings.fontSizeFactor = initialFontSize
+ assertThat(
+ "initial font scale $initialFontSize set",
+ settings.fontSizeFactor.toDouble(),
+ closeTo(initialFontSize.toDouble(), 0.05),
+ )
+ settings.fontInflationEnabled = initialFontInflation
+ assertThat(
+ "font inflation initially set to $initialFontInflation",
+ settings.fontInflationEnabled,
+ `is`(initialFontInflation),
+ )
+
+ settings.automaticFontSizeAdjustment = true
+ val contentResolver = InstrumentationRegistry.getInstrumentation().targetContext.contentResolver
+ val expectedFontSizeFactor = Settings.System.getFloat(
+ contentResolver,
+ Settings.System.FONT_SCALE,
+ 1.0f,
+ )
+ assertThat(
+ "Gecko font scale should match system font scale",
+ settings.fontSizeFactor.toDouble(),
+ closeTo(expectedFontSizeFactor.toDouble(), 0.05),
+ )
+ assertThat(
+ "font inflation enabled",
+ settings.fontInflationEnabled,
+ `is`(initialFontInflation),
+ )
+
+ settings.automaticFontSizeAdjustment = false
+ assertThat(
+ "Gecko font scale restored to previous value",
+ settings.fontSizeFactor.toDouble(),
+ closeTo(initialFontSize.toDouble(), 0.05),
+ )
+ assertThat(
+ "font inflation restored to previous value",
+ settings.fontInflationEnabled,
+ `is`(initialFontInflation),
+ )
+
+ // Now check with that with font inflation initially off, the initial state is still
+ // restored correctly after switching auto mode back off.
+ // Also reset font size factor back to its default value of 1.0f.
+ initialFontSize = 1.0f
+ initialFontInflation = false
+ settings.fontSizeFactor = initialFontSize
+ assertThat(
+ "initial font scale $initialFontSize set",
+ settings.fontSizeFactor.toDouble(),
+ closeTo(initialFontSize.toDouble(), 0.05),
+ )
+ settings.fontInflationEnabled = initialFontInflation
+ assertThat(
+ "font inflation initially set to $initialFontInflation",
+ settings.fontInflationEnabled,
+ `is`(initialFontInflation),
+ )
+
+ settings.automaticFontSizeAdjustment = true
+ assertThat(
+ "Gecko font scale should match system font scale",
+ settings.fontSizeFactor.toDouble(),
+ closeTo(expectedFontSizeFactor.toDouble(), 0.05),
+ )
+ assertThat(
+ "font inflation enabled",
+ settings.fontInflationEnabled,
+ `is`(initialFontInflation),
+ )
+
+ settings.automaticFontSizeAdjustment = false
+ assertThat(
+ "Gecko font scale restored to previous value",
+ settings.fontSizeFactor.toDouble(),
+ closeTo(initialFontSize.toDouble(), 0.05),
+ )
+ assertThat(
+ "font inflation restored to previous value",
+ settings.fontInflationEnabled,
+ `is`(initialFontInflation),
+ )
+ }
+
+ @Ignore // Bug 1546297 disabled test on pgo for frequent failures
+ @Test
+ fun fontSize() {
+ val settings = sessionRule.runtime.settings
+ settings.fontSizeFactor = 1.0f
+ mainSession.loadTestPath(HELLO_HTML_PATH)
+ sessionRule.waitForPageStop()
+
+ val fontSizeJs = "parseFloat(window.getComputedStyle(document.querySelector('p')).fontSize)"
+ val initialFontSize = mainSession.evaluateJS(fontSizeJs) as Double
+
+ val textSizeFactor = 2.0f
+ settings.fontSizeFactor = textSizeFactor
+ mainSession.reload()
+ sessionRule.waitForPageStop()
+ var fontSize = mainSession.evaluateJS(fontSizeJs) as Double
+ val expectedFontSize = initialFontSize * textSizeFactor
+ assertThat(
+ "old text size ${initialFontSize}px, new size should be ${expectedFontSize}px",
+ fontSize,
+ closeTo(expectedFontSize, 0.1),
+ )
+
+ settings.fontSizeFactor = 1.0f
+ mainSession.reload()
+ sessionRule.waitForPageStop()
+ fontSize = mainSession.evaluateJS(fontSizeJs) as Double
+ assertThat(
+ "text size should be ${initialFontSize}px again",
+ fontSize,
+ closeTo(initialFontSize, 0.1),
+ )
+ }
+
+ @Test fun fontInflation() {
+ val baseFontInflationMinTwips = 120
+ val settings = sessionRule.runtime.settings
+
+ settings.fontInflationEnabled = false
+ settings.fontSizeFactor = 1.0f
+ val fontInflationPref = "font.size.inflation.minTwips"
+
+ var prefValue = (sessionRule.getPrefs(fontInflationPref)[0] as Int)
+ assertThat(
+ "Gecko font inflation pref should be turned off",
+ prefValue,
+ `is`(0),
+ )
+
+ settings.fontInflationEnabled = true
+ prefValue = (sessionRule.getPrefs(fontInflationPref)[0] as Int)
+ assertThat(
+ "Gecko font inflation pref should be turned on",
+ prefValue,
+ `is`(baseFontInflationMinTwips),
+ )
+
+ settings.fontSizeFactor = 2.0f
+ prefValue = (sessionRule.getPrefs(fontInflationPref)[0] as Int)
+ assertThat(
+ "Gecko font inflation pref should scale with increased font size factor",
+ prefValue,
+ greaterThan(baseFontInflationMinTwips),
+ )
+
+ settings.fontSizeFactor = 0.5f
+ prefValue = (sessionRule.getPrefs(fontInflationPref)[0] as Int)
+ assertThat(
+ "Gecko font inflation pref should scale with decreased font size factor",
+ prefValue,
+ lessThan(baseFontInflationMinTwips),
+ )
+
+ settings.fontSizeFactor = 0.0f
+ prefValue = (sessionRule.getPrefs(fontInflationPref)[0] as Int)
+ assertThat(
+ "setting font size factor to 0 turns off font inflation",
+ prefValue,
+ `is`(0),
+ )
+ assertThat(
+ "GeckoRuntimeSettings returns new font inflation state, too",
+ settings.fontInflationEnabled,
+ `is`(false),
+ )
+
+ settings.fontSizeFactor = 1.0f
+ prefValue = (sessionRule.getPrefs(fontInflationPref)[0] as Int)
+ assertThat(
+ "Gecko font inflation pref remains turned off",
+ prefValue,
+ `is`(0),
+ )
+ assertThat(
+ "GeckoRuntimeSettings remains turned off",
+ settings.fontInflationEnabled,
+ `is`(false),
+ )
+ }
+
+ @Test
+ fun largeKeepaliveFactor() {
+ val defaultLargeKeepaliveFactor = 10
+ val settings = sessionRule.runtime.settings
+
+ val largeKeepaliveFactorPref = "network.http.largeKeepaliveFactor"
+ var prefValue = (sessionRule.getPrefs(largeKeepaliveFactorPref)[0] as Int)
+ assertThat(
+ "default LargeKeepaliveFactor should be 10",
+ prefValue,
+ `is`(defaultLargeKeepaliveFactor),
+ )
+
+ for (factor in 1..10) {
+ settings.setLargeKeepaliveFactor(factor)
+ prefValue = (sessionRule.getPrefs(largeKeepaliveFactorPref)[0] as Int)
+ assertThat(
+ "setting LargeKeepaliveFactor to an integer value between 1..10 should work",
+ prefValue,
+ `is`(factor),
+ )
+ }
+
+ val sanitizedDefaultLargeKeepaliveFactor = 1
+
+ /**
+ * Setting an invalid factor will cause an exception to be throw in debug build.
+ * otherwise, the factor will be reset to default when an invalid factor is given.
+ */
+ try {
+ settings.setLargeKeepaliveFactor(128)
+ prefValue = (sessionRule.getPrefs(largeKeepaliveFactorPref)[0] as Int)
+ assertThat(
+ "set LargeKeepaliveFactor to default when input is invalid",
+ prefValue,
+ `is`(sanitizedDefaultLargeKeepaliveFactor),
+ )
+ } catch (e: Exception) {
+ if (BuildConfig.DEBUG_BUILD) {
+ assertTrue("Should have an exception in DEBUG_BUILD", true)
+ }
+ }
+ }
+
+ @Test
+ fun aboutConfig() {
+ // This is broken in automation because document channel is enabled by default
+ assumeThat(sessionRule.env.isAutomation, equalTo(false))
+ val settings = sessionRule.runtime.settings
+
+ assertThat(
+ "about:config should be disabled by default",
+ settings.aboutConfigEnabled,
+ equalTo(false),
+ )
+
+ mainSession.loadUri("about:config")
+ mainSession.waitUntilCalled(object : NavigationDelegate {
+ @AssertCalled
+ override fun onLoadError(session: GeckoSession, uri: String?, error: WebRequestError):
+ GeckoResult<String>? {
+ assertThat("about:config should not load.", uri, equalTo("about:config"))
+ return null
+ }
+ })
+
+ settings.aboutConfigEnabled = true
+
+ mainSession.delegateDuringNextWait(object : ProgressDelegate {
+ @AssertCalled
+ override fun onPageStop(session: GeckoSession, success: Boolean) {
+ assertThat("about:config load should succeed", success, equalTo(true))
+ }
+ })
+
+ mainSession.loadUri("about:config")
+ mainSession.waitForPageStop()
+ }
+
+ @Test
+ fun globalPrivacyControlEnabling() {
+ mainSession.loadTestPath(HELLO_HTML_PATH)
+ mainSession.waitForPageStop()
+
+ val geckoRuntimeSettings = sessionRule.runtime.settings
+
+ geckoRuntimeSettings.setGlobalPrivacyControl(true)
+
+ val gpcValue = mainSession.evaluateJS(
+ "window.navigator.globalPrivacyControl",
+ )
+
+ assertThat(
+ "Global Privacy Control should now be enabled",
+ gpcValue,
+ equalTo(true),
+ )
+
+ assertThat(
+ "Global Privacy Control runtime settings should now be enabled in normal tabs",
+ geckoRuntimeSettings.globalPrivacyControl,
+ equalTo(true),
+ )
+
+ assertThat(
+ "Global Privacy Control runtime settings should still be enabled in private tabs",
+ geckoRuntimeSettings.globalPrivacyControlPrivateMode,
+ equalTo(true),
+ )
+
+ val globalPrivacyControl =
+ (sessionRule.getPrefs("privacy.globalprivacycontrol.enabled").get(0)) as Boolean
+ val globalPrivacyControlPrivateMode =
+ (sessionRule.getPrefs("privacy.globalprivacycontrol.pbmode.enabled").get(0)) as Boolean
+ val globalPrivacyControlFunctionality = (
+ sessionRule.getPrefs("privacy.globalprivacycontrol.functionality.enabled").get(0)
+ ) as Boolean
+
+ assertThat(
+ "Global Privacy Control should be enabled in normal tabs",
+ globalPrivacyControl,
+ equalTo(true),
+ )
+
+ assertThat(
+ "Global Privacy Control should still be in private tabs",
+ globalPrivacyControlPrivateMode,
+ equalTo(true),
+ )
+
+ assertThat(
+ "Global Privacy Control Functionality flag should be enabled",
+ globalPrivacyControlFunctionality,
+ equalTo(true),
+ )
+ }
+
+ @Test
+ fun globalPrivacyControlDisabling() {
+ mainSession.loadTestPath(HELLO_HTML_PATH)
+ mainSession.waitForPageStop()
+
+ val geckoRuntimeSettings = sessionRule.runtime.settings
+
+ geckoRuntimeSettings.setGlobalPrivacyControl(false)
+
+ val gpcValue = mainSession.evaluateJS(
+ "window.navigator.globalPrivacyControl",
+ )
+
+ assertThat(
+ "Global Privacy Control should now be disabled in normal mode",
+ gpcValue,
+ equalTo(false),
+ )
+
+ assertThat(
+ "Global Privacy Control runtime settings should now be enabled in normal tabs",
+ geckoRuntimeSettings.globalPrivacyControl,
+ equalTo(false),
+ )
+
+ assertThat(
+ "Global Privacy Control runtime settings should still be enabled in private tabs",
+ geckoRuntimeSettings.globalPrivacyControlPrivateMode,
+ equalTo(true),
+ )
+
+ val globalPrivacyControl =
+ (sessionRule.getPrefs("privacy.globalprivacycontrol.enabled").get(0)) as Boolean
+ val globalPrivacyControlPrivateMode =
+ (sessionRule.getPrefs("privacy.globalprivacycontrol.pbmode.enabled").get(0)) as Boolean
+ val globalPrivacyControlFunctionality = (
+ sessionRule.getPrefs("privacy.globalprivacycontrol.functionality.enabled").get(0)
+ ) as Boolean
+
+ assertThat(
+ "Global Privacy Control should be enabled in normal tabs",
+ globalPrivacyControl,
+ equalTo(false),
+ )
+
+ assertThat(
+ "Global Privacy Control should still be enabled in private tabs",
+ globalPrivacyControlPrivateMode,
+ equalTo(true),
+ )
+
+ assertThat(
+ "Global Privacy Control Functionality flag should still be enabled",
+ globalPrivacyControlFunctionality,
+ equalTo(true),
+ )
+ }
+}