1 /* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 package org.mozilla.fenix.ui
7 import androidx.compose.ui.test.junit4.AndroidComposeTestRule
8 import androidx.core.net.toUri
11 import org.mozilla.fenix.helpers.AppAndSystemHelper.assertExternalAppOpens
12 import org.mozilla.fenix.helpers.Constants
13 import org.mozilla.fenix.helpers.HomeActivityIntentTestRule
14 import org.mozilla.fenix.helpers.MatcherHelper.itemContainingText
15 import org.mozilla.fenix.helpers.MatcherHelper.itemWithText
16 import org.mozilla.fenix.helpers.RetryTestRule
17 import org.mozilla.fenix.helpers.TestAssetHelper
18 import org.mozilla.fenix.helpers.TestHelper.clickSnackbarButton
19 import org.mozilla.fenix.helpers.TestHelper.mDevice
20 import org.mozilla.fenix.helpers.TestHelper.verifySnackBarText
21 import org.mozilla.fenix.helpers.TestSetup
22 import org.mozilla.fenix.ui.robots.clickContextMenuItem
23 import org.mozilla.fenix.ui.robots.clickPageObject
24 import org.mozilla.fenix.ui.robots.downloadRobot
25 import org.mozilla.fenix.ui.robots.longClickPageObject
26 import org.mozilla.fenix.ui.robots.navigationToolbar
27 import org.mozilla.fenix.ui.robots.shareOverlay
30 * Tests for verifying basic functionality of content context menus
32 * - Verifies long click "Open link in new tab" UI and functionality
33 * - Verifies long click "Open link in new Private tab" UI and functionality
34 * - Verifies long click "Copy Link" UI and functionality
35 * - Verifies long click "Share Link" UI and functionality
36 * - Verifies long click "Open image in new tab" UI and functionality
37 * - Verifies long click "Save Image" UI and functionality
38 * - Verifies long click "Copy image location" UI and functionality
39 * - Verifies long click items of mixed hypertext items
43 class ComposeContextMenusTest : TestSetup() {
47 AndroidComposeTestRule(
48 HomeActivityIntentTestRule(
49 tabsTrayRewriteEnabled = true,
50 isJumpBackInCFREnabled = false,
56 val retryTestRule = RetryTestRule(3)
58 // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/243837
60 fun verifyOpenLinkNewTabContextMenuOptionTest() {
62 TestAssetHelper.getGenericAsset(mockWebServer, 4)
64 TestAssetHelper.getGenericAsset(mockWebServer, 1)
67 }.enterURLAndEnterToBrowser(pageLinks.url) {
69 longClickPageObject(itemWithText("Link 1"))
70 verifyContextMenuForLocalHostLinks(genericURL.url)
71 clickContextMenuItem("Open link in new tab")
72 verifySnackBarText("New tab opened")
73 clickSnackbarButton("SWITCH")
74 verifyUrl(genericURL.url.toString())
75 }.openComposeTabDrawer(composeTestRule) {
76 verifyNormalBrowsingButtonIsSelected()
77 verifyExistingOpenTabs("Test_Page_1")
78 verifyExistingOpenTabs("Test_Page_4")
82 // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/244655
84 fun verifyOpenLinkInNewPrivateTabContextMenuOptionTest() {
86 TestAssetHelper.getGenericAsset(mockWebServer, 4)
88 TestAssetHelper.getGenericAsset(mockWebServer, 2)
91 }.enterURLAndEnterToBrowser(pageLinks.url) {
93 longClickPageObject(itemWithText("Link 2"))
94 verifyContextMenuForLocalHostLinks(genericURL.url)
95 clickContextMenuItem("Open link in private tab")
96 verifySnackBarText("New private tab opened")
97 clickSnackbarButton("SWITCH")
98 verifyUrl(genericURL.url.toString())
99 }.openComposeTabDrawer(composeTestRule) {
100 verifyPrivateBrowsingButtonIsSelected()
101 verifyExistingOpenTabs("Test_Page_2")
105 // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/243832
107 fun verifyCopyLinkContextMenuOptionTest() {
109 TestAssetHelper.getGenericAsset(mockWebServer, 4)
111 TestAssetHelper.getGenericAsset(mockWebServer, 3)
114 }.enterURLAndEnterToBrowser(pageLinks.url) {
115 mDevice.waitForIdle()
116 longClickPageObject(itemWithText("Link 3"))
117 verifyContextMenuForLocalHostLinks(genericURL.url)
118 clickContextMenuItem("Copy link")
119 verifySnackBarText("Link copied to clipboard")
120 }.openNavigationToolbar {
121 }.visitLinkFromClipboard {
122 verifyUrl(genericURL.url.toString())
126 // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/243838
128 fun verifyShareLinkContextMenuOptionTest() {
130 TestAssetHelper.getGenericAsset(mockWebServer, 4)
132 TestAssetHelper.getGenericAsset(mockWebServer, 1)
135 }.enterURLAndEnterToBrowser(pageLinks.url) {
136 mDevice.waitForIdle()
137 longClickPageObject(itemWithText("Link 1"))
138 verifyContextMenuForLocalHostLinks(genericURL.url)
139 clickContextMenuItem("Share link")
141 verifyShareLinkIntent(genericURL.url)
146 // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/243833
148 fun verifyOpenImageNewTabContextMenuOptionTest() {
150 TestAssetHelper.getGenericAsset(mockWebServer, 4)
152 TestAssetHelper.getImageAsset(mockWebServer)
155 }.enterURLAndEnterToBrowser(pageLinks.url) {
156 mDevice.waitForIdle()
157 longClickPageObject(itemWithText("test_link_image"))
158 verifyLinkImageContextMenuItems(imageResource.url)
159 clickContextMenuItem("Open image in new tab")
160 verifySnackBarText("New tab opened")
161 clickSnackbarButton("SWITCH")
162 verifyUrl(imageResource.url.toString())
166 // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/243834
168 fun verifyCopyImageLocationContextMenuOptionTest() {
170 TestAssetHelper.getGenericAsset(mockWebServer, 4)
172 TestAssetHelper.getImageAsset(mockWebServer)
175 }.enterURLAndEnterToBrowser(pageLinks.url) {
176 mDevice.waitForIdle()
177 longClickPageObject(itemWithText("test_link_image"))
178 verifyLinkImageContextMenuItems(imageResource.url)
179 clickContextMenuItem("Copy image location")
180 verifySnackBarText("Link copied to clipboard")
181 }.openNavigationToolbar {
182 }.visitLinkFromClipboard {
183 verifyUrl(imageResource.url.toString())
187 // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/243835
189 fun verifySaveImageContextMenuOptionTest() {
191 TestAssetHelper.getGenericAsset(mockWebServer, 4)
193 TestAssetHelper.getImageAsset(mockWebServer)
196 }.enterURLAndEnterToBrowser(pageLinks.url) {
197 mDevice.waitForIdle()
198 longClickPageObject(itemWithText("test_link_image"))
199 verifyLinkImageContextMenuItems(imageResource.url)
200 clickContextMenuItem("Save image")
204 verifyDownloadCompleteNotificationPopup()
205 }.clickOpen("image/jpeg") {} // verify open intent is matched with associated data type
207 verifyPhotosAppOpens()
211 // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/352050
213 fun verifyContextMenuLinkVariationsTest() {
215 TestAssetHelper.getGenericAsset(mockWebServer, 4)
217 TestAssetHelper.getGenericAsset(mockWebServer, 1)
219 TestAssetHelper.getImageAsset(mockWebServer)
222 }.enterURLAndEnterToBrowser(pageLinks.url) {
223 mDevice.waitForIdle()
224 longClickPageObject(itemWithText("Link 1"))
225 verifyContextMenuForLocalHostLinks(genericURL.url)
226 dismissContentContextMenu()
227 longClickPageObject(itemWithText("test_link_image"))
228 verifyLinkImageContextMenuItems(imageResource.url)
229 dismissContentContextMenu()
230 longClickPageObject(itemWithText("test_no_link_image"))
231 verifyNoLinkImageContextMenuItems(imageResource.url)
235 // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2333840
237 fun verifyPDFContextMenuLinkVariationsTest() {
239 TestAssetHelper.getGenericAsset(mockWebServer, 3)
242 }.enterURLAndEnterToBrowser(genericURL.url) {
243 clickPageObject(itemWithText("PDF form file"))
245 longClickPageObject(itemWithText("Wikipedia link"))
246 verifyContextMenuForLinksToOtherHosts("wikipedia.org".toUri())
247 dismissContentContextMenu()
248 // Some options are missing from the linked and non liked images context menus in PDF files
249 // See https://bugzilla.mozilla.org/show_bug.cgi?id=1012805 for more details
251 verifyContextMenuForLinksToOtherHosts("wikipedia.org".toUri())
252 dismissContentContextMenu()
256 // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/832094
258 fun verifyOpenLinkInAppContextMenuOptionTest() {
259 val defaultWebPage = TestAssetHelper.getExternalLinksAsset(mockWebServer)
262 }.enterURLAndEnterToBrowser(defaultWebPage.url) {
263 longClickPageObject(itemContainingText("Youtube full link"))
264 verifyContextMenuForLinksToOtherApps("youtube.com")
265 clickContextMenuItem("Open link in external app")
266 assertExternalAppOpens(Constants.PackageName.YOUTUBE_APP)