From b5f7153e7118a5452e099f2d303c332ff149488d Mon Sep 17 00:00:00 2001 From: dimitris Date: Wed, 20 May 2026 14:39:22 +0200 Subject: [PATCH] WebViews: clear loading indicator on main-frame load errors DocumentationWebView, ResponseBrowser and SinglePageBrowser all show a loading spinner that is hidden from inside onPageFinished (directly or via the onLoaded callback). None of them override onReceivedError, so a main-frame load failure leaves the spinner spinning forever: showLoading()/isLoading=true -> network/cache error -> onPageFinished never fires -> hideLoading()/onLoaded() never runs. This is reachable in practice for the documentation view, which is configured with blockNetworkLoads=true + cacheMode=LOAD_CACHE_ELSE_NETWORK and so requires the bundled cache to be present; a cache-miss on a fresh install means the user is stuck on the spinner. Add onReceivedError on each WebViewClient and call hideLoading() / onLoaded() for main-frame errors only. Sub-resource errors are still ignored so we do not race the spinner off on transient asset failures. No new permission, no behaviour change for successful loads. --- .../activities/documentation/DocumentationWebView.kt | 8 ++++++++ .../http_shortcuts/activities/response/ResponseWebView.kt | 8 ++++++++ .../http_shortcuts/components/SinglePageBrowser.kt | 8 ++++++++ 3 files changed, 24 insertions(+) diff --git a/HTTPShortcuts/app/src/main/kotlin/ch/rmy/android/http_shortcuts/activities/documentation/DocumentationWebView.kt b/HTTPShortcuts/app/src/main/kotlin/ch/rmy/android/http_shortcuts/activities/documentation/DocumentationWebView.kt index 344b3d700..0c5c63903 100644 --- a/HTTPShortcuts/app/src/main/kotlin/ch/rmy/android/http_shortcuts/activities/documentation/DocumentationWebView.kt +++ b/HTTPShortcuts/app/src/main/kotlin/ch/rmy/android/http_shortcuts/activities/documentation/DocumentationWebView.kt @@ -6,6 +6,7 @@ import android.graphics.Bitmap import android.graphics.Color import android.net.Uri import android.view.ViewGroup.LayoutParams.MATCH_PARENT +import android.webkit.WebResourceError import android.webkit.WebResourceRequest import android.webkit.WebResourceResponse import android.webkit.WebSettings @@ -82,6 +83,13 @@ class DocumentationWebView(context: Context) : WebView(context) { onPageTitle(pageTitle.trim('"').takeUnless { it.isEmpty() || it == "null" || it == "Documentation" }) } } + + override fun onReceivedError(view: WebView, request: WebResourceRequest, error: WebResourceError) { + super.onReceivedError(view, request, error) + if (request.isForMainFrame) { + hideLoading() + } + } } with(settings) { diff --git a/HTTPShortcuts/app/src/main/kotlin/ch/rmy/android/http_shortcuts/activities/response/ResponseWebView.kt b/HTTPShortcuts/app/src/main/kotlin/ch/rmy/android/http_shortcuts/activities/response/ResponseWebView.kt index e77621efa..b4f6e5f3f 100644 --- a/HTTPShortcuts/app/src/main/kotlin/ch/rmy/android/http_shortcuts/activities/response/ResponseWebView.kt +++ b/HTTPShortcuts/app/src/main/kotlin/ch/rmy/android/http_shortcuts/activities/response/ResponseWebView.kt @@ -3,6 +3,7 @@ package ch.rmy.android.http_shortcuts.activities.response import android.content.Context import android.net.Uri import android.util.AttributeSet +import android.webkit.WebResourceError import android.webkit.WebResourceRequest import android.webkit.WebResourceResponse import android.webkit.WebSettings @@ -125,6 +126,13 @@ class ResponseWebView @JvmOverloads constructor( override fun onPageFinished(view: WebView?, url: String?) { onLoaded() } + + override fun onReceivedError(view: WebView, request: WebResourceRequest, error: WebResourceError) { + super.onReceivedError(view, request, error) + if (request.isForMainFrame) { + onLoaded() + } + } } with(settings) { diff --git a/HTTPShortcuts/app/src/main/kotlin/ch/rmy/android/http_shortcuts/components/SinglePageBrowser.kt b/HTTPShortcuts/app/src/main/kotlin/ch/rmy/android/http_shortcuts/components/SinglePageBrowser.kt index 974b49b1c..3f9890db5 100644 --- a/HTTPShortcuts/app/src/main/kotlin/ch/rmy/android/http_shortcuts/components/SinglePageBrowser.kt +++ b/HTTPShortcuts/app/src/main/kotlin/ch/rmy/android/http_shortcuts/components/SinglePageBrowser.kt @@ -5,6 +5,7 @@ import android.content.Context import android.graphics.Bitmap import android.graphics.Color import android.view.ViewGroup.LayoutParams.MATCH_PARENT +import android.webkit.WebResourceError import android.webkit.WebResourceRequest import android.webkit.WebView import android.webkit.WebViewClient @@ -125,6 +126,13 @@ private class SinglePageWebView( context.openURL(request.url) } } + + override fun onReceivedError(view: WebView, request: WebResourceRequest, error: WebResourceError) { + super.onReceivedError(view, request, error) + if (request.isForMainFrame) { + onLoaded() + } + } } with(settings) {