From c03d1eb69a8903214a2402444bbc13323dc140e4 Mon Sep 17 00:00:00 2001 From: Dimitris Dafnis <68849116+jim-daf@users.noreply.github.com> Date: Sun, 26 Apr 2026 11:59:34 +0200 Subject: [PATCH] fix(JsBridgeImpl): fire OnJsBridgeReady only once per JS context (#35) The injected bridge script ended with an unconditional ".OnJsBridgeReady();" call. Re-running injectJs on the same JS context (for example WebViewClient.onPageFinished firing multiple times for the same page or sub frames triggering an extra inject) re-fired the ready callback, so any JS handler registered on it ran once per injection. This change wraps the injection in if (!window.) { ... } which makes a genuine new page load (fresh JS context) still set the bridge up exactly once, and turns repeat injection into a no-op so OnJsBridgeReady fires only on the actual ready transition. --- .../src/main/java/com/apkfuns/jsbridge/JsBridgeImpl.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/jsbridge/src/main/java/com/apkfuns/jsbridge/JsBridgeImpl.java b/jsbridge/src/main/java/com/apkfuns/jsbridge/JsBridgeImpl.java index a4792b1..62de2e8 100644 --- a/jsbridge/src/main/java/com/apkfuns/jsbridge/JsBridgeImpl.java +++ b/jsbridge/src/main/java/com/apkfuns/jsbridge/JsBridgeImpl.java @@ -214,6 +214,13 @@ private JsModule getModule(String moduleName) { private String getInjectJsString() { StringBuilder builder = new StringBuilder(); + // Issue #35: guard the whole injection so OnJsBridgeReady + // fires only once per JS context. A fresh page load starts + // with window. undefined and gets the bridge set + // up exactly once. Re-injection on the same context (for + // example onPageFinished firing multiple times, or sub + // frames triggering an extra inject call) becomes a no-op. + builder.append("if(!window.").append(newProtocol).append("){"); builder.append("var ").append(className).append("=function(){"); // 注入通用方法 builder.append(JBUtilMethodFactory.getUtilMethods(newLoadReadyMethod)); @@ -255,6 +262,7 @@ private String getInjectJsString() { builder.append("};"); builder.append("window." + newProtocol + "=new " + className + "();"); builder.append(newProtocol + ".OnJsBridgeReady();"); + builder.append("}"); return builder.toString(); }