@@ -24,8 +24,10 @@ import com.duckduckgo.app.browser.webview.ExemptedUrlsHolder.ExemptedUrl
24
24
import com.duckduckgo.app.browser.webview.RealMaliciousSiteBlockerWebViewIntegration.IsMaliciousViewData
25
25
import com.duckduckgo.app.di.AppCoroutineScope
26
26
import com.duckduckgo.app.di.IsMainProcess
27
+ import com.duckduckgo.app.pixels.AppPixelName
27
28
import com.duckduckgo.app.pixels.remoteconfig.AndroidBrowserConfigFeature
28
29
import com.duckduckgo.app.settings.db.SettingsDataStore
30
+ import com.duckduckgo.app.statistics.pixels.Pixel
29
31
import com.duckduckgo.common.utils.DispatcherProvider
30
32
import com.duckduckgo.di.scopes.AppScope
31
33
import com.duckduckgo.malicioussiteprotection.api.MaliciousSiteProtection
@@ -97,6 +99,7 @@ class RealMaliciousSiteBlockerWebViewIntegration @Inject constructor(
97
99
@AppCoroutineScope private val appCoroutineScope : CoroutineScope ,
98
100
private val exemptedUrlsHolder : ExemptedUrlsHolder ,
99
101
@IsMainProcess private val isMainProcess : Boolean ,
102
+ private val pixel : Pixel ,
100
103
) : MaliciousSiteBlockerWebViewIntegration, PrivacyConfigCallbackPlugin {
101
104
102
105
@VisibleForTesting(otherwise = VisibleForTesting .PRIVATE )
@@ -161,19 +164,31 @@ class RealMaliciousSiteBlockerWebViewIntegration @Inject constructor(
161
164
}
162
165
163
166
val belongsToCurrentPage = documentUri?.host == request.requestHeaders[" Referer" ]?.toUri()?.host
164
- if (request.isForMainFrame || (isForIframe(request) && belongsToCurrentPage)) {
165
- when (val result = checkMaliciousUrl(decodedUrl, confirmationCallback)) {
167
+ val isForIframe = isForIframe(request) && belongsToCurrentPage
168
+ if (request.isForMainFrame || isForIframe) {
169
+ val result = checkMaliciousUrl(decodedUrl) {
170
+ if (isForIframe && it is Malicious ) {
171
+ firePixelForMaliciousIframe(it.feed)
172
+ }
173
+ confirmationCallback(it)
174
+ }
175
+ when (result) {
166
176
is ConfirmedResult -> {
167
177
when (val status = result.status) {
168
178
is Malicious -> {
179
+ if (isForIframe) {
180
+ firePixelForMaliciousIframe(status.feed)
181
+ }
169
182
return IsMaliciousViewData .MaliciousSite (url, status.feed, false )
170
183
}
184
+
171
185
is Safe -> {
172
186
processedUrls.add(decodedUrl)
173
187
return IsMaliciousViewData .Safe
174
188
}
175
189
}
176
190
}
191
+
177
192
is WaitForConfirmation -> {
178
193
processedUrls.add(decodedUrl)
179
194
return IsMaliciousViewData .WaitForConfirmation
@@ -231,6 +246,10 @@ class RealMaliciousSiteBlockerWebViewIntegration @Inject constructor(
231
246
}
232
247
}
233
248
249
+ private fun firePixelForMaliciousIframe (feed : Feed ) {
250
+ pixel.fire(AppPixelName .MALICIOUS_SITE_DETECTED_IN_IFRAME , mapOf (" category" to feed.name.lowercase()))
251
+ }
252
+
234
253
private suspend fun checkMaliciousUrl (
235
254
url : String ,
236
255
confirmationCallback : (maliciousStatus: MaliciousStatus ) -> Unit ,
0 commit comments