@@ -18,6 +18,7 @@ package com.duckduckgo.privacy.config.impl.features.trackingparameters
1818
1919import android.net.Uri
2020import androidx.annotation.VisibleForTesting
21+ import androidx.core.net.toUri
2122import com.duckduckgo.app.browser.UriString
2223import com.duckduckgo.app.privacy.db.UserAllowListRepository
2324import com.duckduckgo.common.utils.replaceQueryParameters
@@ -63,7 +64,12 @@ class RealTrackingParameters @Inject constructor(
6364
6465 val trackingParameters = trackingParametersRepository.parameters
6566
66- val uri = Uri .parse(url)
67+ val parsedUri = Uri .parse(url)
68+ // In some instances, particularly with ads, the query may represent a different URL (without encoding),
69+ // making it difficult to detect accurately.
70+ val query = parsedUri.query
71+ val queryUri = query?.toUri()
72+ val uri = if (queryUri?.isValid() == true ) queryUri else parsedUri
6773
6874 try {
6975 val queryParameters = uri.queryParameterNames
@@ -75,7 +81,8 @@ class RealTrackingParameters @Inject constructor(
7581 if (preservedParameters.size == queryParameters.size) {
7682 return null
7783 }
78- val cleanedUrl = uri.replaceQueryParameters(preservedParameters).toString()
84+ val interimCleanedUrl = uri.replaceQueryParameters(preservedParameters).toString()
85+ val cleanedUrl = if (queryUri?.isValid() == true ) url.replace(query, interimCleanedUrl) else interimCleanedUrl
7986
8087 lastCleanedUrl = cleanedUrl
8188
@@ -86,6 +93,10 @@ class RealTrackingParameters @Inject constructor(
8693 }
8794 }
8895
96+ private fun Uri?.isValid (): Boolean {
97+ return this ?.isAbsolute == true && this .isHierarchical
98+ }
99+
89100 private fun getPreservedParameters (
90101 queryParameters : MutableSet <String >,
91102 trackingParameters : List <String >,
0 commit comments