diff --git a/CHANGELOG.md b/CHANGELOG.md index b9277a4a7..5cd1b8c26 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ The format is a modified version of [Keep a Changelog](https://keepachangelog.co - Fix performance regression introduced in v0.19.4 ([@AntsyLich](https://github.com/AntsyLich)) ([#3082](https://github.com/mihonapp/mihon/pull/3082)) - Fix duplicate key crash in duplicate detection ([@leodyversemilla07](https://github.com/leodyversemilla07)) ([#3040](https://github.com/mihonapp/mihon/pull/3040)) - Fix MangaUpdates HTTP 4XX errors ([@leodyversemilla07](https://github.com/leodyversemilla07)) ([#3021](https://github.com/mihonapp/mihon/pull/3021)) +- Fix WebView JavaScript dialogs popup after screen is closed ([@leodyversemilla07](https://github.com/leodyversemilla07)) ([#3041](https://github.com/mihonapp/mihon/pull/3041)) ## [v0.19.4] - 2026-02-25 ### Added diff --git a/app/src/main/java/eu/kanade/presentation/webview/WebViewScreenContent.kt b/app/src/main/java/eu/kanade/presentation/webview/WebViewScreenContent.kt index 4287e105c..72b8d2fda 100644 --- a/app/src/main/java/eu/kanade/presentation/webview/WebViewScreenContent.kt +++ b/app/src/main/java/eu/kanade/presentation/webview/WebViewScreenContent.kt @@ -3,6 +3,8 @@ package eu.kanade.presentation.webview import android.content.pm.ApplicationInfo import android.graphics.Bitmap import android.os.Message +import android.webkit.JsPromptResult +import android.webkit.JsResult import android.webkit.WebResourceRequest import android.webkit.WebView import androidx.activity.compose.BackHandler @@ -20,6 +22,7 @@ import androidx.compose.material3.LinearProgressIndicator import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.key import androidx.compose.runtime.mutableStateOf @@ -95,6 +98,11 @@ fun WebViewScreenContent( var currentUrl by remember { mutableStateOf(url) } var showCloudflareHelp by remember { mutableStateOf(false) } + var isActive by remember { mutableStateOf(true) } + + DisposableEffect(Unit) { + onDispose { isActive = false } + } val webClient = remember { object : AccompanistWebViewClient() { @@ -163,6 +171,36 @@ fun WebViewScreenContent( } return false } + + override fun onJsAlert(view: WebView, url: String?, message: String?, result: JsResult): Boolean { + if (!isActive) { + result.confirm() + return true + } + return super.onJsAlert(view, url, message, result) + } + + override fun onJsConfirm(view: WebView, url: String?, message: String?, result: JsResult): Boolean { + if (!isActive) { + result.cancel() + return true + } + return super.onJsConfirm(view, url, message, result) + } + + override fun onJsPrompt( + view: WebView, + url: String?, + message: String?, + defaultValue: String?, + result: JsPromptResult, + ): Boolean { + if (!isActive) { + result.cancel() + return true + } + return super.onJsPrompt(view, url, message, defaultValue, result) + } } }