Skip to content

Commit

Permalink
For mozilla-mobile#8554 - Tests implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
codrut.topliceanu committed Oct 12, 2020
1 parent 4fcb991 commit 4328326
Show file tree
Hide file tree
Showing 6 changed files with 558 additions and 826 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import mozilla.components.browser.state.state.BrowserState
import mozilla.components.browser.state.state.ContentState
import mozilla.components.browser.state.state.SessionState
import mozilla.components.browser.state.state.content.HistoryState
import mozilla.components.concept.engine.permission.PermissionRequest
import mozilla.components.support.ktx.android.net.sameSchemeAndHostAs

internal object ContentStateReducer {
Expand Down
8 changes: 8 additions & 0 deletions components/feature/sitepermissions/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,13 @@ android {
}
}

tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all {
kotlinOptions.freeCompilerArgs += [
"-Xuse-experimental=kotlinx.coroutines.ExperimentalCoroutinesApi"
]
}


dependencies {
implementation project(':browser-session')
implementation project(':concept-engine')
Expand All @@ -66,6 +73,7 @@ dependencies {
testImplementation Dependencies.androidx_test_junit
testImplementation Dependencies.testing_robolectric
testImplementation Dependencies.testing_mockito
testImplementation Dependencies.testing_coroutines

androidTestImplementation project(':support-android-test')

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,12 @@ package mozilla.components.feature.sitepermissions

import android.Manifest.permission.CAMERA
import android.Manifest.permission.RECORD_AUDIO
import android.annotation.SuppressLint
import android.content.Context
import android.content.pm.PackageManager
import androidx.annotation.ColorRes
import androidx.annotation.DrawableRes
import androidx.annotation.StringRes
import androidx.annotation.VisibleForTesting
import androidx.core.net.toUri
import androidx.fragment.app.FragmentManager
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
Expand Down Expand Up @@ -149,7 +147,8 @@ class SitePermissionsFeature(
}
}

private fun consumePermissionRequest(
@VisibleForTesting
internal fun consumePermissionRequest(
permissionRequest: PermissionRequest,
optionalSessionId: String? = null
) {
Expand All @@ -159,8 +158,13 @@ class SitePermissionsFeature(
}
}

private fun consumeAppPermissionRequest(appPermissionRequest: PermissionRequest) {
sessionId?.let { sessionId ->
@VisibleForTesting
internal fun consumeAppPermissionRequest(
appPermissionRequest: PermissionRequest,
optionalSessionId: String? = null
) {
val thisSessionId = optionalSessionId ?: sessionId
thisSessionId?.let { sessionId ->
store.dispatch(
ContentAction.ConsumeAppPermissionsRequest(
sessionId,
Expand All @@ -181,7 +185,7 @@ class SitePermissionsFeature(
* @param grantResults the grant results for the corresponding permissions
* @see [onNeedToRequestPermissions].
*/
@Suppress("MaxLineLength")
@Suppress("NestedBlockDepth")
override fun onPermissionsResult(permissions: Array<String>, grantResults: IntArray) {
val currentContentSate = getCurrentContentState()
val appPermissionRequest = findRequestedAppPermission(permissions)
Expand Down Expand Up @@ -210,7 +214,8 @@ class SitePermissionsFeature(
}
}

private fun getCurrentContentState() =
@VisibleForTesting
internal fun getCurrentContentState() =
store.state.findTabOrCustomTabOrSelectedTab(customTabId)?.content

@VisibleForTesting
Expand All @@ -228,6 +233,7 @@ class SitePermissionsFeature(
* @param shouldStore indicates weather the permission should be stored.
* If it's true none prompt will show otherwise the prompt will be shown.
*/
@VisibleForTesting
internal fun onContentPermissionGranted(
permissionRequest: PermissionRequest,
shouldStore: Boolean
Expand Down Expand Up @@ -269,12 +275,13 @@ class SitePermissionsFeature(
internal fun storeSitePermissions(
contentState: ContentState,
request: PermissionRequest,
status: SitePermissions.Status
status: SitePermissions.Status,
coroutineScope: CoroutineScope = ioCoroutineScope
) {
if (contentState.private) {
return
}
ioCoroutineScope.launch {
coroutineScope.launch {
synchronized(storage) {
val host = contentState.url.tryGetHostFromUrl()
var sitePermissions =
Expand Down Expand Up @@ -316,7 +323,8 @@ class SitePermissionsFeature(

internal suspend fun onContentPermissionRequested(
permissionRequest: PermissionRequest,
host: String
host: String,
coroutineScope: CoroutineScope = ioCoroutineScope
): SitePermissionsDialogFragment? {
// We want to warranty that all media permissions have the required system
// permissions are granted first, otherwise, we reject the request
Expand All @@ -326,7 +334,7 @@ class SitePermissionsFeature(
return null
}

val permissionFromStorage = withContext(ioCoroutineScope.coroutineContext) {
val permissionFromStorage = withContext(coroutineScope.coroutineContext) {
storage.findSitePermissionsBy(host)
}

Expand All @@ -341,7 +349,8 @@ class SitePermissionsFeature(
return prompt
}

private fun handleNoRuledFlow(
@VisibleForTesting
internal fun handleNoRuledFlow(
permissionFromStorage: SitePermissions?,
permissionRequest: PermissionRequest,
host: String
Expand All @@ -359,7 +368,8 @@ class SitePermissionsFeature(
}
}

private fun shouldShowPrompt(
@VisibleForTesting
internal fun shouldShowPrompt(
permissionRequest: PermissionRequest,
permissionFromStorage: SitePermissions?
): Boolean {
Expand All @@ -368,7 +378,8 @@ class SitePermissionsFeature(
))
}

private fun handleRuledFlow(
@VisibleForTesting
internal fun handleRuledFlow(
permissionRequest: PermissionRequest,
host: String
): SitePermissionsDialogFragment? {
Expand All @@ -379,8 +390,7 @@ class SitePermissionsFeature(
consumePermissionRequest(permissionRequest)
null
} else {
val action = requireNotNull(sitePermissionsRules).getActionFrom(permissionRequest)
when (action) {
when (sitePermissionsRules?.getActionFrom(permissionRequest)) {
SitePermissionsRules.Action.ALLOWED -> {
permissionRequest.grant()
consumePermissionRequest(permissionRequest)
Expand All @@ -394,11 +404,16 @@ class SitePermissionsFeature(
SitePermissionsRules.Action.ASK_TO_ALLOW -> {
createPrompt(permissionRequest, host)
}
null -> {
consumePermissionRequest(permissionRequest)
null
}
}
}
}

private fun shouldApplyRules(permissionFromStorage: SitePermissions?) =
@VisibleForTesting
internal fun shouldApplyRules(permissionFromStorage: SitePermissions?) =
sitePermissionsRules != null && permissionFromStorage == null

private fun PermissionRequest.doNotAskAgain(permissionFromStore: SitePermissions): Boolean {
Expand All @@ -424,7 +439,7 @@ class SitePermissionsFeature(
private fun PermissionRequest.toSitePermissions(
host: String,
status: SitePermissions.Status,
initialSitePermission: SitePermissions = getInitialSitePermissions(host/*, this*/),
initialSitePermission: SitePermissions = getInitialSitePermissions(host),
permissions: List<Permission> = this.permissions
): SitePermissions {
var sitePermissions = initialSitePermission
Expand All @@ -434,9 +449,9 @@ class SitePermissionsFeature(
return sitePermissions
}

@VisibleForTesting
internal fun getInitialSitePermissions(
host: String/*,
request: PermissionRequest*/
host: String
): SitePermissions {
val rules = sitePermissionsRules
return rules?.toSitePermissions(
Expand All @@ -449,7 +464,8 @@ class SitePermissionsFeature(
private fun PermissionRequest.isForAutoplay() =
this.permissions.any { it is ContentAutoPlayInaudible || it is ContentAutoPlayAudible }

private fun updateSitePermissionsStatus(
@VisibleForTesting
internal fun updateSitePermissionsStatus(
status: SitePermissions.Status,
permission: Permission,
sitePermissions: SitePermissions
Expand Down Expand Up @@ -478,7 +494,8 @@ class SitePermissionsFeature(
}
}

private fun createPrompt(
@VisibleForTesting
internal fun createPrompt(
permissionRequest: PermissionRequest,
host: String
): SitePermissionsDialogFragment {
Expand All @@ -499,7 +516,8 @@ class SitePermissionsFeature(
}
}

private fun handlingSingleContentPermissions(
@VisibleForTesting
internal fun handlingSingleContentPermissions(
permissionRequest: PermissionRequest,
permission: Permission,
host: String
Expand Down Expand Up @@ -559,8 +577,8 @@ class SitePermissionsFeature(
}

@Suppress("LongParameterList")
@SuppressLint("VisibleForTests")
private fun createSinglePermissionPrompt(
@VisibleForTesting
internal fun createSinglePermissionPrompt(
context: Context,
host: String,
permissionRequest: PermissionRequest,
Expand All @@ -587,9 +605,6 @@ class SitePermissionsFeature(
)
}

private fun PermissionRequest.getHost(session: Session) =
(session.url.toUri().host ?: uri?.toUri()?.host ?: "")

private val PermissionRequest.isMedia: Boolean
get() {
return when (permissions.first()) {
Expand Down Expand Up @@ -668,7 +683,8 @@ internal fun SitePermissions?.isGranted(permissionRequest: PermissionRequest): B
}
}

private fun isPermissionGranted(
@VisibleForTesting
internal fun isPermissionGranted(
permission: Permission,
permissionFromStorage: SitePermissions
): Boolean {
Expand Down
Loading

0 comments on commit 4328326

Please sign in to comment.