tor-browser

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

commit b41caab33c2e5a3dc54d042047e6c85804224eb9
parent 8435a244519e62f59b82a864e2e321ab5aca2a3b
Author: AndiAJ <andiaj@users.noreply.github.com>
Date:   Thu,  9 Oct 2025 06:51:34 +0000

Bug 1992967 - New verifyCustomTabViewItemsTest UI test r=aaronmt

New custom tabs related UI test that uses the composable toolbar.

The UI test successfully passed 50x on Firebase ✅

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

Diffstat:
Mmobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/NavigationToolbarTestCompose.kt | 92++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------------
Mmobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/robots/CustomTabRobot.kt | 46+++++++++++++++++++++++++++++++++++++++++++++-
2 files changed, 108 insertions(+), 30 deletions(-)

diff --git a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/NavigationToolbarTestCompose.kt b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/NavigationToolbarTestCompose.kt @@ -63,6 +63,8 @@ import org.mozilla.fenix.ui.robots.navigationToolbar import org.mozilla.fenix.ui.robots.searchScreen class NavigationToolbarTestCompose : TestSetup() { + private val customTabActionButton = "CustomActionButton" + private lateinit var searchMockServer: MockWebServer private val bookmarkFolderName = "My Folder" @@ -136,7 +138,7 @@ class NavigationToolbarTestCompose : TestSetup() { @Test fun verifySecurePageSecuritySubMenuTest() { runWithCondition( - composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.BETA || + composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.BETA && composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.RELEASE, ) { val defaultWebPage = "https://mozilla-mobile.github.io/testapp/loginForm" @@ -161,7 +163,7 @@ class NavigationToolbarTestCompose : TestSetup() { @Test fun verifyInsecurePageSecuritySubMenuTest() { runWithCondition( - composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.BETA || + composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.BETA && composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.RELEASE, ) { val defaultWebPage = getGenericAsset(mockWebServer, 1) @@ -187,7 +189,7 @@ class NavigationToolbarTestCompose : TestSetup() { @SkipLeaks fun verifyClearCookiesFromQuickSettingsTest() { runWithCondition( - composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.BETA || + composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.BETA && composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.RELEASE, ) { val loginPage = "https://mozilla-mobile.github.io/testapp/loginForm" @@ -208,7 +210,7 @@ class NavigationToolbarTestCompose : TestSetup() { @Test fun verifyFontSizingChangeTest() { runWithCondition( - composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.BETA || + composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.BETA && composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.RELEASE, ) { // Goes through the settings and changes the default text on a webpage, then verifies if the text has changed. @@ -246,7 +248,7 @@ class NavigationToolbarTestCompose : TestSetup() { @Test fun verifySearchForBookmarkedItemsTest() { runWithCondition( - composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.BETA || + composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.BETA && composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.RELEASE, ) { val firstWebPage = getGenericAsset(mockWebServer, 1) @@ -277,7 +279,7 @@ class NavigationToolbarTestCompose : TestSetup() { @Test fun verifyTheCustomTabsMainMenuItemsTest() { runWithCondition( - composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.BETA || + composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.BETA && composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.RELEASE, ) { val customMenuItem = "TestMenuItem" @@ -303,7 +305,7 @@ class NavigationToolbarTestCompose : TestSetup() { @Test fun verifyShowSearchSuggestionsToggleTest() { runWithCondition( - composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.BETA || + composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.BETA && composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.RELEASE, ) { homeScreen { @@ -337,7 +339,7 @@ class NavigationToolbarTestCompose : TestSetup() { @Test fun verifyTheDefaultSearchEngineCanBeChangedTest() { runWithCondition( - composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.BETA || + composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.BETA && composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.RELEASE, ) { // Goes through the settings and changes the default search engine, then verifies it has changed. @@ -365,7 +367,7 @@ class NavigationToolbarTestCompose : TestSetup() { @Test fun scanQRCodeToOpenAWebpageTest() { runWithCondition( - composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.BETA || + composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.BETA && composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.RELEASE, ) { val cameraManager = @@ -386,7 +388,7 @@ class NavigationToolbarTestCompose : TestSetup() { @Test fun verifyHistorySearchWithBrowsingHistoryTest() { runWithCondition( - composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.BETA || + composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.BETA && composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.RELEASE, ) { val firstPageUrl = getGenericAsset(searchMockServer, 1) @@ -426,7 +428,7 @@ class NavigationToolbarTestCompose : TestSetup() { @Test fun searchEnginesCanBeChangedTemporarilyFromSearchSelectorMenuTest() { runWithCondition( - composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.BETA || + composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.BETA && composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.RELEASE, ) { (generalEnginesList + topicEnginesList).forEach { @@ -449,7 +451,7 @@ class NavigationToolbarTestCompose : TestSetup() { @Test fun searchHistoryNotRememberedInPrivateBrowsingTest() { runWithCondition( - composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.BETA || + composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.BETA && composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.RELEASE, ) { TestHelper.appContext.settings().shouldShowSearchSuggestionsInPrivate = true @@ -499,7 +501,7 @@ class NavigationToolbarTestCompose : TestSetup() { @Test fun searchResultsOpenedInNewTabsGenerateSearchGroupsTest() { runWithCondition( - composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.BETA || + composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.BETA && composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.RELEASE, ) { val firstPageUrl = getGenericAsset(searchMockServer, 1).url @@ -537,7 +539,7 @@ class NavigationToolbarTestCompose : TestSetup() { @Test fun searchGroupIsNotGeneratedForLinksOpenedInPrivateTabsTest() { runWithCondition( - composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.BETA || + composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.BETA && composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.RELEASE, ) { // setting our custom mockWebServer search URL @@ -579,7 +581,7 @@ class NavigationToolbarTestCompose : TestSetup() { @SkipLeaks fun swipeToSwitchTabTest() { runWithCondition( - composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.BETA || + composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.BETA && composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.RELEASE, ) { val firstWebPage = getGenericAsset(mockWebServer, 1) @@ -605,7 +607,7 @@ class NavigationToolbarTestCompose : TestSetup() { @Test fun changeThemeOfTheAppTest() { runWithCondition( - composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.BETA || + composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.BETA && composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.RELEASE, ) { homeScreen { @@ -625,7 +627,7 @@ class NavigationToolbarTestCompose : TestSetup() { @Test fun setToolbarPositionTest() { runWithCondition( - composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.BETA || + composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.BETA && composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.RELEASE, ) { homeScreen { @@ -655,7 +657,7 @@ class NavigationToolbarTestCompose : TestSetup() { @Test fun verifyEnabledUrlAutocompleteToggleTest() { runWithCondition( - composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.BETA || + composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.BETA && composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.RELEASE, ) { // Currently part of an experiment https://bugzilla.mozilla.org/show_bug.cgi?id=1842106 @@ -712,7 +714,7 @@ class NavigationToolbarTestCompose : TestSetup() { @Test fun disableSearchBrowsingHistorySuggestionsToggleTest() { runWithCondition( - composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.BETA || + composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.BETA && composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.RELEASE, ) { val websiteURL = getGenericAsset(mockWebServer, 1).url.toString() @@ -743,7 +745,7 @@ class NavigationToolbarTestCompose : TestSetup() { @Test fun disableSearchBookmarksToggleTest() { runWithCondition( - composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.BETA || + composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.BETA && composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.RELEASE, ) { val website = getGenericAsset(mockWebServer, 1) @@ -778,7 +780,7 @@ class NavigationToolbarTestCompose : TestSetup() { @Test fun verifyShowVoiceSearchToggleTest() { runWithCondition( - composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.BETA || + composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.BETA && composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.RELEASE, ) { homeScreen { @@ -804,7 +806,7 @@ class NavigationToolbarTestCompose : TestSetup() { @Test fun doNotAllowSearchSuggestionsInPrivateBrowsingTest() { runWithCondition( - composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.BETA || + composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.BETA && composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.RELEASE, ) { homeScreen { @@ -822,7 +824,7 @@ class NavigationToolbarTestCompose : TestSetup() { @Test fun verifyClearSearchButtonTest() { runWithCondition( - composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.BETA || + composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.BETA && composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.RELEASE, ) { homeScreen { @@ -838,7 +840,7 @@ class NavigationToolbarTestCompose : TestSetup() { @Test fun verifySearchForHistoryItemsTest() { runWithCondition( - composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.BETA || + composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.BETA && composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.RELEASE, ) { val firstWebPage = getGenericAsset(mockWebServer, 1) @@ -869,7 +871,7 @@ class NavigationToolbarTestCompose : TestSetup() { @Test fun verifyHistorySearchWithoutBrowsingHistoryTest() { runWithCondition( - composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.BETA || + composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.BETA && composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.RELEASE, ) { homeScreen { @@ -889,7 +891,7 @@ class NavigationToolbarTestCompose : TestSetup() { @Test fun verifySearchBarItemsTest() { runWithCondition( - composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.BETA || + composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.BETA && composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.RELEASE, ) { navigationToolbar { @@ -911,7 +913,7 @@ class NavigationToolbarTestCompose : TestSetup() { @Test fun verifySearchSelectorMenuItemsTest() { runWithCondition( - composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.BETA || + composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.BETA && composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.RELEASE, ) { homeScreen { @@ -932,7 +934,7 @@ class NavigationToolbarTestCompose : TestSetup() { @Test fun verifyTabsSearchItemsTest() { runWithCondition( - composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.BETA || + composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.BETA && composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.RELEASE, ) { searchScreen { @@ -950,7 +952,7 @@ class NavigationToolbarTestCompose : TestSetup() { @Test fun verifyHistorySearchItemsTest() { runWithCondition( - composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.BETA || + composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.BETA && composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.RELEASE, ) { searchScreen { @@ -962,4 +964,36 @@ class NavigationToolbarTestCompose : TestSetup() { } } } + + // TestRail link: https://mozilla.testrail.io/index.php?/cases/view/3135036 + @Test + fun verifyCustomTabViewItemsTest() { + runWithCondition( + composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.BETA && + composeTestRule.activity.components.core.engine.version.releaseChannel !== EngineReleaseChannel.RELEASE, + ) { + val customTabPage = getGenericAsset(mockWebServer, 1) + + intentReceiverActivityTestRule.launchActivity( + createCustomTabIntent( + pageUrl = customTabPage.url.toString(), + customActionButtonDescription = customTabActionButton, + ), + ) + + customTabScreen { + verifyCustomTabCloseButtonWithComposableToolbar(composeTestRule) + verifyCustomTabsSiteInfoButtonWithComposableToolbar(composeTestRule) + verifyCustomTabToolbarTitleWithComposableToolbar(composeTestRule, customTabPage.title) + verifyCustomTabUrlWithComposableToolbar(composeTestRule, customTabPage.url.toString()) + verifyCustomTabActionButtonWithComposableToolbar(composeTestRule, customTabActionButton) + verifyCustomTabsShareButtonWithComposableToolbar(composeTestRule) + verifyMainMenuComposeButtonWithComposableToolbar(composeTestRule) + clickCustomTabCloseButtonWithComposableToolbar(composeTestRule) + } + homeScreen { + verifyHomeScreenAppBarItems() + } + } + } } diff --git a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/robots/CustomTabRobot.kt b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/robots/CustomTabRobot.kt @@ -6,7 +6,9 @@ package org.mozilla.fenix.ui.robots import android.net.Uri import android.util.Log import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.hasText import androidx.compose.ui.test.junit4.ComposeTestRule +import androidx.compose.ui.test.onAllNodesWithContentDescription import androidx.compose.ui.test.onNodeWithContentDescription import androidx.compose.ui.test.onNodeWithTag import androidx.compose.ui.test.onNodeWithText @@ -52,14 +54,30 @@ class CustomTabRobot { itemWithResId("$packageName:id/mozac_browser_toolbar_site_info_indicator"), ) + fun verifyCustomTabsSiteInfoButtonWithComposableToolbar(composeTestRule: ComposeTestRule) { + Log.i(TAG, "verifyCustomTabsSiteInfoButtonWithComposableToolbar: Trying to verify that the site info button is displayed") + composeTestRule.onNodeWithContentDescription("Site information").assertIsDisplayed() + Log.i(TAG, "verifyCustomTabsSiteInfoButtonWithComposableToolbar: Verified that the site info button is displayed") + } + fun verifyCustomTabsShareButton() = assertUIObjectExists( itemWithDescription(getStringResource(customtabsR.string.mozac_feature_customtabs_share_link)), ) + fun verifyCustomTabsShareButtonWithComposableToolbar(composeTestRule: ComposeTestRule) { + Log.i(TAG, "verifyCustomTabsShareButtonWithComposableToolbar: Trying to verify that the share button is displayed") + composeTestRule.onNodeWithContentDescription("Share link").assertIsDisplayed() + Log.i(TAG, "verifyCustomTabsShareButtonWithComposableToolbar: Verified that the share button is displayed") + } + fun verifyMainMenuButton() = assertUIObjectExists(mainMenuButton()) - fun verifyMainMenuComposeButton() = assertUIObjectExists(mainMenuButtonFromRedesignedToolbar()) + fun verifyMainMenuComposeButtonWithComposableToolbar(composeTestRule: ComposeTestRule) { + Log.i(TAG, "verifyMainMenuComposeButtonWithComposableToolbar: Trying to verify that the main menu button is displayed") + composeTestRule.onNodeWithContentDescription("More options").assertIsDisplayed() + Log.i(TAG, "verifyMainMenuComposeButtonWithComposableToolbar: Verified that the main menu button is displayed") + } fun verifyDesktopSiteButtonExists() { Log.i(TAG, "verifyDesktopSiteButtonExists: Trying to verify that the request desktop site button is displayed") @@ -128,6 +146,12 @@ class CustomTabRobot { ) } + fun verifyCustomTabToolbarTitleWithComposableToolbar(composeTestRule: ComposeTestRule, title: String) { + Log.i(TAG, "verifyCustomTabToolbarTitleWithComposableToolbar: Trying to verify that the custom tab title: $title is displayed") + composeTestRule.onNodeWithText(title, useUnmergedTree = true).assertIsDisplayed() + Log.i(TAG, "verifyCustomTabToolbarTitleWithComposableToolbar: Verified that the custom tab title: $title is displayed") + } + fun verifyCustomTabUrl(url: String) { val uri = Uri.parse(url) val expectedText = uri.host ?: url // fallback if host is null @@ -137,6 +161,14 @@ class CustomTabRobot { ) } + fun verifyCustomTabUrlWithComposableToolbar(composeTestRule: ComposeTestRule, url: String) { + val uri = Uri.parse(url) + val expectedText = uri.host ?: url // fallback if host is null + Log.i(TAG, "verifyCustomTabUrlWithComposableToolbar: Trying to verify that the custom tab url: $expectedText is displayed") + composeTestRule.onNodeWithText(expectedText, substring = true, useUnmergedTree = true).assertIsDisplayed() + Log.i(TAG, "verifyCustomTabUrlWithComposableToolbar: Verified that the custom tab url: $expectedText is displayed") + } + fun longCLickAndCopyToolbarUrl() { mDevice.waitForObjects( mDevice.findObject(UiSelector().resourceId("$packageName:id/toolbar")), @@ -175,9 +207,21 @@ class CustomTabRobot { Log.i(TAG, "clickCustomTabCloseButton: Clicked close custom tab button") } + fun clickCustomTabCloseButtonWithComposableToolbar(composeTestRule: ComposeTestRule) { + Log.i(TAG, "clickCustomTabCloseButtonWithComposableToolbar: Trying to click close custom tab button") + composeTestRule.onNodeWithContentDescription(getStringResource(customtabsR.string.mozac_feature_customtabs_exit_button)).performClick() + Log.i(TAG, "clickCustomTabCloseButtonWithComposableToolbar: Clicked close custom tab button") + } + fun verifyCustomTabActionButton(customTabActionButtonDescription: String) = assertUIObjectExists(itemWithDescription(customTabActionButtonDescription)) + fun verifyCustomTabActionButtonWithComposableToolbar(composeTestRule: ComposeTestRule, customTabActionButtonDescription: String) { + Log.i(TAG, "verifyCustomTabActionButtonWithComposableToolbar: Trying to verify that the custom tab action button is displayed") + composeTestRule.onNodeWithContentDescription(customTabActionButtonDescription).assertIsDisplayed() + Log.i(TAG, "verifyCustomTabActionButtonWithComposableToolbar: Verified that the custom tab action button is displayed") + } + fun verifyPDFReaderToolbarItems() = assertUIObjectExists( itemWithResIdAndText("download", "Download"),