Skip to content

Commit 09d88a4

Browse files
authored
report WebView support for MULTI_PROFILE and DELETE_BROWSING_DATA features (#7061)
Task/Issue URL: https://app.asana.com/1/137249556945/project/72649045549333/task/1211819474504985?focus=true ### Description Adds a daily pixel that report WebView support for `MULTI_PROFILE` and `DELETE_BROWSING_DATA` features. ### Steps to test this PR - [ ] Set your logcat to filter for: `message:webview_capabilities` - [ ] Launch the app. - [ ] Verify that `webview_capabilities` pixel is not sent. - [ ] Go to developer settings and enable `reportWebViewCapabilities`. - [ ] Force close and restart the app. - [ ] Verify that `webview_capabilities` pixel is sent with params: `version={your webview version}, multi_profile={true/false}, delete_browsing_data={true/false}, petal=true` - [ ] Background and reopen the app. - [ ] Verify that `webview_capabilities` pixel is ignored.
1 parent 52448d0 commit 09d88a4

File tree

2 files changed

+61
-2
lines changed

2 files changed

+61
-2
lines changed

app/src/main/java/com/duckduckgo/app/browser/RealWebViewCapabilityChecker.kt

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,30 +16,64 @@
1616

1717
package com.duckduckgo.app.browser
1818

19+
import androidx.lifecycle.LifecycleOwner
1920
import androidx.webkit.WebViewFeature
2021
import com.duckduckgo.app.browser.api.WebViewCapabilityChecker
2122
import com.duckduckgo.app.browser.api.WebViewCapabilityChecker.WebViewCapability
2223
import com.duckduckgo.app.browser.api.WebViewCapabilityChecker.WebViewCapability.DocumentStartJavaScript
2324
import com.duckduckgo.app.browser.api.WebViewCapabilityChecker.WebViewCapability.WebMessageListener
25+
import com.duckduckgo.app.di.AppCoroutineScope
26+
import com.duckduckgo.app.lifecycle.MainProcessLifecycleObserver
27+
import com.duckduckgo.app.pixels.remoteconfig.AndroidBrowserConfigFeature
28+
import com.duckduckgo.app.statistics.pixels.Pixel
2429
import com.duckduckgo.browser.api.WebViewVersionProvider
2530
import com.duckduckgo.common.utils.DispatcherProvider
2631
import com.duckduckgo.common.utils.extensions.compareSemanticVersion
32+
import com.duckduckgo.common.utils.plugins.pixel.PixelParamRemovalPlugin
33+
import com.duckduckgo.common.utils.plugins.pixel.PixelParamRemovalPlugin.PixelParameter
2734
import com.duckduckgo.di.scopes.AppScope
2835
import com.squareup.anvil.annotations.ContributesBinding
36+
import com.squareup.anvil.annotations.ContributesMultibinding
37+
import dagger.SingleInstanceIn
38+
import kotlinx.coroutines.CoroutineScope
39+
import kotlinx.coroutines.launch
2940
import kotlinx.coroutines.withContext
3041
import javax.inject.Inject
3142

32-
@ContributesBinding(AppScope::class)
43+
@ContributesMultibinding(AppScope::class, MainProcessLifecycleObserver::class)
44+
@ContributesBinding(AppScope::class, WebViewCapabilityChecker::class)
45+
@SingleInstanceIn(AppScope::class)
3346
class RealWebViewCapabilityChecker @Inject constructor(
47+
@AppCoroutineScope private val coroutineScope: CoroutineScope,
3448
private val dispatchers: DispatcherProvider,
3549
private val webViewVersionProvider: WebViewVersionProvider,
36-
) : WebViewCapabilityChecker {
50+
private val pixel: Pixel,
51+
private val androidBrowserConfigFeature: AndroidBrowserConfigFeature,
52+
) : WebViewCapabilityChecker, MainProcessLifecycleObserver {
3753
override suspend fun isSupported(capability: WebViewCapability): Boolean =
3854
when (capability) {
3955
DocumentStartJavaScript -> isDocumentStartJavaScriptSupported()
4056
WebMessageListener -> isWebMessageListenerSupported()
4157
}
4258

59+
override fun onStart(owner: LifecycleOwner) {
60+
reportWebViewCapabilities()
61+
}
62+
63+
private fun reportWebViewCapabilities() {
64+
coroutineScope.launch(dispatchers.io()) {
65+
if (androidBrowserConfigFeature.reportWebViewCapabilities().isEnabled()) {
66+
val params = mapOf(
67+
"version" to webViewVersionProvider.getFullVersion(),
68+
"multi_profile" to isMultiProfileSupported().toString(),
69+
"delete_browsing_data" to isDeleteBrowsingDataSupported().toString(),
70+
"petal" to "true",
71+
)
72+
pixel.fire(pixel = WebViewCapabilityPixelName.WEBVIEW_CAPABILITIES, parameters = params, type = Pixel.PixelType.Daily())
73+
}
74+
}
75+
}
76+
4377
private suspend fun isWebMessageListenerSupported(): Boolean =
4478
withContext(dispatchers.io()) {
4579
webViewVersionProvider
@@ -50,8 +84,25 @@ class RealWebViewCapabilityChecker @Inject constructor(
5084

5185
private fun isDocumentStartJavaScriptSupported(): Boolean = WebViewFeature.isFeatureSupported(WebViewFeature.DOCUMENT_START_SCRIPT)
5286

87+
private fun isMultiProfileSupported(): Boolean = WebViewFeature.isFeatureSupported(WebViewFeature.MULTI_PROFILE)
88+
89+
private fun isDeleteBrowsingDataSupported(): Boolean = WebViewFeature.isFeatureSupported(WebViewFeature.DELETE_BROWSING_DATA)
90+
5391
companion object {
5492
// critical fixes didn't exist until this WebView version. See https://issues.chromium.org/issues/338340758#comment42
5593
private const val WEB_MESSAGE_LISTENER_WEBVIEW_VERSION = "126.0.6478.40"
5694
}
5795
}
96+
97+
enum class WebViewCapabilityPixelName(override val pixelName: String) : Pixel.PixelName {
98+
WEBVIEW_CAPABILITIES("webview_capabilities"),
99+
}
100+
101+
@ContributesMultibinding(AppScope::class)
102+
class WebViewCapabilityPixelParamRemovalPlugin @Inject constructor() : PixelParamRemovalPlugin {
103+
override fun names(): List<Pair<String, Set<PixelParameter>>> {
104+
return listOf(
105+
WebViewCapabilityPixelName.WEBVIEW_CAPABILITIES.pixelName to PixelParameter.removeAll(),
106+
)
107+
}
108+
}

app/src/main/java/com/duckduckgo/app/pixels/remoteconfig/AndroidBrowserConfigFeature.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,4 +194,12 @@ interface AndroidBrowserConfigFeature {
194194
*/
195195
@Toggle.DefaultValue(DefaultFeatureValue.FALSE)
196196
fun splitOmnibar(): Toggle
197+
198+
/**
199+
* @return `true` when the remote config has the global "repotWebViewCapabilities" androidBrowserConfig
200+
* sub-feature flag enabled
201+
* If the remote feature is not present defaults to `false`
202+
*/
203+
@Toggle.DefaultValue(DefaultFeatureValue.FALSE)
204+
fun reportWebViewCapabilities(): Toggle
197205
}

0 commit comments

Comments
 (0)