Improve site permissions

This commit is contained in:
Arturo Mejia 2022-11-15 20:40:15 -05:00 committed by mergify[bot]
parent 9a47aa3ac9
commit cca309e0e6
7 changed files with 67 additions and 21 deletions

View File

@ -1251,7 +1251,7 @@ abstract class BaseBrowserFragment :
viewLifecycleOwner.lifecycleScope.launch(Main) {
val sitePermissions: SitePermissions? = tab.content.url.getOrigin()?.let { origin ->
val storage = requireComponents.core.permissionStorage
storage.findSitePermissionsBy(origin)
storage.findSitePermissionsBy(origin, tab.content.private)
}
view?.let {

View File

@ -20,26 +20,58 @@ class PermissionStorage(
context.components.core.geckoSitePermissionsStorage,
) {
/**
* Persists the [sitePermissions] provided as a parameter.
* @param sitePermissions the [sitePermissions] to be stored.
*/
suspend fun add(sitePermissions: SitePermissions) = withContext(dispatcher) {
permissionsStorage.save(sitePermissions)
permissionsStorage.save(sitePermissions, private = false)
}
suspend fun findSitePermissionsBy(origin: String): SitePermissions? = withContext(dispatcher) {
permissionsStorage.findSitePermissionsBy(origin)
}
/**
* Finds all SitePermissions that match the [origin].
* @param origin the site to be used as filter in the search.
* @param private indicates if the [origin] belongs to a private session.
*/
suspend fun findSitePermissionsBy(origin: String, private: Boolean): SitePermissions? =
withContext(dispatcher) {
permissionsStorage.findSitePermissionsBy(origin, private = private)
}
suspend fun updateSitePermissions(sitePermissions: SitePermissions) = withContext(dispatcher) {
permissionsStorage.update(sitePermissions)
}
/**
* Replaces an existing SitePermissions with the values of [sitePermissions] provided as a parameter.
* @param sitePermissions the sitePermissions to be updated.
* @param private indicates if the [SitePermissions] belongs to a private session.
*/
suspend fun updateSitePermissions(sitePermissions: SitePermissions, private: Boolean) =
withContext(dispatcher) {
permissionsStorage.update(sitePermissions, private = private)
}
/**
* Returns all saved [SitePermissions] instances as a [DataSource.Factory].
*
* A consuming app can transform the data source into a `LiveData<PagedList>` of when using RxJava2 into a
* `Flowable<PagedList>` or `Observable<PagedList>`, that can be observed.
*
* - https://developer.android.com/topic/libraries/architecture/paging/data
* - https://developer.android.com/topic/libraries/architecture/paging/ui
*/
suspend fun getSitePermissionsPaged(): DataSource.Factory<Int, SitePermissions> {
return permissionsStorage.getSitePermissionsPaged()
}
/**
* Deletes all sitePermissions that match the sitePermissions provided as a parameter.
* @param sitePermissions the sitePermissions to be deleted from the storage.
*/
suspend fun deleteSitePermissions(sitePermissions: SitePermissions) = withContext(dispatcher) {
permissionsStorage.remove(sitePermissions)
permissionsStorage.remove(sitePermissions, private = false)
}
/**
* Deletes all sitePermissions sitePermissions.
*/
suspend fun deleteAllSitePermissions() = withContext(dispatcher) {
permissionsStorage.removeAll()
}

View File

@ -263,8 +263,11 @@ class DefaultQuickSettingsController(
*/
@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
fun handlePermissionsChange(updatedPermissions: SitePermissions) {
val tab = requireNotNull(browserStore.state.findTabOrCustomTab(sessionId)) {
"A session is required to update permission"
}
ioScope.launch {
permissionStorage.updateSitePermissions(updatedPermissions)
permissionStorage.updateSitePermissions(updatedPermissions, tab.content.private)
reload(sessionId)
}
}

View File

@ -59,7 +59,12 @@ class SitePermissionsDetailsExceptionsFragment : PreferenceFragmentCompat() {
showToolbar(sitePermissions.origin.stripDefaultPort())
viewLifecycleOwner.lifecycleScope.launch(Main) {
sitePermissions =
requireNotNull(requireComponents.core.permissionStorage.findSitePermissionsBy(sitePermissions.origin))
requireNotNull(
requireComponents.core.permissionStorage.findSitePermissionsBy(
sitePermissions.origin,
private = false,
),
)
bindCategoryPhoneFeatures()
}
}

View File

@ -224,7 +224,10 @@ class SitePermissionsManageExceptionsPhoneFeatureFragment : Fragment() {
private fun updatedSitePermissions(status: SitePermissions.Status) {
val updatedSitePermissions = getSitePermission().update(getFeature(), status)
viewLifecycleOwner.lifecycleScope.launch(Main) {
requireComponents.core.permissionStorage.updateSitePermissions(updatedSitePermissions)
requireComponents.core.permissionStorage.updateSitePermissions(
sitePermissions = updatedSitePermissions,
private = false,
)
requireComponents.tryReloadTabBy(updatedSitePermissions.origin)
}
}
@ -233,7 +236,10 @@ class SitePermissionsManageExceptionsPhoneFeatureFragment : Fragment() {
internal fun updatedSitePermissions(autoplayValue: AutoplayValue) {
val updatedSitePermissions = autoplayValue.updateSitePermissions(getSitePermission())
viewLifecycleOwner.lifecycleScope.launch(Main) {
requireComponents.core.permissionStorage.updateSitePermissions(updatedSitePermissions)
requireComponents.core.permissionStorage.updateSitePermissions(
sitePermissions = updatedSitePermissions,
private = false,
)
requireComponents.tryReloadTabBy(updatedSitePermissions.origin)
}
}

View File

@ -30,7 +30,7 @@ class PermissionStorageTest {
storage.add(sitePermissions)
coVerify { sitePermissionsStorage.save(sitePermissions) }
coVerify { sitePermissionsStorage.save(sitePermissions, private = false) }
}
@Test
@ -39,11 +39,11 @@ class PermissionStorageTest {
val sitePermissionsStorage: SitePermissionsStorage = mockk(relaxed = true)
val storage = PermissionStorage(testContext, this.coroutineContext, sitePermissionsStorage)
coEvery { sitePermissionsStorage.findSitePermissionsBy(any()) } returns sitePermissions
coEvery { sitePermissionsStorage.findSitePermissionsBy(any(), any(), any()) } returns sitePermissions
val result = storage.findSitePermissionsBy("origin")
val result = storage.findSitePermissionsBy("origin", false)
coVerify { sitePermissionsStorage.findSitePermissionsBy("origin") }
coVerify { sitePermissionsStorage.findSitePermissionsBy("origin", private = false) }
assertEquals(sitePermissions, result)
}
@ -54,9 +54,9 @@ class PermissionStorageTest {
val sitePermissionsStorage: SitePermissionsStorage = mockk(relaxed = true)
val storage = PermissionStorage(testContext, this.coroutineContext, sitePermissionsStorage)
storage.updateSitePermissions(sitePermissions)
storage.updateSitePermissions(sitePermissions, private = false)
coVerify { sitePermissionsStorage.update(sitePermissions) }
coVerify { sitePermissionsStorage.update(sitePermissions, private = false) }
}
@Test
@ -82,7 +82,7 @@ class PermissionStorageTest {
storage.deleteSitePermissions(sitePermissions)
coVerify { sitePermissionsStorage.remove(sitePermissions) }
coVerify { sitePermissionsStorage.remove(sitePermissions, private = false) }
}
@Test

View File

@ -284,7 +284,7 @@ class DefaultQuickSettingsControllerTest {
advanceUntilIdle()
coVerifyOrder {
permissionStorage.updateSitePermissions(testPermissions)
permissionStorage.updateSitePermissions(testPermissions, tab.content.private)
reload(tab.id)
}
}