Skip to content

Commit bb6eb67

Browse files
authored
fix(browser): hide spinner on main-frame load errors in BrowserClient (#68)
BrowserClient flips BrowserCallback.onLoadingStateChanged on onPageStarted (true) and onPageFinished (false), but does not override onReceivedError. On many failure modes (DNS, certificate, offline, 4xx/5xx) onPageFinished does not always fire after the error, so the toolbar / progress UI stays stuck on isLoading = true even though the page never loaded. Add a main-frame-only onReceivedError override that flips isLoading = false too. isForMainFrame keeps a single blocked sub-resource from flipping the spinner off while the main load is still running.
1 parent 7f2c2d4 commit bb6eb67

1 file changed

Lines changed: 16 additions & 0 deletions

File tree

app/src/main/kotlin/io/github/landwarderer/futon/browser/BrowserClient.kt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package io.github.landwarderer.futon.browser
33
import android.annotation.SuppressLint
44
import android.graphics.Bitmap
55
import android.os.Looper
6+
import android.webkit.WebResourceError
67
import android.webkit.WebResourceRequest
78
import android.webkit.WebResourceResponse
89
import android.webkit.WebView
@@ -33,6 +34,21 @@ open class BrowserClient(
3334
callback.onLoadingStateChanged(isLoading = true)
3435
}
3536

37+
override fun onReceivedError(
38+
view: WebView?,
39+
request: WebResourceRequest?,
40+
error: WebResourceError?,
41+
) {
42+
super.onReceivedError(view, request, error)
43+
// Drop the spinner on main-frame failures (DNS, certificate, offline,
44+
// 4xx/5xx) too, since onPageFinished does not always fire after an
45+
// error and the BrowserCallback would otherwise stay stuck on
46+
// isLoading = true.
47+
if (request?.isForMainFrame == true) {
48+
callback.onLoadingStateChanged(isLoading = false)
49+
}
50+
}
51+
3652
override fun onPageCommitVisible(view: WebView, url: String) {
3753
super.onPageCommitVisible(view, url)
3854
callback.onTitleChanged(view.title.orEmpty(), url)

0 commit comments

Comments
 (0)