tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit 5302780bc645221c713a31954fee84e3a9071aa5
parent d4789cb490686e477365d554ccf18a49c50770e6
Author: t-p-white <towhite@mozilla.com>
Date:   Wed, 15 Oct 2025 11:18:37 +0000

Bug 1991528 - Remove Nimbus advanced targeting for user clicks on the ToU bottom sheet's links and buttons. r=android-reviewers,gmalekpour

Essentially reverts the following patches:
- https://phabricator.services.mozilla.com/D260845
- https://phabricator.services.mozilla.com/D260822

Differential Revision: https://phabricator.services.mozilla.com/D268391

Diffstat:
Mmobile/android/fenix/app/metrics.yaml | 6++----
Mmobile/android/fenix/app/src/main/java/org/mozilla/fenix/experiments/RecordedNimbusContext.kt | 10----------
Mmobile/android/fenix/app/src/main/java/org/mozilla/fenix/termsofuse/store/TermsOfUsePromptPreferencesMiddleware.kt | 13+++++++------
Mmobile/android/fenix/app/src/main/java/org/mozilla/fenix/termsofuse/store/TermsOfUsePromptRepository.kt | 18------------------
Mmobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt | 16----------------
Mmobile/android/fenix/app/src/main/res/values/preference_keys.xml | 2--
Mmobile/android/fenix/app/src/test/java/org/mozilla/fenix/experiments/RecordedNimbusContextTest.kt | 4----
Mmobile/android/fenix/app/src/test/java/org/mozilla/fenix/termsofuse/store/TermsOfUsePromptPreferencesMiddlewareTest.kt | 69+++++++++++----------------------------------------------------------
8 files changed, 20 insertions(+), 118 deletions(-)

