tor-browser

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

commit 8d845f554d7c762d506142b182eefb0333f214f5
parent e9a6261c35b91674a7cb627283ac2d7c15e012c8
Author: Segun Famisa <sfamisa@mozilla.com>
Date:   Tue,  2 Dec 2025 13:07:49 +0000

Bug 2002831 - Clicking the "Learn more" link on site permissions prompt should open the support url r=android-reviewers,matt-tighe

This patch fixes the bug clicking the "learn more" link on a permission prompt like cross origin storage, does not open the associated web url.

This is because we dismiss the prompt before handling the click. Dismissing the prompt then causes the permission request to be consumed, such that by the time the learn more click action is being handled, there is no permission request in the state anymore.

Changes:
- Adjusted the `setOnClickListener` in `SitePermissionsDialogFragment.kt` to call `onLearnMorePress` before `dismiss`, ensuring the navigation action is triggered.
- Added a test in SitePermissionTest to cover this behavior

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

Diffstat:
Mmobile/android/android-components/components/feature/sitepermissions/src/main/java/mozilla/components/feature/sitepermissions/SitePermissionsDialogFragment.kt | 2+-
Mmobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/SitePermissionsTest.kt | 21+++++++++++++++++++++
Mmobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt | 6++++++
Mmobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SitePermissionsRobot.kt | 15+++++++++++++++
4 files changed, 43 insertions(+), 1 deletion(-)

diff --git a/mobile/android/android-components/components/feature/sitepermissions/src/main/java/mozilla/components/feature/sitepermissions/SitePermissionsDialogFragment.kt b/mobile/android/android-components/components/feature/sitepermissions/src/main/java/mozilla/components/feature/sitepermissions/SitePermissionsDialogFragment.kt @@ -169,8 +169,8 @@ internal open class SitePermissionsDialogFragment : AppCompatDialogFragment() { visibility = VISIBLE isLongClickable = false setOnClickListener { - dismiss() feature?.onLearnMorePress(permissionRequestId, sessionId, learnMoreLink) + dismiss() } } } diff --git a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/SitePermissionsTest.kt b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/SitePermissionsTest.kt @@ -20,6 +20,7 @@ import org.mozilla.fenix.helpers.HomeActivityIntentTestRule import org.mozilla.fenix.helpers.HomeActivityTestRule import org.mozilla.fenix.helpers.MockLocationUpdatesRule import org.mozilla.fenix.helpers.RetryTestRule +import org.mozilla.fenix.helpers.TestAssetHelper.getGenericAsset import org.mozilla.fenix.helpers.TestAssetHelper.waitingTimeLong import org.mozilla.fenix.helpers.TestHelper.appContext import org.mozilla.fenix.helpers.TestSetup @@ -333,4 +334,24 @@ class SitePermissionsTest : TestSetup() { verifyDoNotAskAgainIsHidden() } } + + @Test + fun crossOriginStoragePermissionLearnMoreLinkTest() { + val genericWebPage = mockWebServer.getGenericAsset(1) + val testPage = mockWebServer.url("pages/cross-site-cookies.html").toString().toUri() + val originHost = "mozilla-mobile.github.io" + val currentHost = "localhost" + + navigationToolbar { + }.enterURLAndEnterToBrowser(genericWebPage.url) { + waitForPageToLoad() + }.openNavigationToolbar { + }.enterURLAndEnterToBrowser(testPage) { + waitForPageToLoad() + }.clickRequestStorageAccessButton { + verifyCrossOriginCookiesPermissionPrompt(originHost, currentHost) + }.clickLearnMore { + verifyCrossOriginStorageLearnMoreURL() + } + } } diff --git a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BrowserRobot.kt @@ -202,6 +202,12 @@ class BrowserRobot { } } + fun verifyCrossOriginStorageLearnMoreURL() { + Log.i(TAG, "verifyCrossOriginStorageLearnMoreURL: Trying to verify cross origin storage URL") + verifyUrl("docs/Web/API/Storage_Access_API") + Log.i(TAG, "verifyCrossOriginStorageLearnMoreURL: Verified cross origin storage URL") + } + fun verifySponsoredShortcutsLearnMoreURL() { try { verifyUrl("support.mozilla.org/en-US/kb/sponsor-privacy") diff --git a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SitePermissionsRobot.kt b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SitePermissionsRobot.kt @@ -186,6 +186,18 @@ class SitePermissionsRobot { } class Transition { + + fun clickLearnMore(interact: BrowserRobot.() -> Unit): BrowserRobot.Transition { + Log.i(TAG, "clickLearnMore: Waiting for $waitingTime ms for the Learn more link to exist") + learnMoreText().waitForExists(waitingTime) + Log.i(TAG, "clickLearnMore: Waited for $waitingTime ms for the Learn more link to exist") + Log.i(TAG, "clickLearnMore: Trying to click the Learn more link") + learnMoreText().click() + Log.i(TAG, "clickLearnMore: Clicked the Learn more link") + BrowserRobot().interact() + return BrowserRobot.Transition() + } + fun clickPagePermissionButton(allow: Boolean, interact: BrowserRobot.() -> Unit): BrowserRobot.Transition { if (allow) { Log.i(TAG, "clickPagePermissionButton: Waiting for $waitingTime ms for the \"Allow\" prompt button to exist") @@ -234,5 +246,8 @@ private fun allowPagePermissionButton() = private fun denyPagePermissionButton() = mDevice.findObject(UiSelector().resourceId("$packageName:id/deny_button")) +private fun learnMoreText() = + mDevice.findObject(UiSelector().resourceId("$packageName:id/learn_more")) + private fun doNotAskAgainCheckBox() = mDevice.findObject(UiSelector().resourceId("$packageName:id/do_not_ask_again"))