|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
|
|
package org.mozilla.fenix.ui.robots
|
|
|
|
|
|
import androidx.test.espresso.Espresso.onView
|
|
|
import androidx.test.espresso.assertion.ViewAssertions.matches
|
|
|
import androidx.test.espresso.matcher.ViewMatchers
|
|
|
import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
|
|
|
import androidx.test.espresso.matcher.ViewMatchers.withId
|
|
|
import androidx.test.uiautomator.UiSelector
|
|
|
import org.junit.Assert.assertFalse
|
|
|
import org.junit.Assert.assertTrue
|
|
|
import org.mozilla.fenix.R
|
|
|
import org.mozilla.fenix.helpers.TestAssetHelper.waitingTime
|
|
|
import org.mozilla.fenix.helpers.TestHelper
|
|
|
import org.mozilla.fenix.helpers.TestHelper.getPermissionAllowID
|
|
|
import org.mozilla.fenix.helpers.TestHelper.mDevice
|
|
|
import org.mozilla.fenix.helpers.TestHelper.packageName
|
|
|
import org.mozilla.fenix.helpers.click
|
|
|
|
|
|
class SitePermissionsRobot {
|
|
|
fun clickGrantAppPermissionButton() {
|
|
|
TestHelper.grantPermission()
|
|
|
}
|
|
|
|
|
|
fun clickDenyAppPermissionButton() {
|
|
|
TestHelper.denyPermission()
|
|
|
}
|
|
|
|
|
|
fun verifyMicrophonePermissionPrompt(url: String) {
|
|
|
assertTrue(
|
|
|
mDevice.findObject(UiSelector().text("Allow $url to use your microphone?"))
|
|
|
.waitForExists(waitingTime),
|
|
|
)
|
|
|
assertTrue(denyPagePermissionButton.text.equals("Don’t allow"))
|
|
|
assertTrue(allowPagePermissionButton.text.equals("Allow"))
|
|
|
}
|
|
|
|
|
|
fun verifyCameraPermissionPrompt(url: String) {
|
|
|
assertTrue(
|
|
|
mDevice.findObject(UiSelector().text("Allow $url to use your camera?"))
|
|
|
.waitForExists(waitingTime),
|
|
|
)
|
|
|
assertTrue(denyPagePermissionButton.text.equals("Don’t allow"))
|
|
|
assertTrue(allowPagePermissionButton.text.equals("Allow"))
|
|
|
}
|
|
|
|
|
|
fun verifyAudioVideoPermissionPrompt(url: String) {
|
|
|
assertTrue(
|
|
|
mDevice.findObject(UiSelector().text("Allow $url to use your camera and microphone?"))
|
|
|
.waitForExists(waitingTime),
|
|
|
)
|
|
|
assertTrue(denyPagePermissionButton.text.equals("Don’t allow"))
|
|
|
assertTrue(allowPagePermissionButton.text.equals("Allow"))
|
|
|
}
|
|
|
|
|
|
fun verifyLocationPermissionPrompt(url: String) {
|
|
|
assertTrue(
|
|
|
mDevice.findObject(UiSelector().text("Allow $url to use your location?"))
|
|
|
.waitForExists(waitingTime),
|
|
|
)
|
|
|
assertTrue(denyPagePermissionButton.text.equals("Don’t allow"))
|
|
|
assertTrue(allowPagePermissionButton.text.equals("Allow"))
|
|
|
}
|
|
|
|
|
|
fun verifyNotificationsPermissionPrompt(url: String, blocked: Boolean = false) {
|
|
|
if (!blocked) {
|
|
|
assertTrue(
|
|
|
mDevice.findObject(UiSelector().text("Allow $url to send notifications?"))
|
|
|
.waitForExists(waitingTime),
|
|
|
)
|
|
|
assertTrue(denyPagePermissionButton.text.equals("Never"))
|
|
|
assertTrue(allowPagePermissionButton.text.equals("Always"))
|
|
|
} else {
|
|
|
/* if "Never" was selected in a previous step, or if the app is not allowed,
|
|
|
the Notifications permission prompt won't be displayed anymore */
|
|
|
assertFalse(
|
|
|
mDevice.findObject(UiSelector().text("Allow $url to send notifications?"))
|
|
|
.exists(),
|
|
|
)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
fun verifyCrossOriginCookiesPermissionPrompt(originSite: String, currentSite: String) {
|
|
|
mDevice.findObject(UiSelector().text("Allow $originSite to use its cookies on $currentSite?"))
|
|
|
.waitForExists(waitingTime)
|
|
|
onView(ViewMatchers.withText("Allow $originSite to use its cookies on $currentSite?")).check(matches(isDisplayed()))
|
|
|
onView(ViewMatchers.withText("You may want to block access if it's not clear why $originSite needs this data.")).check(matches(isDisplayed()))
|
|
|
onView(ViewMatchers.withText("Learn more")).check(matches(isDisplayed()))
|
|
|
onView(ViewMatchers.withText("Block")).check(matches(isDisplayed()))
|
|
|
onView(ViewMatchers.withText("Allow")).check(matches(isDisplayed()))
|
|
|
}
|
|
|
|
|
|
fun selectRememberPermissionDecision() {
|
|
|
onView(withId(R.id.do_not_ask_again))
|
|
|
.check(matches(isDisplayed()))
|
|
|
.click()
|
|
|
}
|
|
|
|
|
|
class Transition {
|
|
|
fun clickPagePermissionButton(allow: Boolean, interact: BrowserRobot.() -> Unit): BrowserRobot.Transition {
|
|
|
if (allow) {
|
|
|
allowPagePermissionButton.waitForExists(waitingTime)
|
|
|
allowPagePermissionButton.click()
|
|
|
// sometimes flaky, the prompt is not dismissed, retrying
|
|
|
if (!allowPagePermissionButton.waitUntilGone(waitingTime)) {
|
|
|
allowPagePermissionButton.click()
|
|
|
}
|
|
|
} else {
|
|
|
denyPagePermissionButton.waitForExists(waitingTime)
|
|
|
denyPagePermissionButton.click()
|
|
|
// sometimes flaky, the prompt is not dismissed, retrying
|
|
|
if (!denyPagePermissionButton.waitUntilGone(waitingTime)) {
|
|
|
denyPagePermissionButton.click()
|
|
|
}
|
|
|
}
|
|
|
|
|
|
BrowserRobot().interact()
|
|
|
return BrowserRobot.Transition()
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// App permission prompts buttons
|
|
|
private val allowSystemPermissionButton =
|
|
|
mDevice.findObject(UiSelector().resourceId(getPermissionAllowID() + ":id/permission_allow_button"))
|
|
|
|
|
|
private val denySystemPermissionButton =
|
|
|
mDevice.findObject(UiSelector().resourceId(getPermissionAllowID() + ":id/permission_deny_button"))
|
|
|
|
|
|
// Page permission prompts buttons
|
|
|
private val allowPagePermissionButton =
|
|
|
mDevice.findObject(UiSelector().resourceId("$packageName:id/allow_button"))
|
|
|
|
|
|
private val denyPagePermissionButton =
|
|
|
mDevice.findObject(UiSelector().resourceId("$packageName:id/deny_button"))
|