This is an automated email from the ASF dual-hosted git repository.

GitToTheHub pushed a commit to branch 
pr-android-beforeload-event-fires-only-once
in repository 
https://gitbox.apache.org/repos/asf/cordova-plugin-inappbrowser.git

commit 5590c719f65a0bc3b33a99184955da5ba04e3a94
Author: Manuel Beck <[email protected]>
AuthorDate: Wed May 6 18:21:58 2026 +0200

    fix(android): `beforeload` event Fires only once
    
    - On Android, when beforeload=yes was enabled, the beforeload event would 
only fire on the initial page load, then stop firing for subsequent navigations.
    - Added onCreateWindow override in InAppChromeClient to route popup 
navigations through InAppBrowserClient.shouldOverrideUrlLoading() instead of 
direct loadUrl()
    - Filter out transient URLs like about:blank to avoid state corruption
    - Re-enable waitForBeforeload in onPageFinished() so subsequent user 
navigations trigger beforeload again
    - Re-enable waitForBeforeload in onReceivedError() to ensure beforeload 
works even after load errors
    - Generated-By: GPT-5.3-Codex
---
 src/android/InAppBrowser.java | 51 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 51 insertions(+)

diff --git a/src/android/InAppBrowser.java b/src/android/InAppBrowser.java
index bb3495f..56dd817 100644
--- a/src/android/InAppBrowser.java
+++ b/src/android/InAppBrowser.java
@@ -35,6 +35,7 @@ import android.net.http.SslError;
 import android.net.Uri;
 import android.os.Build;
 import android.os.Bundle;
+import android.os.Message;
 import android.text.InputType;
 import android.util.TypedValue;
 import android.view.Gravity;
@@ -923,6 +924,46 @@ public class InAppBrowser extends CordovaPlugin {
                 inAppWebView.setId(Integer.valueOf(6));
                 // File Chooser Implemented ChromeClient
                 inAppWebView.setWebChromeClient(new 
InAppChromeClient(thatWebView) {
+                    @Override
+                    public boolean onCreateWindow(WebView view, boolean 
isDialog, boolean isUserGesture, Message resultMsg) {
+                        final WebView inAppWebView = view;
+                        final WebViewClient webViewClient = new 
WebViewClient() {
+                            @Override
+                            public boolean shouldOverrideUrlLoading(WebView 
view, WebResourceRequest request) {
+                                String targetUrl = request.getUrl().toString();
+                                if ("about:blank".equals(targetUrl)) {
+                                    return false;
+                                }
+                                if (currentClient != null && 
currentClient.shouldOverrideUrlLoading(targetUrl, request.getMethod())) {
+                                    return true;
+                                }
+                                inAppWebView.loadUrl(targetUrl);
+                                return true;
+                            }
+
+                            @Override
+                            public boolean shouldOverrideUrlLoading(WebView 
view, String url) {
+                                if ("about:blank".equals(url)) {
+                                    return false;
+                                }
+                                if (currentClient != null && 
currentClient.shouldOverrideUrlLoading(url, null)) {
+                                    return true;
+                                }
+                                inAppWebView.loadUrl(url);
+                                return true;
+                            }
+                        };
+
+                        final WebView newWebView = new 
WebView(view.getContext());
+                        newWebView.setWebViewClient(webViewClient);
+
+                        final WebView.WebViewTransport transport = 
(WebView.WebViewTransport) resultMsg.obj;
+                        transport.setWebView(newWebView);
+                        resultMsg.sendToTarget();
+
+                        return true;
+                    }
+
                     public boolean onShowFileChooser (WebView webView, 
ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams 
fileChooserParams)
                     {
                         LOG.d(LOG_TAG, "File Chooser 5.0+");
@@ -1373,6 +1414,11 @@ public class InAppBrowser extends CordovaPlugin {
         public void onPageFinished(WebView view, String url) {
             super.onPageFinished(view, url);
 
+            // Re-arm beforeload after allowing the previously approved 
navigation.
+            if (beforeload != null && !beforeload.isEmpty()) {
+                this.waitForBeforeload = true;
+            }
+
             // Set the namespace for postMessage()
             
injectDeferredObject("window.webkit={messageHandlers:{cordova_iab:cordova_iab}}",
 null);
 
@@ -1397,6 +1443,11 @@ public class InAppBrowser extends CordovaPlugin {
         public void onReceivedError(WebView view, int errorCode, String 
description, String failingUrl) {
             super.onReceivedError(view, errorCode, description, failingUrl);
 
+            // Ensure future navigations can still trigger beforeload after an 
error.
+            if (beforeload != null && !beforeload.isEmpty()) {
+                this.waitForBeforeload = true;
+            }
+
             try {
                 JSONObject obj = new JSONObject();
                 obj.put("type", LOAD_ERROR_EVENT);


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to