diff --git a/mobile/android/fenix/app/metrics.yaml b/mobile/android/fenix/app/metrics.yaml @@ -12906,10 +12906,6 @@ nimbus_system: type: boolean no_shortcuts_or_stories_opt_outs: type: boolean - user_clicked_tou_prompt_link: - type: boolean - user_clicked_tou_prompt_remind_me_later: - type: boolean description: | The Nimbus context object that is recorded to Glean bugs: @@ -12918,12 +12914,14 @@ nimbus_system: - 'https://bugzilla.mozilla.org/show_bug.cgi?id=1970165' - 'https://bugzilla.mozilla.org/show_bug.cgi?id=1981877' - 'https://bugzilla.mozilla.org/show_bug.cgi?id=1984639' + - 'https://bugzilla.mozilla.org/show_bug.cgi?id=1991528' data_reviews: - 'https://bugzilla.mozilla.org/show_bug.cgi?id=1898552#c3' - 'https://phabricator.services.mozilla.com/D258942' - 'https://phabricator.services.mozilla.com/D259407' - 'https://phabricator.services.mozilla.com/D260845' - 'https://phabricator.services.mozilla.com/D262139' + - 'https://phabricator.services.mozilla.com/D268391' data_sensitivity: - interaction notification_emails: diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/experiments/RecordedNimbusContext.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/experiments/RecordedNimbusContext.kt @@ -62,8 +62,6 @@ class RecordedNimbusContext( val deviceModel: String = Build.MODEL, val userAcceptedTou: Boolean, val noShortcutsOrStoriesOptOuts: Boolean, - val userClickedTouPromptLink: Boolean, - val userClickedTouPromptRemindMeLater: Boolean, ) : RecordedContext { /** * [getEventQueries] is called by the Nimbus SDK Rust code to retrieve the map of event @@ -104,8 +102,6 @@ class RecordedNimbusContext( deviceModel = deviceModel, userAcceptedTou = userAcceptedTou, noShortcutsOrStoriesOptOuts = noShortcutsOrStoriesOptOuts, - userClickedTouPromptLink = userClickedTouPromptLink, - userClickedTouPromptRemindMeLater = userClickedTouPromptRemindMeLater, ), ) Pings.nimbus.submit() @@ -151,8 +147,6 @@ class RecordedNimbusContext( "device_model" to deviceModel, "user_accepted_tou" to userAcceptedTou, "no_shortcuts_or_stories_opt_outs" to noShortcutsOrStoriesOptOuts, - "user_clicked_tou_prompt_link" to userClickedTouPromptLink, - "user_clicked_tou_prompt_remind_me_later" to userClickedTouPromptRemindMeLater, ), ) return obj @@ -200,8 +194,6 @@ class RecordedNimbusContext( region = calculatedAttributes.region, userAcceptedTou = settings.hasAcceptedTermsOfService, noShortcutsOrStoriesOptOuts = settings.noShortcutsOrStoriesOptOuts(context), - userClickedTouPromptLink = settings.hasClickedTermOfUsePromptLink, - userClickedTouPromptRemindMeLater = settings.hasClickedTermOfUsePromptRemindMeLater, ) } @@ -258,8 +250,6 @@ class RecordedNimbusContext( region = "US", userAcceptedTou = true, noShortcutsOrStoriesOptOuts = true, - userClickedTouPromptLink = true, - userClickedTouPromptRemindMeLater = true, ) } } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/termsofuse/store/TermsOfUsePromptPreferencesMiddleware.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/termsofuse/store/TermsOfUsePromptPreferencesMiddleware.kt @@ -25,15 +25,9 @@ class TermsOfUsePromptPreferencesMiddleware( repository.updateHasAcceptedTermsOfUsePreference() is TermsOfUsePromptAction.OnRemindMeLaterClicked -> { - repository.updateHasClickedTermOfUsePromptRemindMeLaterPreference() repository.updateHasPostponedAcceptingTermsOfUsePreference() } - is TermsOfUsePromptAction.OnLearnMoreClicked, - is TermsOfUsePromptAction.OnPrivacyNoticeClicked, - is TermsOfUsePromptAction.OnTermsOfUseClicked, - -> repository.updateHasClickedTermOfUsePromptLinkPreference() - is TermsOfUsePromptAction.OnPromptManuallyDismissed -> repository.updateHasPostponedAcceptingTermsOfUsePreference() @@ -42,6 +36,13 @@ class TermsOfUsePromptPreferencesMiddleware( is TermsOfUsePromptAction.OnImpression -> repository.incrementTermsOfUsePromptDisplayedCount() + + // no-ops + is TermsOfUsePromptAction.OnLearnMoreClicked, + is TermsOfUsePromptAction.OnPrivacyNoticeClicked, + is TermsOfUsePromptAction.OnTermsOfUseClicked, + -> { + } } next(action) diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/termsofuse/store/TermsOfUsePromptRepository.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/termsofuse/store/TermsOfUsePromptRepository.kt @@ -31,16 +31,6 @@ interface TermsOfUsePromptRepository { fun updateLastTermsOfUsePromptTimeInMillis(currentTimeInMillis: Long = System.currentTimeMillis()) /** - * Updates the 'has clicked the term of use prompt link' preference to true. - */ - fun updateHasClickedTermOfUsePromptLinkPreference() - - /** - * Updates the 'has clicked the term of use prompt "remind me later" action' preference to true. - */ - fun updateHasClickedTermOfUsePromptRemindMeLaterPreference() - - /** * Increments the number of times the Terms of Use prompt has been displayed by 1. */ fun incrementTermsOfUsePromptDisplayedCount() @@ -68,14 +58,6 @@ class DefaultTermsOfUsePromptRepository( settings.lastTermsOfUsePromptTimeInMillis = currentTimeInMillis } - override fun updateHasClickedTermOfUsePromptLinkPreference() { - settings.hasClickedTermOfUsePromptLink = true - } - - override fun updateHasClickedTermOfUsePromptRemindMeLaterPreference() { - settings.hasClickedTermOfUsePromptRemindMeLater = true - } - override fun incrementTermsOfUsePromptDisplayedCount() { settings.termsOfUsePromptDisplayedCount++ } 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 @@ -672,22 +672,6 @@ class Settings(private val appContext: Context) : PreferencesHolder { ) /** - * Used to determine users who have interacted with any links from the Terms of Use prompt. - */ - var hasClickedTermOfUsePromptLink by booleanPreference( - appContext.getPreferenceKey(R.string.pref_key_terms_clicked_link), - default = false, - ) - - /** - * Used to determine users who clicked the "remind me later" action. - */ - var hasClickedTermOfUsePromptRemindMeLater by booleanPreference( - appContext.getPreferenceKey(R.string.pref_key_terms_clicked_remind_me_later), - default = false, - ) - - /** * The daily usage ping is not normally tied to normal telemetry. We set the default value to * [isTelemetryEnabled] because this setting was added in early 2025 and we want to make * sure that users who upgrade and had telemetry disabled don't start sending the 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 @@ -90,8 +90,6 @@ <string name="pref_key_terms_last_prompt_time" translatable="false">pref_key_terms_last_prompt_time</string> <string name="pref_key_terms_postponed" translatable="false">pref_key_terms_postponed</string> <string name="pref_key_debug_terms_trigger_time" translatable="false">pref_key_debug_terms_trigger_time</string> - <string name="pref_key_terms_clicked_link" translatable="false">pref_key_terms_clicked_link</string> - <string name="pref_key_terms_clicked_remind_me_later" translatable="false">pref_key_terms_clicked_remind_me_later</string> <string name="pref_key_should_show_marketing_onboarding" translatable="false">pref_key_should_show_marketing_onboarding</string> <string name="pref_key_use_onboarding_redesign" translatable="false">pref_key_use_onboarding_redesign</string> <string name="pref_key_crash_pull_never_show_again" translatable="false">pref_key_crash_pull_never_show_again</string> diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/experiments/RecordedNimbusContextTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/experiments/RecordedNimbusContextTest.kt @@ -71,8 +71,6 @@ class RecordedNimbusContextTest { put("device_model", Build.MODEL) put("user_accepted_tou", true) put("no_shortcuts_or_stories_opt_outs", true) - put("user_clicked_tou_prompt_link", true) - put("user_clicked_tou_prompt_remind_me_later", true) }, contextAsJson, ) @@ -117,8 +115,6 @@ class RecordedNimbusContextTest { put("region", "US") put("userAcceptedTou", true) put("noShortcutsOrStoriesOptOuts", true) - put("userClickedTouPromptLink", true) - put("userClickedTouPromptRemindMeLater", true) }, recordedValue?.jsonObject, ) diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/termsofuse/store/TermsOfUsePromptPreferencesMiddlewareTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/termsofuse/store/TermsOfUsePromptPreferencesMiddlewareTest.kt @@ -48,8 +48,6 @@ class TermsOfUsePromptPreferencesMiddlewareTest { assertTrue(settings.hasAcceptedTermsOfService) assertFalse(settings.hasPostponedAcceptingTermsOfUse) - assertFalse(settings.hasClickedTermOfUsePromptLink) - assertFalse(settings.hasClickedTermOfUsePromptRemindMeLater) assertFalse(settings.lastTermsOfUsePromptTimeInMillis > 0) assertEquals(0, settings.termsOfUsePromptDisplayedCount) } @@ -66,8 +64,6 @@ class TermsOfUsePromptPreferencesMiddlewareTest { assertFalse(settings.hasAcceptedTermsOfService) assertTrue(settings.hasPostponedAcceptingTermsOfUse) - assertFalse(settings.hasClickedTermOfUsePromptLink) - assertTrue(settings.hasClickedTermOfUsePromptRemindMeLater) assertFalse(settings.lastTermsOfUsePromptTimeInMillis > 0) assertEquals(0, settings.termsOfUsePromptDisplayedCount) } @@ -84,8 +80,6 @@ class TermsOfUsePromptPreferencesMiddlewareTest { assertFalse(settings.hasAcceptedTermsOfService) assertTrue(settings.hasPostponedAcceptingTermsOfUse) - assertFalse(settings.hasClickedTermOfUsePromptLink) - assertFalse(settings.hasClickedTermOfUsePromptRemindMeLater) assertFalse(settings.lastTermsOfUsePromptTimeInMillis > 0) assertEquals(0, settings.termsOfUsePromptDisplayedCount) } @@ -102,90 +96,49 @@ class TermsOfUsePromptPreferencesMiddlewareTest { assertFalse(settings.hasAcceptedTermsOfService) assertFalse(settings.hasPostponedAcceptingTermsOfUse) - assertFalse(settings.hasClickedTermOfUsePromptLink) - assertFalse(settings.hasClickedTermOfUsePromptRemindMeLater) assertTrue(settings.lastTermsOfUsePromptTimeInMillis > 0) assertEquals(0, settings.termsOfUsePromptDisplayedCount) } @Test - fun `WHEN the OnLearnMoreClicked action is received THEN the expected preference is updated`() { + fun `WHEN the OnImpression action is received THEN the expected preference is updated`() { assertAllPrefsDefault() middleware.invoke( context = context, next = {}, - action = TermsOfUsePromptAction.OnLearnMoreClicked(Surface.HOMEPAGE_NEW_TAB), + action = TermsOfUsePromptAction.OnImpression(Surface.HOMEPAGE_NEW_TAB), ) assertFalse(settings.hasAcceptedTermsOfService) assertFalse(settings.hasPostponedAcceptingTermsOfUse) - assertTrue(settings.hasClickedTermOfUsePromptLink) - assertFalse(settings.hasClickedTermOfUsePromptRemindMeLater) assertFalse(settings.lastTermsOfUsePromptTimeInMillis > 0) - assertEquals(0, settings.termsOfUsePromptDisplayedCount) + assertEquals(1, settings.termsOfUsePromptDisplayedCount) } @Test - fun `WHEN the OnPrivacyNoticeClicked action is received THEN the expected preference is updated`() { - assertAllPrefsDefault() - - middleware.invoke( - context = context, - next = {}, - action = TermsOfUsePromptAction.OnPrivacyNoticeClicked(Surface.HOMEPAGE_NEW_TAB), - ) - - assertFalse(settings.hasAcceptedTermsOfService) - assertFalse(settings.hasPostponedAcceptingTermsOfUse) - assertTrue(settings.hasClickedTermOfUsePromptLink) - assertFalse(settings.hasClickedTermOfUsePromptRemindMeLater) - assertFalse(settings.lastTermsOfUsePromptTimeInMillis > 0) - assertEquals(0, settings.termsOfUsePromptDisplayedCount) + fun `WHEN action is noop THEN the repository settings are not updated`() { + assertNoOpAction(TermsOfUsePromptAction.OnLearnMoreClicked(Surface.HOMEPAGE_NEW_TAB)) + assertNoOpAction(TermsOfUsePromptAction.OnPrivacyNoticeClicked(Surface.HOMEPAGE_NEW_TAB)) + assertNoOpAction(TermsOfUsePromptAction.OnTermsOfUseClicked(Surface.HOMEPAGE_NEW_TAB)) } - @Test - fun `WHEN the OnTermsOfUseClicked action is received THEN the expected preference is updated`() { - assertAllPrefsDefault() - - middleware.invoke( - context = context, - next = {}, - action = TermsOfUsePromptAction.OnTermsOfUseClicked(Surface.HOMEPAGE_NEW_TAB), - ) - + private fun assertAllPrefsDefault() { assertFalse(settings.hasAcceptedTermsOfService) assertFalse(settings.hasPostponedAcceptingTermsOfUse) - assertTrue(settings.hasClickedTermOfUsePromptLink) - assertFalse(settings.hasClickedTermOfUsePromptRemindMeLater) assertFalse(settings.lastTermsOfUsePromptTimeInMillis > 0) assertEquals(0, settings.termsOfUsePromptDisplayedCount) } - @Test - fun `WHEN the OnImpression action is received THEN the expected preference is updated`() { + private fun assertNoOpAction(action: TermsOfUsePromptAction) { assertAllPrefsDefault() middleware.invoke( context = context, next = {}, - action = TermsOfUsePromptAction.OnImpression(Surface.HOMEPAGE_NEW_TAB), + action = action, ) - assertFalse(settings.hasAcceptedTermsOfService) - assertFalse(settings.hasPostponedAcceptingTermsOfUse) - assertFalse(settings.hasClickedTermOfUsePromptLink) - assertFalse(settings.hasClickedTermOfUsePromptRemindMeLater) - assertFalse(settings.lastTermsOfUsePromptTimeInMillis > 0) - assertEquals(1, settings.termsOfUsePromptDisplayedCount) - } - - private fun assertAllPrefsDefault() { - assertFalse(settings.hasAcceptedTermsOfService) - assertFalse(settings.hasPostponedAcceptingTermsOfUse) - assertFalse(settings.hasClickedTermOfUsePromptLink) - assertFalse(settings.hasClickedTermOfUsePromptRemindMeLater) - assertFalse(settings.lastTermsOfUsePromptTimeInMillis > 0) - assertEquals(0, settings.termsOfUsePromptDisplayedCount) + assertAllPrefsDefault() } }