For #26398 - Filter recent synced tabs using the homescreen blocklist

pull/543/head
Alexandru2909 2 years ago committed by mergify[bot]
parent 7944e442a5
commit 43e629b7fb

@ -7,6 +7,7 @@ package org.mozilla.fenix.home.blocklist
import androidx.annotation.VisibleForTesting
import mozilla.components.support.ktx.kotlin.sha1
import org.mozilla.fenix.home.recentbookmarks.RecentBookmark
import org.mozilla.fenix.home.recentsyncedtabs.RecentSyncedTab
import org.mozilla.fenix.home.recenttabs.RecentTab
import org.mozilla.fenix.home.recentvisits.RecentlyVisitedItem
import org.mozilla.fenix.utils.Settings
@ -64,6 +65,18 @@ class BlocklistHandler(private val settings: Settings) {
}
}
/**
* Filter a list of recently synced tabs by the blocklist. Requires this class to be contextually
* in a scope.
*/
@JvmName("filterRecentSyncedTab")
fun List<RecentSyncedTab>.filteredByBlocklist(): List<RecentSyncedTab> =
settings.homescreenBlocklist.let { blocklist ->
filterNot {
blocklistContainsUrl(blocklist, it.url)
}
}
private fun blocklistContainsUrl(blocklist: Set<String>, url: String): Boolean =
blocklist.any { it == url.stripAndHash() }
}

@ -8,6 +8,7 @@ import mozilla.components.lib.state.Middleware
import mozilla.components.lib.state.MiddlewareContext
import org.mozilla.fenix.components.appstate.AppAction
import org.mozilla.fenix.components.appstate.AppState
import org.mozilla.fenix.home.recentsyncedtabs.RecentSyncedTabState
import org.mozilla.fenix.home.recenttabs.RecentTab
/**
@ -57,6 +58,15 @@ class BlocklistMiddleware(
is AppAction.RecentHistoryChange -> {
action.copy(recentHistory = action.recentHistory.filteredByBlocklist())
}
is AppAction.RecentSyncedTabStateChange -> {
if (action.state is RecentSyncedTabState.Success) {
action.copy(
state = RecentSyncedTabState.Success(action.state.tabs.filteredByBlocklist())
)
} else {
action
}
}
is AppAction.RemoveRecentTab -> {
if (action.recentTab is RecentTab.Tab) {
addUrlToBlocklist(action.recentTab.state.content.url)

@ -10,6 +10,7 @@ import io.mockk.slot
import mozilla.components.browser.state.state.createTab
import mozilla.components.support.test.ext.joinBlocking
import mozilla.components.support.test.middleware.CaptureActionsMiddleware
import mozilla.components.support.test.mock
import org.junit.Assert.assertEquals
import org.junit.Assert.assertTrue
import org.junit.Test
@ -17,6 +18,8 @@ import org.mozilla.fenix.components.AppStore
import org.mozilla.fenix.components.appstate.AppAction
import org.mozilla.fenix.components.appstate.AppState
import org.mozilla.fenix.home.recentbookmarks.RecentBookmark
import org.mozilla.fenix.home.recentsyncedtabs.RecentSyncedTab
import org.mozilla.fenix.home.recentsyncedtabs.RecentSyncedTabState
import org.mozilla.fenix.home.recenttabs.RecentTab
import org.mozilla.fenix.utils.Settings
@ -296,4 +299,46 @@ class BlocklistMiddlewareTest {
assertTrue(store.state.recentBookmarks.isEmpty())
}
@Test
fun `WHEN new recently synced tabs are submitted THEN urls matching the blocklist should be removed`() {
val blockedHost = "https://www.mozilla.org"
val blockedTab = RecentSyncedTab(
deviceDisplayName = "",
deviceType = mock(),
title = "",
url = "https://www.mozilla.org",
previewImageUrl = ""
)
val allowedTab = RecentSyncedTab(
deviceDisplayName = "",
deviceType = mock(),
title = "",
url = "https://github.com",
previewImageUrl = ""
)
every { mockSettings.homescreenBlocklist } returns setOf(blockedHost.stripAndHash())
val middleware = BlocklistMiddleware(blocklistHandler)
val store = AppStore(
AppState(),
middlewares = listOf(middleware)
)
store.dispatch(
AppAction.RecentSyncedTabStateChange(
RecentSyncedTabState.Success(
listOf(
blockedTab,
allowedTab
)
)
)
).joinBlocking()
assertEquals(
allowedTab,
(store.state.recentSyncedTabState as RecentSyncedTabState.Success).tabs.single()
)
}
}

Loading…
Cancel
Save