Skip to content

Commit 6f08a19

Browse files
authored
Android ad click giving 'Web page not available' error (#4871)
Task/Issue URL: https://app.asana.com/0/414730916066338/1207905708148686/f ### Description Fixed ad click. ### Steps to test this PR See task description for detailed steps. ### NO UI changes
1 parent fd70934 commit 6f08a19

File tree

2 files changed

+19
-2
lines changed
  • privacy-config/privacy-config-impl/src

2 files changed

+19
-2
lines changed

privacy-config/privacy-config-impl/src/main/java/com/duckduckgo/privacy/config/impl/features/trackingparameters/RealTrackingParameters.kt

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package com.duckduckgo.privacy.config.impl.features.trackingparameters
1818

1919
import android.net.Uri
2020
import androidx.annotation.VisibleForTesting
21+
import androidx.core.net.toUri
2122
import com.duckduckgo.app.browser.UriString
2223
import com.duckduckgo.app.privacy.db.UserAllowListRepository
2324
import 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>,

privacy-config/privacy-config-impl/src/test/resources/reference_tests/trackingparameters/tests.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,12 @@
121121
"expectURL": "https://example.com/trk/v1?prof=5555&camp=55559&kct=blah&kchid=123456&criteriaid=blah:blah&campaignid=55556666888&locphy=1234&adgroupid=5555555555&cid=6765676&kdv=g&kext=&kpg=&kpid=&queryStr=blah%20blah&url=https://www.example2.com/landing?show=all&CMP_ID=123456=6666&k_clickid=_1234567_666&utm_id=very-long_string:with-many_symbols&msclkid=1234237546jsdhgkjshf",
122122
"exceptPlatforms": []
123123
},
124+
{
125+
"name": "Tracking parameters are removed correctly in case of ads embedding another URL in params",
126+
"testURL": "https://ad.doubleclick.net/ddm/clk/513147406;320465829;f?https://www.hoka.com/en/gb/men-road/skyflow/197634467559.html?cm_mmc=AWIN-_-104504-_-Deeplink-_-Generic&utm_source=awin&utm_medium=aff&utm_campaign=Lyst+Ltd_104504&sv1=affiliate&sv_campaign_id=104504&awc=17203_1723025508_333a7ad36d79a9a92b42060c67b71596",
127+
"expectURL": "https://ad.doubleclick.net/ddm/clk/513147406;320465829;f?https://www.hoka.com/en/gb/men-road/skyflow/197634467559.html?cm_mmc=AWIN-_-104504-_-Deeplink-_-Generic&sv1=affiliate&sv_campaign_id=104504&awc=17203_1723025508_333a7ad36d79a9a92b42060c67b71596",
128+
"exceptPlatforms": []
129+
},
124130
{
125131
"name": "Ensure parameters aren't treated as a regex if they have special characters",
126132
"testURL": "https://example.com/test.html?badx=123",

0 commit comments

Comments
 (0)