From 34282b0d723652a284aa9655ed5b57000276507b Mon Sep 17 00:00:00 2001 From: mcarare <48995920+mcarare@users.noreply.github.com> Date: Fri, 24 Nov 2023 15:33:01 +0200 Subject: [PATCH] Bug 1865357 - Add Global Privacy Control settings. --- .../components/browser/engine/gecko/GeckoEngine.kt | 4 ++++ .../components/browser/engine/gecko/GeckoEngineTest.kt | 16 ++++++++++++++++ .../java/mozilla/components/concept/engine/Settings.kt | 6 ++++++ mobile/android/docs/changelog.md | 1 + .../src/main/java/org/mozilla/fenix/components/Core.kt | 1 + .../mozilla/fenix/settings/TrackingProtectionFragment.kt | 11 +++++++++++ .../src/main/java/org/mozilla/fenix/utils/Settings.kt | 5 +++++ .../fenix/app/src/main/res/values/preference_keys.xml | 1 + mobile/android/fenix/app/src/main/res/values/strings.xml | 2 ++ .../src/main/res/xml/tracking_protection_preferences.xml | 4 ++++ 10 files changed, 51 insertions(+) diff --git a/mobile/android/android-components/components/browser/engine-gecko/src/main/java/mozilla/components/browser/engine/gecko/GeckoEngine.kt b/mobile/android/android-components/components/browser/engine-gecko/src/main/java/mozilla/components/browser/engine/gecko/GeckoEngine.kt index dfb662c489df..4dc78b627def 100644 --- a/mobile/android/android-components/components/browser/engine-gecko/src/main/java/mozilla/components/browser/engine/gecko/GeckoEngine.kt +++ b/mobile/android/android-components/components/browser/engine-gecko/src/main/java/mozilla/components/browser/engine/gecko/GeckoEngine.kt @@ -1193,6 +1193,9 @@ class GeckoEngine( Engine.HttpsOnlyMode.ENABLED -> GeckoRuntimeSettings.HTTPS_ONLY } } + override var globalPrivacyControlEnabled: Boolean + get() = runtime.settings.globalPrivacyControl + set(value) { runtime.settings.setGlobalPrivacyControl(value) } }.apply { defaultSettings?.let { this.javascriptEnabled = it.javascriptEnabled @@ -1217,6 +1220,7 @@ class GeckoEngine( this.cookieBannerHandlingDetectOnlyMode = it.cookieBannerHandlingDetectOnlyMode this.cookieBannerHandlingGlobalRules = it.cookieBannerHandlingGlobalRules this.cookieBannerHandlingGlobalRulesSubFrames = it.cookieBannerHandlingGlobalRulesSubFrames + this.globalPrivacyControlEnabled = it.globalPrivacyControlEnabled } } diff --git a/mobile/android/android-components/components/browser/engine-gecko/src/test/java/mozilla/components/browser/engine/gecko/GeckoEngineTest.kt b/mobile/android/android-components/components/browser/engine-gecko/src/test/java/mozilla/components/browser/engine/gecko/GeckoEngineTest.kt index c13e85228adc..ae4860bf8e51 100644 --- a/mobile/android/android-components/components/browser/engine-gecko/src/test/java/mozilla/components/browser/engine/gecko/GeckoEngineTest.kt +++ b/mobile/android/android-components/components/browser/engine-gecko/src/test/java/mozilla/components/browser/engine/gecko/GeckoEngineTest.kt @@ -3199,6 +3199,22 @@ class GeckoEngineTest { } } + @Test + fun `WHEN Global Privacy Control value is set THEN setGlobalPrivacyControl is getting called on GeckoRuntime`() { + val mockRuntime = mock() + whenever(mockRuntime.settings).thenReturn(mock()) + + val engine = GeckoEngine(testContext, runtime = mockRuntime) + + reset(mockRuntime.settings) + engine.settings.globalPrivacyControlEnabled = true + verify(mockRuntime.settings).setGlobalPrivacyControl(true) + + reset(mockRuntime.settings) + engine.settings.globalPrivacyControlEnabled = false + verify(mockRuntime.settings).setGlobalPrivacyControl(false) + } + private fun createSocialTrackersLogEntryList(): List { val blockedLogEntry = object : ContentBlockingController.LogEntry() {} diff --git a/mobile/android/android-components/components/concept/engine/src/main/java/mozilla/components/concept/engine/Settings.kt b/mobile/android/android-components/components/concept/engine/src/main/java/mozilla/components/concept/engine/Settings.kt index 18b0b82ec9e3..c169848f8aac 100644 --- a/mobile/android/android-components/components/concept/engine/src/main/java/mozilla/components/concept/engine/Settings.kt +++ b/mobile/android/android-components/components/concept/engine/src/main/java/mozilla/components/concept/engine/Settings.kt @@ -241,6 +241,11 @@ abstract class Settings { * Setting the HTTPS-Only mode for upgrading connections to HTTPS. */ open var httpsOnlyMode: Engine.HttpsOnlyMode by UnsupportedSetting() + + /** + * Setting to control whether Global Privacy Control isenabled. + */ + open var globalPrivacyControlEnabled: Boolean by UnsupportedSetting() } /** @@ -279,6 +284,7 @@ data class DefaultSettings( override var clearColor: Int? = null, override var enterpriseRootsEnabled: Boolean = false, override var httpsOnlyMode: Engine.HttpsOnlyMode = Engine.HttpsOnlyMode.DISABLED, + override var globalPrivacyControlEnabled: Boolean = false, override var cookieBannerHandlingMode: CookieBannerHandlingMode = CookieBannerHandlingMode.DISABLED, override var cookieBannerHandlingModePrivateBrowsing: CookieBannerHandlingMode = CookieBannerHandlingMode.DISABLED, diff --git a/mobile/android/docs/changelog.md b/mobile/android/docs/changelog.md index 56eadd4e378a..c285296efc58 100644 --- a/mobile/android/docs/changelog.md +++ b/mobile/android/docs/changelog.md @@ -22,6 +22,7 @@ permalink: /changelog/ * **browser-engine-gecko** * Enable nested scrolling on `GeckoEngineView` as required by `NestedGeckoView`. [Bug 1847305](https://bugzilla.mozilla.org/show_bug.cgi?id=1847305) * `NestedGeckoView` now disallows touch interception until we receive a response from `GeckoView#onTouchEventForDetailResult`. [Bug 1847305](https://bugzilla.mozilla.org/show_bug.cgi?id=1847305) + * Add `globalPrivacyControlEnabled` setting to allow enabling Global Privacy Control in normal browsing. This is always enabled in private browsing. [Bug 1865357](https://bugzilla.mozilla.org/show_bug.cgi?id=1865357) # 121.0 * [Commits](https://github.com/mozilla-mobile/firefox-android/compare/releases_v120..releases_v121) diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/Core.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/Core.kt index b9a73a5df072..060131ebca15 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/Core.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/Core.kt @@ -142,6 +142,7 @@ class Core( R.color.fx_mobile_layer_color_1, ), httpsOnlyMode = context.settings().getHttpsOnlyMode(), + globalPrivacyControlEnabled = context.settings().shouldEnableGlobalPrivacyControl, cookieBannerHandlingMode = context.settings().getCookieBannerHandling(), cookieBannerHandlingModePrivateBrowsing = context.settings().getCookieBannerHandlingPrivateMode(), cookieBannerHandlingDetectOnlyMode = context.settings().shouldEnableCookieBannerDetectOnly, diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/TrackingProtectionFragment.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/TrackingProtectionFragment.kt index 660e82db2bb0..6851434d31e8 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/TrackingProtectionFragment.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/TrackingProtectionFragment.kt @@ -11,6 +11,7 @@ import androidx.preference.CheckBoxPreference import androidx.preference.DropDownPreference import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat +import androidx.preference.SwitchPreference import org.mozilla.fenix.BrowserDirection import org.mozilla.fenix.GleanMetrics.TrackingProtection import org.mozilla.fenix.HomeActivity @@ -103,6 +104,16 @@ class TrackingProtectionFragment : PreferenceFragmentCompat() { val preferenceExceptions = requirePreference(R.string.pref_key_tracking_protection_exceptions) preferenceExceptions.onPreferenceClickListener = exceptionsClickListener + + requirePreference(R.string.pref_key_privacy_enable_global_privacy_control).apply { + onPreferenceChangeListener = object : SharedPreferenceUpdater() { + override fun onPreferenceChange(preference: Preference, newValue: Any?): Boolean { + context.components.core.engine.settings.globalPrivacyControlEnabled = newValue as Boolean + context.components.useCases.sessionUseCases.reload.invoke() + return super.onPreferenceChange(preference, newValue) + } + } + } } private fun bindTrackingProtectionRadio( diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt index 63c9d26e9a34..88993888569b 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt @@ -616,6 +616,11 @@ class Settings(private val appContext: Context) : PreferencesHolder { default = true, ) + var shouldEnableGlobalPrivacyControl by booleanPreference( + appContext.getPreferenceKey(R.string.pref_key_privacy_enable_global_privacy_control), + false, + ) + var shouldUseCookieBannerPrivateMode by lazyFeatureFlagPreference( appContext.getPreferenceKey(R.string.pref_key_cookie_banner_private_mode), featureFlag = true, diff --git a/mobile/android/fenix/app/src/main/res/values/preference_keys.xml b/mobile/android/fenix/app/src/main/res/values/preference_keys.xml index 53b3ed8f6ada..081135d961f9 100644 --- a/mobile/android/fenix/app/src/main/res/values/preference_keys.xml +++ b/mobile/android/fenix/app/src/main/res/values/preference_keys.xml @@ -218,6 +218,7 @@ pref_key_open_links_in_apps_never pref_key_external_download_manager pref_key_allow_screenshots_in_private_mode + pref_key_privacy_enable_global_privacy_control pref_key_adjust_campaign pref_key_adjust_network diff --git a/mobile/android/fenix/app/src/main/res/values/strings.xml b/mobile/android/fenix/app/src/main/res/values/strings.xml index 9763a096b7ac..cbfebfd7ba46 100644 --- a/mobile/android/fenix/app/src/main/res/values/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values/strings.xml @@ -1544,6 +1544,8 @@ All cookies (will cause websites to break) Isolate cross-site cookies + + Tell websites not to share & sell data Tracking content diff --git a/mobile/android/fenix/app/src/main/res/xml/tracking_protection_preferences.xml b/mobile/android/fenix/app/src/main/res/xml/tracking_protection_preferences.xml index 186fc8893f97..dafb55806d0c 100644 --- a/mobile/android/fenix/app/src/main/res/xml/tracking_protection_preferences.xml +++ b/mobile/android/fenix/app/src/main/res/xml/tracking_protection_preferences.xml @@ -77,6 +77,10 @@ android:key="@string/pref_key_tracking_protection_redirect_trackers" android:layout="@layout/checkbox_left_preference_etp" android:title="@string/etp_redirect_trackers_title" /> +