Bug 1797577 - Clear site data when turning off cookie banner handling.

This commit is contained in:
Arturo Mejia 2022-12-13 15:45:28 -05:00 committed by mergify[bot]
parent 679cd403e6
commit ae25f75ee4
2 changed files with 71 additions and 13 deletions

View File

@ -5,6 +5,8 @@
package org.mozilla.fenix.settings.quicksettings.protections.cookiebanners
import android.content.Context
import androidx.annotation.VisibleForTesting
import androidx.core.net.toUri
import androidx.fragment.app.Fragment
import androidx.navigation.NavController
import kotlinx.coroutines.CoroutineScope
@ -14,9 +16,11 @@ import kotlinx.coroutines.withContext
import mozilla.components.browser.state.selector.findTabOrCustomTab
import mozilla.components.browser.state.state.SessionState
import mozilla.components.browser.state.store.BrowserStore
import mozilla.components.concept.engine.Engine
import mozilla.components.concept.engine.cookiehandling.CookieBannersStorage
import mozilla.components.concept.engine.permission.SitePermissions
import mozilla.components.feature.session.SessionUseCases
import mozilla.components.lib.publicsuffixlist.PublicSuffixList
import mozilla.components.service.glean.private.NoExtras
import org.mozilla.fenix.GleanMetrics.CookieBanners
import org.mozilla.fenix.browser.BrowserFragmentDirections
@ -60,6 +64,8 @@ class DefaultCookieBannerDetailsController(
private val gravity: Int,
private val getCurrentTab: () -> SessionState?,
private val reload: SessionUseCases.ReloadUrlUseCase,
private val engine: Engine = context.components.core.engine,
private val publicSuffixList: PublicSuffixList = context.components.publicSuffixList,
) : CookieBannerDetailsController {
override fun handleBackPressed() {
@ -105,6 +111,7 @@ class DefaultCookieBannerDetailsController(
)
CookieBanners.exceptionRemoved.record(NoExtras())
} else {
clearSiteData(tab)
cookieBannersStorage.addException(uri = tab.content.url, privateBrowsing = tab.content.private)
CookieBanners.exceptionAdded.record(NoExtras())
}
@ -116,4 +123,19 @@ class DefaultCookieBannerDetailsController(
reload(tab.id)
}
}
@VisibleForTesting
internal suspend fun clearSiteData(tab: SessionState) {
val host = tab.content.url.toUri().host.orEmpty()
val domain = publicSuffixList.getPublicSuffixPlusOne(host).await()
withContext(Dispatchers.Main) {
engine.clearData(
host = domain,
data = Engine.BrowsingData.select(
Engine.BrowsingData.AUTH_SESSIONS,
Engine.BrowsingData.ALL_SITE_DATA,
),
)
}
}
}

View File

@ -9,22 +9,28 @@ import androidx.fragment.app.Fragment
import androidx.navigation.NavController
import androidx.navigation.NavDirections
import io.mockk.MockKAnnotations
import io.mockk.Runs
import io.mockk.coEvery
import io.mockk.coVerifyOrder
import io.mockk.every
import io.mockk.impl.annotations.MockK
import io.mockk.just
import io.mockk.mockk
import io.mockk.slot
import io.mockk.spyk
import io.mockk.verify
import kotlinx.coroutines.CompletableDeferred
import kotlinx.coroutines.test.advanceUntilIdle
import mozilla.components.browser.state.state.BrowserState
import mozilla.components.browser.state.state.TabSessionState
import mozilla.components.browser.state.state.createTab
import mozilla.components.browser.state.store.BrowserStore
import mozilla.components.concept.engine.Engine
import mozilla.components.concept.engine.cookiehandling.CookieBannersStorage
import mozilla.components.concept.engine.permission.SitePermissions
import mozilla.components.feature.session.SessionUseCases
import mozilla.components.feature.session.TrackingProtectionUseCases
import mozilla.components.lib.publicsuffixlist.PublicSuffixList
import mozilla.components.service.glean.testing.GleanTestRule
import mozilla.components.support.test.robolectric.testContext
import mozilla.components.support.test.rule.MainCoroutineRule
@ -70,6 +76,12 @@ internal class DefaultCookieBannerDetailsControllerTest {
@MockK(relaxed = true)
private lateinit var reload: SessionUseCases.ReloadUrlUseCase
@MockK(relaxed = true)
private lateinit var engine: Engine
@MockK(relaxed = true)
private lateinit var publicSuffixList: PublicSuffixList
private var gravity = 54
@get:Rule
@ -86,19 +98,23 @@ internal class DefaultCookieBannerDetailsControllerTest {
context = spyk(testContext)
tab = createTab("https://mozilla.org")
browserStore = BrowserStore(BrowserState(tabs = listOf(tab)))
controller = DefaultCookieBannerDetailsController(
fragment = fragment,
context = context,
ioScope = scope,
cookieBannersStorage = cookieBannersStorage,
navController = { navController },
sitePermissions = sitePermissions,
gravity = gravity,
getCurrentTab = { tab },
sessionId = tab.id,
browserStore = browserStore,
protectionsStore = protectionsStore,
reload = reload,
controller = spyk(
DefaultCookieBannerDetailsController(
fragment = fragment,
context = context,
ioScope = scope,
cookieBannersStorage = cookieBannersStorage,
navController = { navController },
sitePermissions = sitePermissions,
gravity = gravity,
getCurrentTab = { tab },
sessionId = tab.id,
browserStore = browserStore,
protectionsStore = protectionsStore,
engine = engine,
publicSuffixList = publicSuffixList,
reload = reload,
),
)
every { fragment.context } returns context
@ -159,12 +175,14 @@ internal class DefaultCookieBannerDetailsControllerTest {
assertNull(CookieBanners.exceptionRemoved.testGetValue())
every { protectionsStore.dispatch(any()) } returns mockk()
coEvery { controller.clearSiteData(any()) } just Runs
controller.handleTogglePressed(isEnabled)
advanceUntilIdle()
coVerifyOrder {
controller.clearSiteData(tab)
cookieBannersStorage.addException(
uri = tab.content.url,
privateBrowsing = tab.content.private,
@ -179,4 +197,22 @@ internal class DefaultCookieBannerDetailsControllerTest {
assertNotNull(CookieBanners.exceptionAdded.testGetValue())
}
@Test
fun `WHEN clearSiteData THEN delegate the call to the engine`() =
runTestOnMain {
coEvery { publicSuffixList.getPublicSuffixPlusOne(any()) } returns CompletableDeferred("mozilla.org")
controller.clearSiteData(tab)
coVerifyOrder {
engine.clearData(
host = "mozilla.org",
data = Engine.BrowsingData.select(
Engine.BrowsingData.AUTH_SESSIONS,
Engine.BrowsingData.ALL_SITE_DATA,
),
)
}
}
}