From 0e39af4a0b036c3d153838b1d54198831e510669 Mon Sep 17 00:00:00 2001 From: David Allison <62114487+david-allison@users.noreply.github.com> Date: Tue, 22 Sep 2026 20:32:04 +0100 Subject: [PATCH 1/2] test(reviewer): MathJax asset URLs Forward slashes are used to the tests pass on Windows. Part of 21926 Assisted-by: GPT-6 --- .../java/com/ichi2/anki/ViewerResourceHandler.kt | 12 +++--------- .../com/ichi2/anki/ViewerResourceHandlerTest.kt | 14 ++++++++++++++ 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/ViewerResourceHandler.kt b/AnkiDroid/src/main/java/com/ichi2/anki/ViewerResourceHandler.kt index d26379e76ed7..4a4efabb4e22 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/ViewerResourceHandler.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/ViewerResourceHandler.kt @@ -13,11 +13,9 @@ import timber.log.Timber import java.io.ByteArrayInputStream import java.io.File import java.io.FileInputStream -import java.nio.file.Paths -import kotlin.io.path.pathString private const val RANGE_HEADER = "Range" -private const val MATHJAX_PATH_PREFIX = "/_anki/js/vendor/mathjax" +private const val MATHJAX_PATH_PREFIX = "/_anki/js/vendor/mathjax/" class ViewerResourceHandler( context: Context, @@ -38,12 +36,8 @@ class ViewerResourceHandler( try { if (path.startsWith(MATHJAX_PATH_PREFIX)) { - val mathjaxAssetPath = - Paths - .get( - "backend/js/vendor/mathjax", - path.removePrefix(MATHJAX_PATH_PREFIX), - ).pathString + // Asset names use forward slashes, including when tests run on Windows. + val mathjaxAssetPath = "backend/js/vendor/mathjax/${path.removePrefix(MATHJAX_PATH_PREFIX)}" val inputStream = assetManager.open(mathjaxAssetPath) return WebResourceResponse(guessMimeType(path), null, inputStream) } diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/ViewerResourceHandlerTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/ViewerResourceHandlerTest.kt index 39be328952fe..830be945966f 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/ViewerResourceHandlerTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/ViewerResourceHandlerTest.kt @@ -38,6 +38,20 @@ class ViewerResourceHandlerTest : RobolectricTest() { assertNull(response, "a request escaping the media directory must not be served") } + @Test + fun `MathJax implementation is available at the backend URL`() { + val response = ViewerResourceHandler(targetContext).shouldInterceptRequest(request("/_anki/js/vendor/mathjax/tex-chtml-full.js")) + + val expected = readAssetText("backend/js/vendor/mathjax/tex-chtml-full.js") + assertEquals(expected, assertNotNull(response).data.bufferedReader().use { it.readText() }) + } + + private fun readAssetText(path: String): String = + targetContext.assets + .open(path) + .bufferedReader() + .use { it.readText() } + private fun request(path: String): WebResourceRequest = mock { on { url } doReturn "http://127.0.0.1$path".toUri() From e1bcca50f87023a8fd3c374b339dbbb9bb1bb5f4 Mon Sep 17 00:00:00 2001 From: David Allison <62114487+david-allison@users.noreply.github.com> Date: Tue, 22 Sep 2026 20:32:04 +0100 Subject: [PATCH 2/2] fix(reviewer): handle Anki 26.09 '/_anki/js/mathjax.js' Anki 26.09 requests this file, previously: * Vendored MathJax (/_anki/js/vendor/mathjax) was handled * mathjax.js sat outside this directory Part of 21926 Assisted-by: GPT-6 --- .../src/main/java/com/ichi2/anki/ViewerResourceHandler.kt | 3 +++ .../test/java/com/ichi2/anki/ViewerResourceHandlerTest.kt | 8 ++++++++ 2 files changed, 11 insertions(+) diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/ViewerResourceHandler.kt b/AnkiDroid/src/main/java/com/ichi2/anki/ViewerResourceHandler.kt index 4a4efabb4e22..6fccdad86ecd 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/ViewerResourceHandler.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/ViewerResourceHandler.kt @@ -35,6 +35,9 @@ class ViewerResourceHandler( } try { + if (path == "/_anki/js/mathjax.js") { + return WebResourceResponse(guessMimeType(path), null, assetManager.open("backend/js/mathjax.js")) + } if (path.startsWith(MATHJAX_PATH_PREFIX)) { // Asset names use forward slashes, including when tests run on Windows. val mathjaxAssetPath = "backend/js/vendor/mathjax/${path.removePrefix(MATHJAX_PATH_PREFIX)}" diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/ViewerResourceHandlerTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/ViewerResourceHandlerTest.kt index 830be945966f..2f1d8a232b65 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/ViewerResourceHandlerTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/ViewerResourceHandlerTest.kt @@ -38,6 +38,14 @@ class ViewerResourceHandlerTest : RobolectricTest() { assertNull(response, "a request escaping the media directory must not be served") } + @Test + fun `MathJax configuration is available at the backend URL`() { + val response = ViewerResourceHandler(targetContext).shouldInterceptRequest(request("/_anki/js/mathjax.js")) + + val expected = readAssetText("backend/js/mathjax.js") + assertEquals(expected, assertNotNull(response).data.bufferedReader().use { it.readText() }) + } + @Test fun `MathJax implementation is available at the backend URL`() { val response = ViewerResourceHandler(targetContext).shouldInterceptRequest(request("/_anki/js/vendor/mathjax/tex-chtml-full.js"))