Skip to content

Commit 5523136

Browse files
committed
Simplify APIs
1 parent 9407935 commit 5523136

File tree

12 files changed

+211
-220
lines changed

12 files changed

+211
-220
lines changed

app/src/androidTest/java/com/duckduckgo/app/browser/BrowserWebViewClientTest.kt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ import androidx.core.net.toUri
3939
import androidx.test.annotation.UiThreadTest
4040
import androidx.test.filters.SdkSuppress
4141
import androidx.test.platform.app.InstrumentationRegistry
42-
import androidx.webkit.WebViewCompat.WebMessageListener
4342
import com.duckduckgo.adclick.api.AdClickManager
4443
import com.duckduckgo.anrs.api.CrashLogger
4544
import com.duckduckgo.anrs.api.CrashLogger.Crash
@@ -1339,13 +1338,13 @@ class BrowserWebViewClientTest {
13391338
var registered = false
13401339
private set
13411340

1342-
override suspend fun unregister(unregisterer: suspend (objectName: String) -> Boolean) {
1341+
override fun unregister(webView: WebView) {
13431342
registered = false
13441343
}
13451344

1346-
override suspend fun register(
1345+
override fun register(
13471346
jsMessageCallback: JsMessageCallback?,
1348-
registerer: suspend (objectName: String, allowedOriginRules: Set<String>, webMessageListener: WebMessageListener) -> Boolean,
1347+
webView: WebView,
13491348
) {
13501349
registered = true
13511350
}

app/src/androidTest/java/com/duckduckgo/app/browser/DuckDuckGoWebViewTest.kt

Lines changed: 0 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -19,60 +19,26 @@ package com.duckduckgo.app.browser
1919
import androidx.test.annotation.UiThreadTest
2020
import androidx.test.ext.junit.runners.AndroidJUnit4
2121
import androidx.test.platform.app.InstrumentationRegistry
22-
import com.duckduckgo.app.browser.api.WebViewCapabilityChecker
23-
import com.duckduckgo.app.browser.api.WebViewCapabilityChecker.WebViewCapability.DocumentStartJavaScript
24-
import com.duckduckgo.browser.api.webviewcompat.WebViewCompatWrapper
25-
import com.duckduckgo.common.test.CoroutineTestRule
26-
import kotlinx.coroutines.test.runTest
2722
import org.junit.Assert.assertFalse
2823
import org.junit.Before
29-
import org.junit.Rule
3024
import org.junit.Test
3125
import org.junit.runner.RunWith
32-
import org.mockito.Mockito.mock
33-
import org.mockito.Mockito.verify
34-
import org.mockito.kotlin.never
35-
import org.mockito.kotlin.whenever
3626

3727
@RunWith(AndroidJUnit4::class)
3828
class DuckDuckGoWebViewTest {
3929

40-
@get:Rule
41-
val coroutineRule = CoroutineTestRule()
42-
4330
private lateinit var testee: DuckDuckGoWebView
44-
private val mockWebViewCapabilityChecker: WebViewCapabilityChecker = mock()
45-
private val mockWebViewCompatWrapper: WebViewCompatWrapper = mock()
4631

4732
@Before
4833
@UiThreadTest
4934
fun setUp() {
5035
val context = InstrumentationRegistry.getInstrumentation().targetContext
5136
testee = DuckDuckGoWebView(context)
52-
testee.dispatcherProvider = coroutineRule.testDispatcherProvider
5337
}
5438

5539
@Test
5640
@UiThreadTest
5741
fun whenWebViewInitialisedThenSafeBrowsingDisabled() {
5842
assertFalse(testee.settings.safeBrowsingEnabled)
5943
}
60-
61-
@Test
62-
fun whenSafeAddDocumentStartJavaScriptWithFeatureEnabledThenAddScript() = runTest {
63-
whenever(mockWebViewCapabilityChecker.isSupported(DocumentStartJavaScript)).thenReturn(true)
64-
65-
testee.safeAddDocumentStartJavaScript("script", setOf("*"))
66-
67-
verify(mockWebViewCompatWrapper).addDocumentStartJavaScript(testee, "script", setOf("*"))
68-
}
69-
70-
@Test
71-
fun whenSafeAddDocumentStartJavaScriptWithFeatureDisabledThenDoNotAddScript() = runTest {
72-
whenever(mockWebViewCapabilityChecker.isSupported(DocumentStartJavaScript)).thenReturn(false)
73-
74-
testee.safeAddDocumentStartJavaScript("script", setOf("*"))
75-
76-
verify(mockWebViewCompatWrapper, never()).addDocumentStartJavaScript(testee, "script", setOf("*"))
77-
}
7844
}

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

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,7 @@ import com.duckduckgo.browser.api.brokensite.BrokenSiteData
246246
import com.duckduckgo.browser.api.brokensite.BrokenSiteData.ReportFlow.RELOAD_THREE_TIMES_WITHIN_20_SECONDS
247247
import com.duckduckgo.browser.api.ui.BrowserScreens.PrivateSearchScreenNoParams
248248
import com.duckduckgo.browser.api.ui.BrowserScreens.WebViewActivityWithParams
249+
import com.duckduckgo.browser.api.webviewcompat.WebViewCompatWrapper
249250
import com.duckduckgo.common.ui.DuckDuckGoActivity
250251
import com.duckduckgo.common.ui.DuckDuckGoFragment
251252
import com.duckduckgo.common.ui.store.BrowserAppTheme
@@ -585,6 +586,9 @@ class BrowserTabFragment :
585586
@Inject
586587
lateinit var passkeyInitializer: WebViewPasskeyInitializer
587588

589+
@Inject
590+
lateinit var webViewCompatWrapper: WebViewCompatWrapper
591+
588592
/**
589593
* We use this to monitor whether the user was seeing the in-context Email Protection signup prompt
590594
* This is needed because the activity stack will be cleared if an external link is opened in our browser
@@ -3206,8 +3210,8 @@ class BrowserTabFragment :
32063210
val script = blobDownloadScript()
32073211
WebViewCompat.addDocumentStartJavaScript(webView, script, setOf("*"))
32083212

3209-
webView.safeAddWebMessageListener(
3210-
webViewCapabilityChecker,
3213+
webViewCompatWrapper.addWebMessageListener(
3214+
webView,
32113215
"ddgBlobDownloadObj",
32123216
setOf("*"),
32133217
object : WebViewCompat.WebMessageListener {
@@ -3854,13 +3858,11 @@ class BrowserTabFragment :
38543858

38553859
private fun destroyWebView() {
38563860
if (::webViewContainer.isInitialized) webViewContainer.removeAllViews()
3857-
appCoroutineScope.launch(dispatchers.main()) {
3858-
webView?.let {
3859-
webViewClient.destroy(it)
3860-
it.destroy()
3861-
}
3862-
webView = null
3861+
webView?.let {
3862+
webViewClient.destroy(it)
3863+
it.destroy()
38633864
}
3865+
webView = null
38643866
}
38653867

38663868
private fun convertBlobToDataUri(blob: Command.ConvertBlobToDataUri) {

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

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -476,13 +476,7 @@ class BrowserWebViewClient @Inject constructor(
476476
}
477477

478478
webMessagingPlugins.getPlugins().forEach { plugin ->
479-
plugin.register(callback) { objectName, allowedOriginRules, webMessageListener ->
480-
webView.safeAddWebMessageListener(
481-
objectName,
482-
allowedOriginRules,
483-
webMessageListener,
484-
)
485-
}
479+
plugin.register(callback, webView)
486480
}
487481
}
488482
}
@@ -771,11 +765,9 @@ class BrowserWebViewClient @Inject constructor(
771765
requestInterceptor.addExemptedMaliciousSite(url, feed)
772766
}
773767

774-
suspend fun destroy(webView: DuckDuckGoWebView) {
768+
fun destroy(webView: DuckDuckGoWebView) {
775769
webMessagingPlugins.getPlugins().forEach { plugin ->
776-
plugin.unregister { objectName ->
777-
webView.safeRemoveWebMessageListener(objectName)
778-
}
770+
plugin.unregister(webView)
779771
}
780772
}
781773
}

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,6 @@ import androidx.webkit.ScriptHandler
3737
import androidx.webkit.WebViewCompat
3838
import androidx.webkit.WebViewCompat.WebMessageListener
3939
import com.duckduckgo.anvil.annotations.InjectWith
40-
import com.duckduckgo.app.browser.api.WebViewCapabilityChecker
41-
import com.duckduckgo.app.browser.api.WebViewCapabilityChecker.WebViewCapability
4240
import com.duckduckgo.app.browser.navigation.safeCopyBackForwardList
4341
import com.duckduckgo.common.utils.DispatcherProvider
4442
import com.duckduckgo.di.scopes.ViewScope

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

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -66,11 +66,16 @@ class RealWebViewCompatWrapper @Inject constructor(
6666
}
6767

6868
override suspend fun removeWebMessageListener(webView: WebView, jsObjectName: String) {
69-
withContext(dispatcherProvider.main()) {
70-
WebViewCompat.removeWebMessageListener(
71-
webView,
72-
jsObjectName,
73-
)
69+
if (!webViewCapabilityChecker.isSupported(WebViewCapability.WebMessageListener)) {
70+
return
71+
}
72+
73+
if (webView is DuckDuckGoWebView) {
74+
webView.safeRemoveWebMessageListener(jsObjectName)
75+
return
76+
}
77+
return withContext(dispatcherProvider.main()) {
78+
WebViewCompat.removeWebMessageListener(webView, jsObjectName)
7479
}
7580
}
7681

@@ -80,6 +85,14 @@ class RealWebViewCompatWrapper @Inject constructor(
8085
allowedOriginRules: Set<String>,
8186
listener: WebViewCompat.WebMessageListener,
8287
) {
88+
if (!webViewCapabilityChecker.isSupported(WebViewCapability.WebMessageListener)) {
89+
return
90+
}
91+
92+
if (webView is DuckDuckGoWebView) {
93+
webView.safeAddWebMessageListener(jsObjectName, allowedOriginRules, listener)
94+
return
95+
}
8396
return withContext(dispatcherProvider.main()) {
8497
WebViewCompat.addWebMessageListener(webView, jsObjectName, allowedOriginRules, listener)
8598
}

app/src/test/java/com/duckduckgo/app/browser/DuckDuckGoWebViewTest.kt

Lines changed: 0 additions & 86 deletions
This file was deleted.
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package com.duckduckgo.app.browser
2+
3+
import com.duckduckgo.app.browser.api.WebViewCapabilityChecker
4+
import com.duckduckgo.app.browser.api.WebViewCapabilityChecker.WebViewCapability.DocumentStartJavaScript
5+
import com.duckduckgo.app.browser.api.WebViewCapabilityChecker.WebViewCapability.WebMessageListener
6+
import com.duckduckgo.common.test.CoroutineTestRule
7+
import kotlinx.coroutines.test.runTest
8+
import org.junit.Before
9+
import org.junit.Rule
10+
import org.junit.Test
11+
import org.mockito.Mockito.mock
12+
import org.mockito.Mockito.verify
13+
import org.mockito.kotlin.any
14+
import org.mockito.kotlin.eq
15+
import org.mockito.kotlin.never
16+
import org.mockito.kotlin.whenever
17+
18+
class RealWebViewCompatWrapperTest {
19+
20+
@get:Rule
21+
val coroutineRule = CoroutineTestRule()
22+
23+
private val mockWebViewCapabilityChecker: WebViewCapabilityChecker = mock()
24+
private val mockDuckDuckGoWebView: DuckDuckGoWebView = mock()
25+
26+
private lateinit var testee: RealWebViewCompatWrapper
27+
28+
@Before
29+
fun setUp() {
30+
testee = RealWebViewCompatWrapper(
31+
dispatcherProvider = coroutineRule.testDispatcherProvider,
32+
webViewCapabilityChecker = mockWebViewCapabilityChecker,
33+
)
34+
}
35+
36+
@Test
37+
fun whenAddDocumentStartJavaScriptWithFeatureEnabledThenAddScript() = runTest {
38+
whenever(mockWebViewCapabilityChecker.isSupported(DocumentStartJavaScript)).thenReturn(true)
39+
40+
testee.addDocumentStartJavaScript(mockDuckDuckGoWebView, "script", setOf("*"))
41+
42+
verify(mockDuckDuckGoWebView).safeAddDocumentStartJavaScript("script", setOf("*"))
43+
}
44+
45+
@Test
46+
fun whenAddDocumentStartJavaScriptWithFeatureDisabledThenDoNotAddScript() = runTest {
47+
whenever(mockWebViewCapabilityChecker.isSupported(DocumentStartJavaScript)).thenReturn(false)
48+
49+
testee.addDocumentStartJavaScript(mockDuckDuckGoWebView, "script", setOf("*"))
50+
51+
verify(mockDuckDuckGoWebView, never()).safeAddDocumentStartJavaScript("script", setOf("*"))
52+
}
53+
54+
@Test
55+
fun whenAddMessageListenerWithFeatureEnabledThenAddListener() = runTest {
56+
whenever(mockWebViewCapabilityChecker.isSupported(WebMessageListener)).thenReturn(true)
57+
58+
testee.addWebMessageListener(mockDuckDuckGoWebView, "script", setOf("*")) { _, _, _, _, _ -> }
59+
60+
verify(mockDuckDuckGoWebView).safeAddWebMessageListener(eq("script"), eq(setOf("*")), any())
61+
}
62+
63+
@Test
64+
fun whenAddMessageListenerWithFeatureDisabledThenDoNotAddListener() = runTest {
65+
whenever(mockWebViewCapabilityChecker.isSupported(WebMessageListener)).thenReturn(false)
66+
67+
testee.addWebMessageListener(mockDuckDuckGoWebView, "script", setOf("*")) { _, _, _, _, _ -> }
68+
69+
verify(mockDuckDuckGoWebView, never()).safeAddWebMessageListener(eq("script"), eq(setOf("*")), any())
70+
}
71+
72+
@Test
73+
fun whenRemoveMessageListenerWithFeatureEnabledThenRemoveListener() = runTest {
74+
whenever(mockWebViewCapabilityChecker.isSupported(WebMessageListener)).thenReturn(true)
75+
76+
testee.removeWebMessageListener(mockDuckDuckGoWebView, "script")
77+
78+
verify(mockDuckDuckGoWebView).safeRemoveWebMessageListener(eq("script"))
79+
}
80+
81+
@Test
82+
fun whenRemoveMessageListenerWithFeatureDisabledThenDoNotRemoveListener() = runTest {
83+
whenever(mockWebViewCapabilityChecker.isSupported(WebMessageListener)).thenReturn(false)
84+
85+
testee.removeWebMessageListener(mockDuckDuckGoWebView, "script")
86+
87+
verify(mockDuckDuckGoWebView, never()).safeRemoveWebMessageListener(eq("script"))
88+
}
89+
}

0 commit comments

Comments
 (0)