Skip to content
This repository has been archived by the owner on Nov 1, 2022. It is now read-only.

Commit

Permalink
Merge branch 'main' into 12289
Browse files Browse the repository at this point in the history
  • Loading branch information
mergify[bot] authored Jun 23, 2022
2 parents e440c9c + e7ad21b commit 722e5d0
Show file tree
Hide file tree
Showing 7 changed files with 413 additions and 27 deletions.
2 changes: 1 addition & 1 deletion buildSrc/src/main/java/Gecko.kt
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ object Gecko {
/**
* GeckoView Version.
*/
const val version = "103.0.20220622094342"
const val version = "103.0.20220623095414"

/**
* GeckoView channel
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,28 +67,86 @@ sealed class Permission {
abstract val id: String?
abstract val desc: String?

data class ContentAudioCapture(override val id: String? = "", override val desc: String? = "") : Permission()
data class ContentAudioMicrophone(override val id: String? = "", override val desc: String? = "") : Permission()
data class ContentAudioOther(override val id: String? = "", override val desc: String? = "") : Permission()
data class ContentGeoLocation(override val id: String? = "", override val desc: String? = "") : Permission()
data class ContentNotification(override val id: String? = "", override val desc: String? = "") : Permission()
data class ContentProtectedMediaId(override val id: String? = "", override val desc: String? = "") : Permission()
data class ContentVideoCamera(override val id: String? = "", override val desc: String? = "") : Permission()
data class ContentVideoCapture(override val id: String? = "", override val desc: String? = "") : Permission()
data class ContentVideoScreen(override val id: String? = "", override val desc: String? = "") : Permission()
data class ContentVideoOther(override val id: String? = "", override val desc: String? = "") : Permission()
data class ContentAutoPlayAudible(override val id: String? = "", override val desc: String? = "") : Permission()
data class ContentAutoPlayInaudible(override val id: String? = "", override val desc: String? = "") : Permission()
data class ContentPersistentStorage(override val id: String? = "", override val desc: String? = "") : Permission()
data class ContentMediaKeySystemAccess(override val id: String? = "", override val desc: String? = "") :
Permission()
data class ContentCrossOriginStorageAccess(override val id: String? = "", override val desc: String? = "") :
Permission()
data class ContentAudioCapture(
override val id: String? = "ContentAudioCapture",
override val desc: String? = "",
) : Permission()
data class ContentAudioMicrophone(
override val id: String? = "ContentAudioMicrophone",
override val desc: String? = "",
) : Permission()
data class ContentAudioOther(
override val id: String? = "ContentAudioOther",
override val desc: String? = "",
) : Permission()
data class ContentGeoLocation(
override val id: String? = "ContentGeoLocation",
override val desc: String? = "",
) : Permission()
data class ContentNotification(
override val id: String? = "ContentNotification",
override val desc: String? = "",
) : Permission()
data class ContentProtectedMediaId(
override val id: String? = "ContentProtectedMediaId",
override val desc: String? = "",
) : Permission()
data class ContentVideoCamera(
override val id: String? = "ContentVideoCamera",
override val desc: String? = "",
) : Permission()
data class ContentVideoCapture(
override val id: String? = "ContentVideoCapture",
override val desc: String? = "",
) : Permission()
data class ContentVideoScreen(
override val id: String? = "ContentVideoScreen",
override val desc: String? = "",
) : Permission()
data class ContentVideoOther(
override val id: String? = "ContentVideoOther",
override val desc: String? = "",
) : Permission()
data class ContentAutoPlayAudible(
override val id: String? = "ContentAutoPlayAudible",
override val desc: String? = "",
) : Permission()
data class ContentAutoPlayInaudible(
override val id: String? = "ContentAutoPlayInaudible",
override val desc: String? = "",
) : Permission()
data class ContentPersistentStorage(
override val id: String? = "ContentPersistentStorage",
override val desc: String? = "",
) : Permission()
data class ContentMediaKeySystemAccess(
override val id: String? = "ContentMediaKeySystemAccess",
override val desc: String? = "",
) : Permission()
data class ContentCrossOriginStorageAccess(
override val id: String? = "ContentCrossOriginStorageAccess",
override val desc: String? = "",
) : Permission()

data class AppCamera(override val id: String? = "", override val desc: String? = "") : Permission()
data class AppAudio(override val id: String? = "", override val desc: String? = "") : Permission()
data class AppLocationCoarse(override val id: String? = "", override val desc: String? = "") : Permission()
data class AppLocationFine(override val id: String? = "", override val desc: String? = "") : Permission()
data class AppCamera(
override val id: String? = "AppCamera",
override val desc: String? = "",
) : Permission()
data class AppAudio(
override val id: String? = "AppAudio",
override val desc: String? = "",
) : Permission()
data class AppLocationCoarse(
override val id: String? = "AppLocationCoarse",
override val desc: String? = "",
) : Permission()
data class AppLocationFine(
override val id: String? = "AppLocationFine",
override val desc: String? = "",
) : Permission()

data class Generic(override val id: String?, override val desc: String? = "") : Permission()
data class Generic(
override val id: String? = "Generic",
override val desc: String? = "",
) : Permission()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
/* 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 mozilla.components.feature.sitepermissions

import mozilla.components.concept.engine.permission.Permission
import mozilla.components.support.base.Component.FEATURE_SITEPERMISSIONS
import mozilla.components.support.base.facts.Action
import mozilla.components.support.base.facts.Fact
import mozilla.components.support.base.facts.collect

/**
* Facts emitted for telemetry related to the site permissions prompt.
*/
class SitePermissionsFacts {
/**
* Specific types of telemetry items.
*/
object Items {
const val PERMISSIONS = "permissions"
}
}

internal fun emitPermissionDialogDisplayed(permission: Permission) = emitSitePermissionsFact(
action = Action.DISPLAY,
permissions = permission.id!!
)

internal fun emitPermissionsDialogDisplayed(permissions: List<Permission>) = emitSitePermissionsFact(
action = Action.DISPLAY,
permissions = permissions.joinToString { it.id!! }
)

internal fun emitPermissionDenied(permission: Permission) = emitSitePermissionsFact(
action = Action.CANCEL,
permissions = permission.id!!
)

internal fun emitPermissionsDenied(permissions: List<Permission>) = emitSitePermissionsFact(
action = Action.CANCEL,
permissions = permissions.joinToString { it.id!! }
)

internal fun emitPermissionAllowed(permission: Permission) = emitSitePermissionsFact(
action = Action.CONFIRM,
permissions = permission.id!!
)

internal fun emitPermissionsAllowed(permissions: List<Permission>) = emitSitePermissionsFact(
action = Action.CONFIRM,
permissions = permissions.joinToString { it.id!! }
)

private fun emitSitePermissionsFact(
action: Action,
permissions: String
) {
Fact(
FEATURE_SITEPERMISSIONS,
action,
SitePermissionsFacts.Items.PERMISSIONS,
permissions
).collect()
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ import androidx.fragment.app.FragmentManager
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.cancel
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.mapNotNull
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
Expand Down Expand Up @@ -310,6 +309,12 @@ class SitePermissionsFeature(
findRequestedPermission(permissionId)?.let { permissionRequest ->
consumePermissionRequest(permissionRequest, sessionId)
onContentPermissionGranted(permissionRequest, shouldStore)

if (!permissionRequest.containsVideoAndAudioSources()) {
emitPermissionAllowed(permissionRequest.permissions.first())
} else {
emitPermissionsAllowed(permissionRequest.permissions)
}
}
}

Expand All @@ -321,6 +326,12 @@ class SitePermissionsFeature(
findRequestedPermission(permissionId)?.let { permissionRequest ->
consumePermissionRequest(permissionRequest, sessionId)
onContentPermissionDeny(permissionRequest, shouldStore)

if (!permissionRequest.containsVideoAndAudioSources()) {
emitPermissionDenied(permissionRequest.permissions.first())
} else {
emitPermissionsDenied(permissionRequest.permissions)
}
}
}

Expand Down Expand Up @@ -708,7 +719,9 @@ class SitePermissionsFeature(
): SitePermissionsDialogFragment {
return if (!permissionRequest.containsVideoAndAudioSources()) {
val permission = permissionRequest.permissions.first()
handlingSingleContentPermissions(permissionRequest, permission, host)
handlingSingleContentPermissions(permissionRequest, permission, host).also {
emitPermissionDialogDisplayed(permission)
}
} else {
createSinglePermissionPrompt(
context,
Expand All @@ -719,7 +732,9 @@ class SitePermissionsFeature(
showDoNotAskAgainCheckBox = shouldShowDoNotAskAgainCheckBox,
shouldSelectRememberChoice = dialogConfig?.shouldPreselectDoNotAskAgain
?: DialogConfig.DEFAULT_PRESELECT_DO_NOT_ASK_AGAIN
)
).also {
emitPermissionsDialogDisplayed(permissionRequest.permissions)
}
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
/* 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 mozilla.components.feature.sitepermissions

import mozilla.components.concept.engine.permission.Permission.AppCamera
import mozilla.components.concept.engine.permission.Permission.AppLocationFine
import mozilla.components.concept.engine.permission.Permission.ContentAudioCapture
import mozilla.components.concept.engine.permission.Permission.ContentCrossOriginStorageAccess
import mozilla.components.concept.engine.permission.Permission.ContentVideoCapture
import mozilla.components.concept.engine.permission.Permission.Generic
import mozilla.components.support.base.Component.FEATURE_SITEPERMISSIONS
import mozilla.components.support.base.facts.Action
import mozilla.components.support.base.facts.processor.CollectionProcessor
import org.junit.Assert.assertEquals
import org.junit.Test

class SitePermissionsFactsTest {

@Test
fun `GIVEN a fact for a prompt shown for one permission WHEN it is emitted THEN it is properly configured`() {
CollectionProcessor.withFactCollection { facts ->
emitPermissionDialogDisplayed(Generic())

assertEquals(1, facts.size)
assertEquals(FEATURE_SITEPERMISSIONS, facts[0].component)
assertEquals(Action.DISPLAY, facts[0].action)
assertEquals(SitePermissionsFacts.Items.PERMISSIONS, facts[0].item)
assertEquals(Generic().id, facts[0].value)
}
}

@Test
fun `GIVEN a fact for a prompt shown for multiple permissions WHEN it is emitted THEN it is properly configured`() {
CollectionProcessor.withFactCollection { facts ->
emitPermissionsDialogDisplayed(listOf(AppCamera(), ContentCrossOriginStorageAccess()))

assertEquals(1, facts.size)
assertEquals(FEATURE_SITEPERMISSIONS, facts[0].component)
assertEquals(Action.DISPLAY, facts[0].action)
assertEquals(SitePermissionsFacts.Items.PERMISSIONS, facts[0].item)
assertEquals(listOf(AppCamera(), ContentCrossOriginStorageAccess()).joinToString { it.id!! }, facts[0].value)
}
}

@Test
fun `GIVEN a fact for a permission prompt being allowed WHEN it is emitted THEN it is properly configured`() {
CollectionProcessor.withFactCollection { facts ->
emitPermissionAllowed(ContentAudioCapture())

assertEquals(1, facts.size)
assertEquals(FEATURE_SITEPERMISSIONS, facts[0].component)
assertEquals(Action.CONFIRM, facts[0].action)
assertEquals(SitePermissionsFacts.Items.PERMISSIONS, facts[0].item)
assertEquals(ContentAudioCapture().id, facts[0].value)
}
}

@Test
fun `GIVEN a fact for a multiple permission prompt being allowed WHEN it is emitted THEN it is properly configured`() {
CollectionProcessor.withFactCollection { facts ->
emitPermissionsAllowed(listOf(ContentAudioCapture(), ContentVideoCapture()))

assertEquals(1, facts.size)
assertEquals(FEATURE_SITEPERMISSIONS, facts[0].component)
assertEquals(Action.CONFIRM, facts[0].action)
assertEquals(SitePermissionsFacts.Items.PERMISSIONS, facts[0].item)
assertEquals(listOf(ContentAudioCapture(), ContentVideoCapture()).joinToString { it.id!! }, facts[0].value)
}
}

@Test
fun `GIVEN a fact for a permission prompt being blocked WHEN it is emitted THEN it is properly configured`() {
CollectionProcessor.withFactCollection { facts ->
emitPermissionDenied(AppLocationFine())

assertEquals(1, facts.size)
assertEquals(FEATURE_SITEPERMISSIONS, facts[0].component)
assertEquals(Action.CANCEL, facts[0].action)
assertEquals(SitePermissionsFacts.Items.PERMISSIONS, facts[0].item)
assertEquals(AppLocationFine().id, facts[0].value)
}
}

@Test
fun `GIVEN a fact for a multiple permission prompt being blocked WHEN it is emitted THEN it is properly configured`() {
CollectionProcessor.withFactCollection { facts ->
emitPermissionsDenied(listOf(ContentAudioCapture(), ContentVideoCapture()))

assertEquals(1, facts.size)
assertEquals(FEATURE_SITEPERMISSIONS, facts[0].component)
assertEquals(Action.CANCEL, facts[0].action)
assertEquals(SitePermissionsFacts.Items.PERMISSIONS, facts[0].item)
assertEquals(listOf(ContentAudioCapture(), ContentVideoCapture()).joinToString { it.id!! }, facts[0].value)
}
}
}
Loading

2 comments on commit 722e5d0

@firefoxci-taskcluster
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Uh oh! Looks like an error! Details

Failed to fetch task artifact public/github/customCheckRunText.md for GitHub integration.
Make sure the artifact exists on the worker or other location.

@firefoxci-taskcluster
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Uh oh! Looks like an error! Details

Failed to fetch task artifact public/github/customCheckRunText.md for GitHub integration.
Make sure the artifact exists on the worker or other location.

Please sign in to comment.