Skip to content

Commit e510f2c

Browse files
committed
Fix: Add Unit tests and implement selective blocking during importing for outdated webviews
1 parent b4f53ea commit e510f2c

4 files changed

Lines changed: 31 additions & 3 deletions

File tree

AnkiDroid/src/main/java/com/ichi2/anki/pages/AnkiPackageImporterFragment.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ class AnkiPackageImporterFragment : PageFragment() {
3232
"import-anki-package$filePath"
3333
}
3434

35+
override fun requiresModernWebView() = true
36+
3537
override fun onCreateWebViewClient(savedInstanceState: Bundle?): PageWebViewClient {
3638
// the back callback is only enabled when import is running and showing progress
3739
val backCallback =

AnkiDroid/src/main/java/com/ichi2/anki/pages/CsvImporter.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ class CsvImporter : PageFragment() {
3737
"import-csv$filePath"
3838
}
3939

40+
override fun requiresModernWebView() = true
41+
4042
override fun onCreateWebViewClient(savedInstanceState: Bundle?): PageWebViewClient {
4143
// the back callback is only enabled when import is running and showing progress
4244
val backCallback =

AnkiDroid/src/main/java/com/ichi2/anki/pages/PageFragment.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@ abstract class PageFragment(
6666

6767
protected open fun onWebViewCreated() { }
6868

69+
protected open fun requiresModernWebView(): Boolean = false
70+
6971
/**
7072
* When the webview calls `BridgeCommand("foo")`, the PageFragment execute `bridgeCommands["foo"]`.
7173
* By default, only bridge command is allowed, subclasses must redefine it if they expect bridge commands.
@@ -75,6 +77,7 @@ abstract class PageFragment(
7577
/**
7678
* Ensures that [pageWebViewClient] can receive `bridgeCommand` requests and execute the command from [bridgeCommands].
7779
*/
80+
7881
private fun setupBridgeCommand(pageWebViewClient: PageWebViewClient) {
7982
if (bridgeCommands.isEmpty()) {
8083
return
@@ -103,8 +106,8 @@ abstract class PageFragment(
103106
savedInstanceState: Bundle?,
104107
) {
105108
val ankiActivity = requireActivity() as AnkiActivity
106-
if (checkWebviewVersion(ankiActivity)) {
107-
Timber.w("Aborting PageFragement load: WebView is outdated")
109+
if (requiresModernWebView() && checkWebviewVersion(ankiActivity)) {
110+
Timber.w("${this::class.simpleName} requires modern WebView (Chrome 90+), aborting load")
108111
ankiActivity.onBackPressedDispatcher.onBackPressed()
109112
return
110113
}
@@ -114,7 +117,6 @@ abstract class PageFragment(
114117
view.findViewById<MaterialToolbar>(R.id.toolbar)?.setNavigationOnClickListener {
115118
requireActivity().onBackPressedDispatcher.onBackPressed()
116119
}
117-
118120
setupWebView(savedInstanceState)
119121
}
120122

AnkiDroid/src/test/java/com/ichi2/utils/WebViewUtilsTest.kt

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,5 +55,27 @@ class WebViewUtilsTest {
5555
),
5656
equalTo(null),
5757
)
58+
assertThat(
59+
"Should catch old engine (78) in Huawei package even with valid versionCode",
60+
checkWebViewVersionComponents(
61+
"com.huawei.webview",
62+
"12.1.2.322",
63+
450000000L,
64+
"Mozilla/5.0 (Linux; Android 10; CDY-AN90 Build/HUAWEICDY-AN90; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/78.0.3904.108 Mobile Safari/537.36",
65+
),
66+
equalTo(78),
67+
)
68+
// Link: https://www.apkmirror.com/apk/huawei/huawei-webview-2/huawei-webview-15-0-4-326-release/
69+
// verified version code is 2113L for 15.0.4.326 by analyzing the manifest
70+
assertThat(
71+
"Huawei v15 with code 21311 should be allowed if UA indicates modern engine (114)",
72+
checkWebViewVersionComponents(
73+
"com.huawei.webview",
74+
"15.0.4.326",
75+
21311L,
76+
"Mozilla/5.0 (Linux; Android 12; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/114.0.5735.196 Mobile Safari/537.36",
77+
),
78+
equalTo(null),
79+
)
5880
}
5981
}

0 commit comments

Comments
 (0)