Skip to content

Add guard against null WebView handler#190

Merged
mbarta merged 1 commit into
mainfrom
mb/fix_npe
Feb 23, 2026
Merged

Add guard against null WebView handler#190
mbarta merged 1 commit into
mainfrom
mb/fix_npe

Conversation

@mbarta

@mbarta mbarta commented Feb 23, 2026

Copy link
Copy Markdown
Collaborator

Use a safe-call when obtaining a Message from webView.handler and return false if the handler is null. This prevents a potential NPE by aborting the focus href request when the WebView has no handler available.

webView.handler returns null when the WebView has been detached from its window (no longer has a Looper/Handler).

Reported in Sentry with this stacktrace:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.os.Message android.os.Handler.obtainMessage()' on a null object reference
    at dev.hotwire.core.turbo.webview.HotwireWebChromeClient.onCreateWindow(SourceFile:1)
    at WV.wm.addNewContents(chromium-SystemWebViewGoogle6432.aab-stable-755913303:39)
    at android.os.MessageQueue.nativePollOnce(MessageQueue.java)
    at android.os.MessageQueue.nextLegacy(MessageQueue.java:950)
    at android.os.MessageQueue.next(MessageQueue.java:1062)
    at android.os.Looper.loopOnce(Looper.java:221)
    at android.os.Looper.loop(Looper.java:363)
    at android.app.ActivityThread.main(ActivityThread.java:10060)
    at java.lang.reflect.Method.invoke(Method.java)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:632)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:975)

org.chromium.base.JniAndroid$UncaughtExceptionException: Native stack trace:
#00 pc 0x00000000066fb53f /data/app/~~4SXFAPhQp5mwiotQKtLUFA==/com.google.android.webview-g0taa4kn34kCmZsBCz3uIA==/base.apk (offset 0xdb8000)
#01 pc 0x0000000001a62163 /data/app/~~4SXFAPhQp5mwiotQKtLUFA==/com.google.android.webview-g0taa4kn34kCmZsBCz3uIA==/base.apk (offset 0xdb8000)
#02 pc 0x0000000004b6b033 /data/app/~~4SXFAPhQp5mwiotQKtLUFA==/com.google.android.webview-g0taa4kn34kCmZsBCz3uIA==/base.apk (offset 0xdb8000)
#03 pc 0x0000000005be0ff7 /data/app/~~4SXFAPhQp5mwiotQKtLUFA==/com.google.android.webview-g0taa4kn34kCmZsBCz3uIA==/base.apk (offset 0xdb8000)
#04 pc 0x0000000005ad2a97 /data/app/~~4SXFAPhQp5mwiotQKtLUFA==/com.google.android.webview-g0taa4kn34kCmZsBCz3uIA==/base.apk (offset 0xdb8000)
#05 pc 0x00000000055cd99f /data/app/~~4SXFAPhQp5mwiotQKtLUFA==/com.google.android.webview-g0taa4kn34kCmZsBCz3uIA==/base.apk (offset 0xdb8000)
#06 pc 0x0000000001b65ffb /data/app/~~4SXFAPhQp5mwiotQKtLUFA==/com.google.android.webview-g0taa4kn34kCmZsBCz3uIA==/base.apk (offset 0xdb8000)
#07 pc 0x0000000001b643bf /data/app/~~4SXFAPhQp5mwiotQKtLUFA==/com.google.android.webview-g0taa4kn34kCmZsBCz3uIA==/base.apk (offset 0xdb8000)
#08 pc 0x0000000001b658df /data/app/~~4SXFAPhQp5mwiotQKtLUFA==/com.google.android.webview-g0taa4kn34kCmZsBCz3uIA==/base.apk (offset 0xdb8000)
#09 pc 0x00000000043cc32b /data/app/~~4SXFAPhQp5mwiotQKtLUFA==/com.google.android.webview-g0taa4kn34kCmZsBCz3uIA==/base.apk (offset 0xdb8000)
#10 pc 0x00000000043cc0a7 /data/app/~~4SXFAPhQp5mwiotQKtLUFA==/com.google.android.webview-g0taa4kn34kCmZsBCz3uIA==/base.apk (offset 0xdb8000)
#11 pc 0x0000000003753e73 /data/app/~~4SXFAPhQp5mwiotQKtLUFA==/com.google.android.webview-g0taa4kn34kCmZsBCz3uIA==/base.apk (offset 0xdb8000)
#12 pc 0x00000000034d7583 /data/app/~~4SXFAPhQp5mwiotQKtLUFA==/com.google.android.webview-g0taa4kn34kCmZsBCz3uIA==/base.apk (offset 0xdb8000)
#13 pc 0x00000000034d74fb /data/app/~~4SXFAPhQp5mwiotQKtLUFA==/com.google.android.webview-g0taa4kn34kCmZsBCz3uIA==/base.apk (offset 0xdb8000)
#14 pc 0x00000000039103f7 /data/app/~~4SXFAPhQp5mwiotQKtLUFA==/com.google.android.webview-g0taa4kn34kCmZsBCz3uIA==/base.apk (offset 0xdb8000)
#15 pc 0x0000000000003f9f /system/lib64/libutils.so
#16 pc 0x0000000000003a5b /system/lib64/libutils.so
#17 pc 0x00000000000ef3a3 /system/lib64/libandroid_runtime.so

    at org.chromium.base.JniAndroid.handleException(chromium-SystemWebViewGoogle6432.aab-stable-755913303:21)
    at android.os.MessageQueue.nativePollOnce(MessageQueue.java)
    at android.os.MessageQueue.nextLegacy(MessageQueue.java:950)
    at android.os.MessageQueue.next(MessageQueue.java:1062)
    at android.os.Looper.loopOnce(Looper.java:221)
    at android.os.Looper.loop(Looper.java:363)
    at android.app.ActivityThread.main(ActivityThread.java:10060)
    at java.lang.reflect.Method.invoke(Method.java)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:632)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:975)

Use a safe-call when obtaining a Message from webView.handler and return false if the handler is null. This prevents a potential NPE by aborting the focus href request when the WebView has no handler available.
@mbarta mbarta requested review from jayohms and jhutarek February 23, 2026 12:30
@mbarta mbarta self-assigned this Feb 23, 2026

@jayohms jayohms left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good, thanks.

@mbarta mbarta merged commit 21c5850 into main Feb 23, 2026
1 check passed
@mbarta mbarta deleted the mb/fix_npe branch February 23, 2026 16:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

2 participants