For #13812: add ETP category for redirect trackers (#15139)

* Feature flag for ETP cookie purging

* Strings for new ETP description

* Remove icons from ETP info screeen and add category for redirect trackers

* ETP policy factory tests

* Remove icons from ETP panel and add cross tracking allowed field.

* Remove icons on ETP panel. Add blocked category for redirect trackers to panel.

* Add margins to tracking protection settings
pull/149/head
Elise Richards 4 years ago committed by GitHub
parent 6781018556
commit a4ff782565
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -45,4 +45,9 @@ object FeatureFlags {
* Enables swipe to delete in bookmarks
*/
val bookmarkSwipeToDelete = Config.channel.isNightlyOrDebug
/**
* Enables ETP cookie purging
*/
val etpCookiePurging = Config.channel.isNightlyOrDebug
}

@ -8,6 +8,7 @@ import androidx.annotation.VisibleForTesting
import mozilla.components.concept.engine.EngineSession.TrackingProtectionPolicy
import mozilla.components.concept.engine.EngineSession.TrackingProtectionPolicyForSessionTypes
import org.mozilla.fenix.Config
import org.mozilla.fenix.FeatureFlags
import org.mozilla.fenix.utils.Settings
/**
@ -102,6 +103,6 @@ internal fun TrackingProtectionPolicyForSessionTypes.adaptPolicyToChannel(): Tra
trackingCategories = trackingCategories,
cookiePolicy = cookiePolicy,
strictSocialTrackingProtection = strictSocialTrackingProtection,
cookiePurging = Config.channel.isNightlyOrDebug
cookiePurging = FeatureFlags.etpCookiePurging
)
}

@ -10,6 +10,7 @@ import androidx.core.view.isVisible
import androidx.fragment.app.Fragment
import androidx.navigation.fragment.navArgs
import kotlinx.android.synthetic.main.fragment_tracking_protection_blocking.*
import org.mozilla.fenix.FeatureFlags
import org.mozilla.fenix.R
import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.ext.showToolbar
@ -22,6 +23,7 @@ class TrackingProtectionBlockingFragment :
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
category_redirect_trackers.isVisible = FeatureFlags.etpCookiePurging
when (args.protectionMode) {
TrackingProtectionMode.STANDARD -> {

@ -7,7 +7,6 @@ package org.mozilla.fenix.trackingprotection
import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import androidx.appcompat.content.res.AppCompatResources
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.content.withStyledAttributes
import kotlinx.android.synthetic.main.tracking_protection_category.view.*
@ -27,11 +26,6 @@ class TrackingProtectionCategoryItem @JvmOverloads constructor(
defStyleAttr,
0
) {
val id = getResourceId(
R.styleable.TrackingProtectionCategory_categoryItemIcon,
R.drawable.ic_cryptominers
)
trackingProtectionCategoryIcon?.background = AppCompatResources.getDrawable(context, id)
trackingProtectionCategoryTitle?.text = resources.getString(
getResourceId(
R.styleable.TrackingProtectionCategory_categoryItemTitle,

@ -149,9 +149,14 @@ class TrackingProtectionPanelView(
}
}
/**
* Checks whether the permission was allowed or blocked when they were last used based on
* visibility, where "..._loaded" titles correspond to "Allowed" permissions and the other
* corresponds to "Blocked" permissions for each category.
*/
private fun getLastUsedCategoryView(categoryTitle: String) = when (categoryTitle) {
CROSS_SITE_TRACKING_COOKIES.name -> {
cross_site_tracking
if (cross_site_tracking.isGone) cross_site_tracking_loaded else cross_site_tracking
}
SOCIAL_MEDIA_TRACKERS.name -> {
if (social_media_trackers.isGone) social_media_trackers_loaded else social_media_trackers
@ -171,11 +176,14 @@ class TrackingProtectionPanelView(
private fun updateCategoryVisibility() {
cross_site_tracking.isGone =
bucketedTrackers.get(CROSS_SITE_TRACKING_COOKIES, true).isEmpty()
social_media_trackers.isGone = bucketedTrackers.get(SOCIAL_MEDIA_TRACKERS, true).isEmpty()
social_media_trackers.isGone =
bucketedTrackers.get(SOCIAL_MEDIA_TRACKERS, true).isEmpty()
fingerprinters.isGone = bucketedTrackers.get(FINGERPRINTERS, true).isEmpty()
tracking_content.isGone = bucketedTrackers.get(TRACKING_CONTENT, true).isEmpty()
cryptominers.isGone = bucketedTrackers.get(CRYPTOMINERS, true).isEmpty()
cross_site_tracking_loaded.isGone =
bucketedTrackers.get(CROSS_SITE_TRACKING_COOKIES, false).isEmpty()
social_media_trackers_loaded.isGone =
bucketedTrackers.get(SOCIAL_MEDIA_TRACKERS, false).isEmpty()
fingerprinters_loaded.isGone = bucketedTrackers.get(FINGERPRINTERS, false).isEmpty()
@ -189,6 +197,7 @@ class TrackingProtectionPanelView(
cross_site_tracking.setOnClickListener(this)
tracking_content.setOnClickListener(this)
cryptominers.setOnClickListener(this)
cross_site_tracking_loaded.setOnClickListener(this)
social_media_trackers_loaded.setOnClickListener(this)
fingerprinters_loaded.setOnClickListener(this)
tracking_content_loaded.setOnClickListener(this)
@ -251,7 +260,7 @@ class TrackingProtectionPanelView(
private fun getCategory(v: View) = when (v.id) {
R.id.social_media_trackers, R.id.social_media_trackers_loaded -> SOCIAL_MEDIA_TRACKERS
R.id.fingerprinters, R.id.fingerprinters_loaded -> FINGERPRINTERS
R.id.cross_site_tracking -> CROSS_SITE_TRACKING_COOKIES
R.id.cross_site_tracking, R.id.cross_site_tracking_loaded -> CROSS_SITE_TRACKING_COOKIES
R.id.tracking_content, R.id.tracking_content_loaded -> TRACKING_CONTENT
R.id.cryptominers, R.id.cryptominers_loaded -> CRYPTOMINERS
else -> null
@ -262,6 +271,7 @@ class TrackingProtectionPanelView(
*/
private fun isLoaded(v: View) = when (v.id) {
R.id.social_media_trackers_loaded,
R.id.cross_site_tracking_loaded,
R.id.fingerprinters_loaded,
R.id.tracking_content_loaded,
R.id.cryptominers_loaded -> true

@ -61,7 +61,6 @@
android:layout_height="@dimen/tracking_protection_item_height"
android:text="@string/etp_cookies_title"
android:visibility="gone"
app:drawableStartCompat="@drawable/ic_cookies"
app:layout_constraintTop_toBottomOf="@id/blocking_header" />
<TextView
@ -71,7 +70,6 @@
android:layout_height="@dimen/tracking_protection_item_height"
android:text="@string/etp_fingerprinters_title"
android:visibility="gone"
app:drawableStartCompat="@drawable/ic_fingerprinters"
app:layout_constraintTop_toBottomOf="@id/cross_site_tracking" />
<TextView
@ -81,7 +79,6 @@
android:layout_height="@dimen/tracking_protection_item_height"
android:text="@string/etp_cryptominers_title"
android:visibility="gone"
app:drawableStartCompat="@drawable/ic_cryptominers"
app:layout_constraintTop_toBottomOf="@id/fingerprinters" />
<TextView
@ -91,7 +88,6 @@
android:layout_height="@dimen/tracking_protection_item_height"
android:text="@string/etp_social_media_trackers_title"
android:visibility="gone"
app:drawableStartCompat="@drawable/ic_social_media_trackers"
app:layout_constraintTop_toBottomOf="@id/cryptominers" />
<TextView
@ -101,7 +97,6 @@
android:layout_height="@dimen/tracking_protection_item_height"
android:text="@string/etp_tracking_content_title"
android:visibility="gone"
app:drawableStartCompat="@drawable/ic_tracking_content"
app:layout_constraintTop_toBottomOf="@id/social_media_trackers" />
<TextView
@ -117,6 +112,15 @@
app:layout_constraintTop_toBottomOf="@id/tracking_content"
tools:targetApi="p" />
<TextView
android:id="@+id/cross_site_tracking_loaded"
style="@style/QuickSettingsLargeText.Icon"
android:layout_width="match_parent"
android:layout_height="@dimen/tracking_protection_item_height"
android:text="@string/etp_cookies_title"
android:visibility="gone"
app:layout_constraintTop_toBottomOf="@id/not_blocking_header" />
<TextView
android:id="@+id/fingerprinters_loaded"
style="@style/QuickSettingsLargeText.Icon"
@ -124,8 +128,7 @@
android:layout_height="@dimen/tracking_protection_item_height"
android:text="@string/etp_fingerprinters_title"
android:visibility="gone"
app:drawableStartCompat="@drawable/ic_fingerprinters"
app:layout_constraintTop_toBottomOf="@id/not_blocking_header" />
app:layout_constraintTop_toBottomOf="@id/cross_site_tracking_loaded" />
<TextView
android:id="@+id/cryptominers_loaded"
@ -134,7 +137,6 @@
android:layout_height="@dimen/tracking_protection_item_height"
android:text="@string/etp_cryptominers_title"
android:visibility="gone"
app:drawableStartCompat="@drawable/ic_cryptominers"
app:layout_constraintTop_toBottomOf="@id/fingerprinters_loaded" />
<TextView
@ -144,7 +146,6 @@
android:layout_height="@dimen/tracking_protection_item_height"
android:text="@string/etp_social_media_trackers_title"
android:visibility="gone"
app:drawableStartCompat="@drawable/ic_social_media_trackers"
app:layout_constraintTop_toBottomOf="@id/cryptominers_loaded" />
<TextView
@ -154,7 +155,6 @@
android:layout_height="@dimen/tracking_protection_item_height"
android:text="@string/etp_tracking_content_title"
android:visibility="gone"
app:drawableStartCompat="@drawable/ic_tracking_content"
app:layout_constraintTop_toBottomOf="@id/social_media_trackers_loaded" />
<View

@ -31,7 +31,6 @@
android:clickable="true"
android:focusable="true"
app:categoryItemDescription="@string/etp_social_media_trackers_description"
app:categoryItemIcon="@drawable/ic_social_media_trackers"
app:categoryItemTitle="@string/etp_social_media_trackers_title" />
<org.mozilla.fenix.trackingprotection.TrackingProtectionCategoryItem
@ -42,7 +41,6 @@
android:clickable="true"
android:focusable="true"
app:categoryItemDescription="@string/etp_cookies_description"
app:categoryItemIcon="@drawable/ic_cookies"
app:categoryItemTitle="@string/etp_cookies_title" />
<org.mozilla.fenix.trackingprotection.TrackingProtectionCategoryItem
@ -53,7 +51,6 @@
android:clickable="true"
android:focusable="true"
app:categoryItemDescription="@string/etp_cryptominers_description"
app:categoryItemIcon="@drawable/ic_cryptominers"
app:categoryItemTitle="@string/etp_cryptominers_title" />
<org.mozilla.fenix.trackingprotection.TrackingProtectionCategoryItem
@ -64,7 +61,6 @@
android:clickable="true"
android:focusable="true"
app:categoryItemDescription="@string/etp_fingerprinters_description"
app:categoryItemIcon="@drawable/ic_fingerprinters"
app:categoryItemTitle="@string/etp_fingerprinters_title" />
<org.mozilla.fenix.trackingprotection.TrackingProtectionCategoryItem
@ -75,7 +71,17 @@
android:clickable="true"
android:focusable="true"
app:categoryItemDescription="@string/etp_tracking_content_description"
app:categoryItemIcon="@drawable/ic_tracking_content"
app:categoryItemTitle="@string/etp_tracking_content_title" />
<org.mozilla.fenix.trackingprotection.TrackingProtectionCategoryItem
android:id="@+id/category_redirect_trackers"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?android:attr/selectableItemBackground"
android:clickable="true"
android:focusable="true"
android:visibility="gone"
app:categoryItemDescription="@string/etp_redirect_trackers_description"
app:categoryItemTitle="@string/etp_redirect_trackers_title" />
</LinearLayout>
</ScrollView>

@ -9,25 +9,11 @@
android:layout_height="wrap_content"
tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout">
<ImageView
android:id="@+id/trackingProtectionCategoryIcon"
android:layout_width="@dimen/preference_icon_drawable_size"
android:layout_height="@dimen/preference_icon_drawable_size"
android:layout_marginStart="@dimen/library_item_icon_margin_horizontal"
android:layout_marginTop="@dimen/library_item_icon_margin_vertical"
android:layout_marginEnd="@dimen/library_item_icon_margin_horizontal"
android:layout_marginBottom="@dimen/library_item_icon_margin_vertical"
android:background="@drawable/ic_cryptominers"
android:clickable="false"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/trackingProtectionCategoryTitle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/radio_button_drawable_padding"
android:layout_marginStart="@dimen/top_bar_alignment_margin_start"
android:layout_marginTop="@dimen/about_list_margin_top"
android:layout_marginEnd="@dimen/library_item_icon_margin_horizontal"
android:clickable="false"
@ -36,15 +22,14 @@
app:layout_constraintBottom_toTopOf="@+id/trackingProtectionCategoryItemDescription"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@id/trackingProtectionCategoryIcon"
app:layout_constraintTop_toTopOf="parent"
tools:text="@tools:sample/lorem" />
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/trackingProtectionCategoryItemDescription"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/radio_button_drawable_padding"
android:layout_marginStart="@dimen/top_bar_alignment_margin_start"
android:layout_marginEnd="@dimen/library_item_icon_margin_horizontal"
android:layout_marginBottom="@dimen/tracking_protection_item_margin_bottom"
android:clickable="false"
@ -52,7 +37,6 @@
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@id/trackingProtectionCategoryIcon"
app:layout_constraintTop_toBottomOf="@+id/trackingProtectionCategoryTitle"
tools:text="@tools:sample/lorem/random" />
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/trackingProtectionCategoryTitle" />
</merge>

@ -72,7 +72,6 @@
<declare-styleable name="TrackingProtectionCategory">
<attr name="categoryItemTitle" format="reference" />
<attr name="categoryItemDescription" format="reference" />
<attr name="categoryItemIcon" format="reference" />
</declare-styleable>
<declare-styleable name="SwitchWithDescription">

@ -1255,6 +1255,10 @@
<!-- Open source licenses page title
The first parameter is the app name -->
<string name="open_source_licenses_title">%s | OSS Libraries</string>
<!-- Category of trackers (redirect trackers) that can be blocked by Enhanced Tracking Protection -->
<string name="etp_redirect_trackers_title">Redirect Trackers</string>
<!-- Description of redirect tracker cookies that can be blocked by Enhanced Tracking Protection -->
<string name="etp_redirect_trackers_description">Clears cookies set by redirects to known tracking websites.</string>
<!-- About page link text to open support link -->
<string name="about_support">Support</string>

@ -3,7 +3,6 @@ package org.mozilla.fenix.components
import io.mockk.every
import io.mockk.mockk
import io.mockk.mockkObject
import mozilla.components.concept.engine.EngineSession
import mozilla.components.concept.engine.EngineSession.TrackingProtectionPolicy
import mozilla.components.support.test.robolectric.testContext
import org.junit.Assert.assertArrayEquals
@ -13,6 +12,7 @@ import org.junit.Assert.assertTrue
import org.junit.Test
import org.junit.runner.RunWith
import org.mozilla.fenix.Config
import org.mozilla.fenix.FeatureFlags
import org.mozilla.fenix.R
import org.mozilla.fenix.ReleaseChannel
import org.mozilla.fenix.utils.Settings
@ -23,7 +23,7 @@ class TrackingProtectionPolicyFactoryTest {
@Test
fun `WHEN useStrictMode is true then SHOULD return strict mode`() {
val expected = EngineSession.TrackingProtectionPolicy.strict()
val expected = TrackingProtectionPolicy.strict()
val factory = TrackingProtectionPolicyFactory(mockSettings(useStrict = true))
@ -35,12 +35,12 @@ class TrackingProtectionPolicyFactoryTest {
expected.assertPolicyEquals(privateOnly, checkPrivacy = false)
expected.assertPolicyEquals(normalOnly, checkPrivacy = false)
expected.assertPolicyEquals(always, checkPrivacy = false)
EngineSession.TrackingProtectionPolicy.none().assertPolicyEquals(none, checkPrivacy = false)
TrackingProtectionPolicy.none().assertPolicyEquals(none, checkPrivacy = false)
}
@Test
fun `WHEN neither use strict nor use custom is true SHOULD return recommended mode`() {
val expected = EngineSession.TrackingProtectionPolicy.recommended()
val expected = TrackingProtectionPolicy.recommended()
val factory = TrackingProtectionPolicyFactory(mockSettings(useStrict = false, useCustom = false))
@ -52,13 +52,13 @@ class TrackingProtectionPolicyFactoryTest {
expected.assertPolicyEquals(privateOnly, checkPrivacy = false)
expected.assertPolicyEquals(normalOnly, checkPrivacy = false)
expected.assertPolicyEquals(always, checkPrivacy = false)
EngineSession.TrackingProtectionPolicy.none().assertPolicyEquals(none, checkPrivacy = false)
TrackingProtectionPolicy.none().assertPolicyEquals(none, checkPrivacy = false)
}
@Test
fun `GIVEN custom policy WHEN should not block cookies THEN tracking policy should not block cookies`() {
val expected = EngineSession.TrackingProtectionPolicy.select(
cookiePolicy = EngineSession.TrackingProtectionPolicy.CookiePolicy.ACCEPT_ALL,
val expected = TrackingProtectionPolicy.select(
cookiePolicy = TrackingProtectionPolicy.CookiePolicy.ACCEPT_ALL,
trackingCategories = allTrackingCategories
)
@ -75,8 +75,8 @@ class TrackingProtectionPolicyFactoryTest {
@Test
fun `GIVEN custom policy WHEN cookie policy block all THEN tracking policy should have cookie policy allow none`() {
val expected = EngineSession.TrackingProtectionPolicy.select(
cookiePolicy = EngineSession.TrackingProtectionPolicy.CookiePolicy.ACCEPT_NONE,
val expected = TrackingProtectionPolicy.select(
cookiePolicy = TrackingProtectionPolicy.CookiePolicy.ACCEPT_NONE,
trackingCategories = allTrackingCategories
)
@ -91,34 +91,6 @@ class TrackingProtectionPolicyFactoryTest {
expected.assertPolicyEquals(always, checkPrivacy = false)
}
@Test
fun `cookiePurging must be available ONLY in nightly or debug`() {
mockkObject(Config)
for (channel in ReleaseChannel.values()) {
every { Config.channel } returns channel
val shouldCookiePurgingActive = channel.isNightlyOrDebug
val customSetting =
settingsForCustom(shouldBlockCookiesInCustom = true, blockCookiesSelection = "all")
val stringSetting = mockSettings(useStrict = true)
val recommendedSetting = mockSettings(useTrackingProtection = true)
for (setting in arrayOf(recommendedSetting, stringSetting, customSetting)) {
val factory = TrackingProtectionPolicyFactory(setting)
val privateOnly =
factory.createTrackingProtectionPolicy(normalMode = false, privateMode = true)
val normalOnly =
factory.createTrackingProtectionPolicy(normalMode = true, privateMode = false)
val always =
factory.createTrackingProtectionPolicy(normalMode = true, privateMode = true)
assertEquals(shouldCookiePurgingActive, privateOnly.cookiePurging)
assertEquals(shouldCookiePurgingActive, normalOnly.cookiePurging)
assertEquals(shouldCookiePurgingActive, always.cookiePurging)
}
}
}
@Test
fun `adaptPolicyToChannel MUST only update properties that have changed per given channel`() {
mockkObject(Config)
@ -131,20 +103,17 @@ class TrackingProtectionPolicyFactoryTest {
for (channel in ReleaseChannel.values()) {
every { Config.channel } returns channel
val shouldCookiePurgingActive = channel.isNightlyOrDebug
for (policy in policies) {
val adaptedPolicy = policy.adaptPolicyToChannel()
policy.assertPolicyEquals(adaptedPolicy, checkPrivacy = false)
assertEquals(shouldCookiePurgingActive, adaptedPolicy.cookiePurging)
}
}
}
@Test
fun `GIVEN custom policy WHEN cookie policy social THEN tracking policy should have cookie policy allow non-trackers`() {
val expected = EngineSession.TrackingProtectionPolicy.select(
cookiePolicy = EngineSession.TrackingProtectionPolicy.CookiePolicy.ACCEPT_NON_TRACKERS,
val expected = TrackingProtectionPolicy.select(
cookiePolicy = TrackingProtectionPolicy.CookiePolicy.ACCEPT_NON_TRACKERS,
trackingCategories = allTrackingCategories
)
@ -161,8 +130,8 @@ class TrackingProtectionPolicyFactoryTest {
@Test
fun `GIVEN custom policy WHEN cookie policy accept visited THEN tracking policy should have cookie policy allow visited`() {
val expected = EngineSession.TrackingProtectionPolicy.select(
cookiePolicy = EngineSession.TrackingProtectionPolicy.CookiePolicy.ACCEPT_VISITED,
val expected = TrackingProtectionPolicy.select(
cookiePolicy = TrackingProtectionPolicy.CookiePolicy.ACCEPT_VISITED,
trackingCategories = allTrackingCategories
)
@ -179,8 +148,8 @@ class TrackingProtectionPolicyFactoryTest {
@Test
fun `GIVEN custom policy WHEN cookie policy block third party THEN tracking policy should have cookie policy allow first party`() {
val expected = EngineSession.TrackingProtectionPolicy.select(
cookiePolicy = EngineSession.TrackingProtectionPolicy.CookiePolicy.ACCEPT_ONLY_FIRST_PARTY,
val expected = TrackingProtectionPolicy.select(
cookiePolicy = TrackingProtectionPolicy.CookiePolicy.ACCEPT_ONLY_FIRST_PARTY,
trackingCategories = allTrackingCategories
)
@ -197,8 +166,8 @@ class TrackingProtectionPolicyFactoryTest {
@Test
fun `GIVEN custom policy WHEN cookie policy unrecognized THEN tracking policy should have cookie policy block all`() {
val expected = EngineSession.TrackingProtectionPolicy.select(
cookiePolicy = EngineSession.TrackingProtectionPolicy.CookiePolicy.ACCEPT_NONE,
val expected = TrackingProtectionPolicy.select(
cookiePolicy = TrackingProtectionPolicy.CookiePolicy.ACCEPT_NONE,
trackingCategories = allTrackingCategories
)
@ -261,7 +230,7 @@ class TrackingProtectionPolicyFactoryTest {
useETPFactory = TrackingProtectionPolicyFactory(mockSettings(useTrackingProtection = false))
policy = useETPFactory.createTrackingProtectionPolicy()
assertEquals(policy, EngineSession.TrackingProtectionPolicy.none())
assertEquals(policy, TrackingProtectionPolicy.none())
}
@Test
@ -306,14 +275,14 @@ class TrackingProtectionPolicyFactoryTest {
@Test
fun `GIVEN custom policy WHEN default tracking policies THEN tracking policies should match default`() {
val defaultTrackingCategories = arrayOf(
EngineSession.TrackingProtectionPolicy.TrackingCategory.AD,
EngineSession.TrackingProtectionPolicy.TrackingCategory.ANALYTICS,
EngineSession.TrackingProtectionPolicy.TrackingCategory.SOCIAL,
EngineSession.TrackingProtectionPolicy.TrackingCategory.MOZILLA_SOCIAL
TrackingProtectionPolicy.TrackingCategory.AD,
TrackingProtectionPolicy.TrackingCategory.ANALYTICS,
TrackingProtectionPolicy.TrackingCategory.SOCIAL,
TrackingProtectionPolicy.TrackingCategory.MOZILLA_SOCIAL
)
val expected = EngineSession.TrackingProtectionPolicy.select(
cookiePolicy = EngineSession.TrackingProtectionPolicy.CookiePolicy.ACCEPT_NONE,
val expected = TrackingProtectionPolicy.select(
cookiePolicy = TrackingProtectionPolicy.CookiePolicy.ACCEPT_NONE,
trackingCategories = defaultTrackingCategories
)
@ -332,8 +301,8 @@ class TrackingProtectionPolicyFactoryTest {
@Test
fun `GIVEN custom policy WHEN all tracking policies THEN tracking policies should match all`() {
val expected = EngineSession.TrackingProtectionPolicy.select(
cookiePolicy = EngineSession.TrackingProtectionPolicy.CookiePolicy.ACCEPT_NONE,
val expected = TrackingProtectionPolicy.select(
cookiePolicy = TrackingProtectionPolicy.CookiePolicy.ACCEPT_NONE,
trackingCategories = allTrackingCategories
)
@ -353,15 +322,15 @@ class TrackingProtectionPolicyFactoryTest {
@Test
fun `GIVEN custom policy WHEN some tracking policies THEN tracking policies should match passed policies`() {
val someTrackingCategories = arrayOf(
EngineSession.TrackingProtectionPolicy.TrackingCategory.AD,
EngineSession.TrackingProtectionPolicy.TrackingCategory.ANALYTICS,
EngineSession.TrackingProtectionPolicy.TrackingCategory.SOCIAL,
EngineSession.TrackingProtectionPolicy.TrackingCategory.MOZILLA_SOCIAL,
EngineSession.TrackingProtectionPolicy.TrackingCategory.FINGERPRINTING
TrackingProtectionPolicy.TrackingCategory.AD,
TrackingProtectionPolicy.TrackingCategory.ANALYTICS,
TrackingProtectionPolicy.TrackingCategory.SOCIAL,
TrackingProtectionPolicy.TrackingCategory.MOZILLA_SOCIAL,
TrackingProtectionPolicy.TrackingCategory.FINGERPRINTING
)
val expected = EngineSession.TrackingProtectionPolicy.select(
cookiePolicy = EngineSession.TrackingProtectionPolicy.CookiePolicy.ACCEPT_NONE,
val expected = TrackingProtectionPolicy.select(
cookiePolicy = TrackingProtectionPolicy.CookiePolicy.ACCEPT_NONE,
trackingCategories = someTrackingCategories
)
@ -377,6 +346,55 @@ class TrackingProtectionPolicyFactoryTest {
expected.assertPolicyEquals(actual, checkPrivacy = false)
}
@Test
fun `GIVEN custom policy WHEN some tracking policies THEN purge cookies`() {
val expected = TrackingProtectionPolicy.select(
cookiePolicy = TrackingProtectionPolicy.CookiePolicy.ACCEPT_NONE,
trackingCategories = allTrackingCategories,
cookiePurging = FeatureFlags.etpCookiePurging
)
val factory = TrackingProtectionPolicyFactory(settingsForCustom(shouldBlockCookiesInCustom = true))
val privateOnly = factory.createTrackingProtectionPolicy(normalMode = false, privateMode = true)
val normalOnly = factory.createTrackingProtectionPolicy(normalMode = true, privateMode = false)
val always = factory.createTrackingProtectionPolicy(normalMode = true, privateMode = true)
expected.assertPolicyEquals(privateOnly, checkPrivacy = false)
expected.assertPolicyEquals(normalOnly, checkPrivacy = false)
expected.assertPolicyEquals(always, checkPrivacy = false)
}
@Test
fun `GIVEN strict policy WHEN some tracking policies THEN purge cookies`() {
val expected = TrackingProtectionPolicy.strict()
val factory = TrackingProtectionPolicyFactory(mockSettings(useStrict = true, useTrackingProtection = true))
val privateOnly = factory.createTrackingProtectionPolicy(normalMode = false, privateMode = true)
val normalOnly = factory.createTrackingProtectionPolicy(normalMode = true, privateMode = false)
val always = factory.createTrackingProtectionPolicy(normalMode = true, privateMode = true)
assertEquals(privateOnly.cookiePurging, expected.cookiePurging)
assertEquals(normalOnly.cookiePurging, expected.cookiePurging)
assertEquals(always.cookiePurging, expected.cookiePurging)
}
@Test
fun `GIVEN standard policy WHEN some tracking policies THEN purge cookies`() {
val expected = TrackingProtectionPolicy.recommended()
val factory = TrackingProtectionPolicyFactory(mockSettings(useStrict = false, useCustom = false, useTrackingProtection = true))
val privateOnly = factory.createTrackingProtectionPolicy(normalMode = false, privateMode = true)
val normalOnly = factory.createTrackingProtectionPolicy(normalMode = true, privateMode = false)
val always = factory.createTrackingProtectionPolicy(normalMode = true, privateMode = true)
assertEquals(privateOnly.cookiePurging, expected.cookiePurging)
assertEquals(normalOnly.cookiePurging, expected.cookiePurging)
assertEquals(always.cookiePurging, expected.cookiePurging)
}
}
private fun mockSettings(
@ -408,8 +426,8 @@ private fun settingsForCustom(
every { blockCryptominersInCustomTrackingProtection } returns blockCryptominers
}
private fun EngineSession.TrackingProtectionPolicy.assertPolicyEquals(
actual: EngineSession.TrackingProtectionPolicy,
private fun TrackingProtectionPolicy.assertPolicyEquals(
actual: TrackingProtectionPolicy,
checkPrivacy: Boolean
) {
assertEquals(this.cookiePolicy, actual.cookiePolicy)
@ -426,16 +444,16 @@ private fun EngineSession.TrackingProtectionPolicy.assertPolicyEquals(
}
}
private fun Array<EngineSession.TrackingProtectionPolicy.TrackingCategory>.toInt(): Int {
private fun Array<TrackingProtectionPolicy.TrackingCategory>.toInt(): Int {
return fold(initial = 0) { acc, next -> acc + next.id }
}
private val allTrackingCategories = arrayOf(
EngineSession.TrackingProtectionPolicy.TrackingCategory.AD,
EngineSession.TrackingProtectionPolicy.TrackingCategory.ANALYTICS,
EngineSession.TrackingProtectionPolicy.TrackingCategory.SOCIAL,
EngineSession.TrackingProtectionPolicy.TrackingCategory.MOZILLA_SOCIAL,
EngineSession.TrackingProtectionPolicy.TrackingCategory.SCRIPTS_AND_SUB_RESOURCES,
EngineSession.TrackingProtectionPolicy.TrackingCategory.FINGERPRINTING,
EngineSession.TrackingProtectionPolicy.TrackingCategory.CRYPTOMINING
TrackingProtectionPolicy.TrackingCategory.AD,
TrackingProtectionPolicy.TrackingCategory.ANALYTICS,
TrackingProtectionPolicy.TrackingCategory.SOCIAL,
TrackingProtectionPolicy.TrackingCategory.MOZILLA_SOCIAL,
TrackingProtectionPolicy.TrackingCategory.SCRIPTS_AND_SUB_RESOURCES,
TrackingProtectionPolicy.TrackingCategory.FINGERPRINTING,
TrackingProtectionPolicy.TrackingCategory.CRYPTOMINING
)

@ -19,6 +19,7 @@ import org.junit.Test
import org.junit.runner.RunWith
import org.mozilla.fenix.R
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
import org.mozilla.fenix.trackingprotection.TrackingProtectionCategory.CROSS_SITE_TRACKING_COOKIES
import org.mozilla.fenix.trackingprotection.TrackingProtectionCategory.SOCIAL_MEDIA_TRACKERS
@RunWith(FenixRobolectricTestRunner::class)
@ -97,4 +98,13 @@ class TrackingProtectionPanelViewTest {
view.social_media_trackers_loaded.performClick()
verify { interactor.openDetails(SOCIAL_MEDIA_TRACKERS, categoryBlocked = false) }
}
@Test
fun testCrossSiteTrackerClick() {
view.cross_site_tracking.performClick()
verify { interactor.openDetails(CROSS_SITE_TRACKING_COOKIES, categoryBlocked = true) }
view.cross_site_tracking_loaded.performClick()
verify { interactor.openDetails(CROSS_SITE_TRACKING_COOKIES, categoryBlocked = false) }
}
}

Loading…
Cancel
Save