@@ -181,6 +181,8 @@ import com.duckduckgo.app.browser.webshare.WebShareChooser
181181import com.duckduckgo.app.browser.webshare.WebViewCompatWebShareChooser
182182import com.duckduckgo.app.browser.webview.WebContentDebugging
183183import com.duckduckgo.app.browser.webview.WebViewBlobDownloadFeature
184+ import com.duckduckgo.app.browser.webview.WebViewCompatFeature
185+ import com.duckduckgo.app.browser.webview.WebViewCompatFeatureSettings
184186import com.duckduckgo.app.browser.webview.safewebview.SafeWebViewFeature
185187import com.duckduckgo.app.cta.ui.BrokenSitePromptDialogCta
186188import com.duckduckgo.app.cta.ui.Cta
@@ -307,6 +309,7 @@ import com.duckduckgo.js.messaging.api.JsCallbackData
307309import com.duckduckgo.js.messaging.api.JsMessageCallback
308310import com.duckduckgo.js.messaging.api.JsMessaging
309311import com.duckduckgo.js.messaging.api.SubscriptionEventData
312+ import com.duckduckgo.js.messaging.api.WebViewCompatMessageCallback
310313import com.duckduckgo.malicioussiteprotection.api.MaliciousSiteProtection.Feed
311314import com.duckduckgo.mobile.android.app.tracking.ui.AppTrackingProtectionScreens.AppTrackerOnboardingActivityWithEmptyParamsParams
312315import com.duckduckgo.navigation.api.GlobalActivityStarter
@@ -342,6 +345,8 @@ import com.google.android.material.bottomsheet.BottomSheetBehavior
342345import com.google.android.material.bottomsheet.BottomSheetDialogFragment
343346import com.google.android.material.snackbar.BaseTransientBottomBar
344347import com.google.android.material.snackbar.Snackbar
348+ import com.squareup.moshi.Moshi
349+ import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
345350import kotlinx.coroutines.CoroutineScope
346351import kotlinx.coroutines.Job
347352import kotlinx.coroutines.SupervisorJob
@@ -598,6 +603,9 @@ class BrowserTabFragment :
598603 @Inject
599604 lateinit var omnibarFeatureRepository: OmnibarFeatureRepository
600605
606+ @Inject
607+ lateinit var webViewCompatFeature: WebViewCompatFeature
608+
601609 /* *
602610 * We use this to monitor whether the user was seeing the in-context Email Protection signup prompt
603611 * This is needed because the activity stack will be cleared if an external link is opened in our browser
@@ -3217,6 +3225,7 @@ class BrowserTabFragment :
32173225 onInContextEmailProtectionSignupPromptShown = { showNativeInContextEmailProtectionSignupPrompt() },
32183226 )
32193227 configureWebViewForBlobDownload(it)
3228+ configureWebViewForWebViewCompatTest(it)
32203229 configureWebViewForAutofill(it)
32213230 printInjector.addJsInterface(it) { viewModel.printFromWebView() }
32223231 autoconsent.addJsInterface(it, autoconsentCallback)
@@ -3339,6 +3348,32 @@ class BrowserTabFragment :
33393348 daxDialogIntroBubble.root.gone()
33403349 }
33413350
3351+ private var proxy: JavaScriptReplyProxy ? = null
3352+
3353+ private val delay = " \$ DELAY$"
3354+ private val postInitialPing = " \$ POST_INITIAL_PING$"
3355+ private val replyToNativeMessages = " \$ REPLY_TO_NATIVE_MESSAGES$"
3356+
3357+ private fun configureWebViewForWebViewCompatTest (webView : DuckDuckGoWebView ) {
3358+ lifecycleScope.launch(dispatchers.main()) {
3359+ val script = withContext(dispatchers.io()) {
3360+ if (! webViewCompatFeature.self().isEnabled()) return @withContext null
3361+
3362+ val moshi = Moshi .Builder ().add(KotlinJsonAdapterFactory ()).build()
3363+ val adapter = moshi.adapter(WebViewCompatFeatureSettings ::class .java)
3364+ val webViewCompatSettings = webViewCompatFeature.self().getSettings()?.let {
3365+ adapter.fromJson(it)
3366+ }
3367+ context?.resources?.openRawResource(R .raw.webviewcompat_test_script)?.bufferedReader().use { it?.readText() }.orEmpty()
3368+ .replace(delay, webViewCompatSettings?.jsInitialPingDelay?.toString() ? : " 0" )
3369+ .replace(postInitialPing, webViewCompatFeature.jsSendsInitialPing().isEnabled().toString())
3370+ .replace(replyToNativeMessages, webViewCompatFeature.jsRepliesToNativeMessages().isEnabled().toString())
3371+ } ? : return @launch
3372+
3373+ webViewCompatWrapper.addDocumentStartJavaScript(webView, script, setOf (" *" ))
3374+ }
3375+ }
3376+
33423377 @SuppressLint(" AddDocumentStartJavaScriptUsage" )
33433378 private fun configureWebViewForBlobDownload (webView : DuckDuckGoWebView ) {
33443379 lifecycleScope.launch(dispatchers.main()) {
0 commit comments