From fd56eb0bb9389ade125781c7decbb909315ef4c0 Mon Sep 17 00:00:00 2001 From: Vinyarion <38413862+VinyarionHyarmendacil@users.noreply.github.com> Date: Thu, 19 Mar 2026 14:10:07 -0500 Subject: [PATCH 1/3] Properly support persistent callbacks --- java/org/cef/callback/CefQueryCallback.java | 8 +++++++ java/org/cef/callback/CefQueryCallback_N.java | 18 ++++++++++++++-- .../handler/MessageRouterHandlerEx.java | 8 +++++++ .../tests/detailed/handler/binding_test2.html | 19 +++++++++++++++++ native/CefQueryCallback_N.cpp | 5 ++++- native/CefQueryCallback_N.h | 5 +++-- native/message_router_handler.cpp | 21 +++++++++++++------ 7 files changed, 73 insertions(+), 11 deletions(-) diff --git a/java/org/cef/callback/CefQueryCallback.java b/java/org/cef/callback/CefQueryCallback.java index 0972bf2e..6e9afa89 100644 --- a/java/org/cef/callback/CefQueryCallback.java +++ b/java/org/cef/callback/CefQueryCallback.java @@ -22,4 +22,12 @@ public interface CefQueryCallback { * @param error_message Error message passed to JavaScript. */ public void failure(int error_code, String error_message); + + /** + * Returns whether this callback is persistent and therefore whether + * {@link CefQueryCallback#success(String)} may be called multiple times. + * Persistent queries must be explicitly canceled, either from the browser + * or via {@link CefQueryCallback#failure(int, String)}. + */ + public boolean isPersistent(); } diff --git a/java/org/cef/callback/CefQueryCallback_N.java b/java/org/cef/callback/CefQueryCallback_N.java index 14b32e3a..67465a4c 100644 --- a/java/org/cef/callback/CefQueryCallback_N.java +++ b/java/org/cef/callback/CefQueryCallback_N.java @@ -16,7 +16,7 @@ protected void finalize() throws Throwable { @Override public void success(String response) { try { - N_Success(getNativeRef(null), response); + N_Success(getNativeRef(null), response, isPersistent()); } catch (UnsatisfiedLinkError ule) { ule.printStackTrace(); } @@ -31,6 +31,20 @@ public void failure(int error_code, String error_message) { } } - private final native void N_Success(long self, String response); + @Override + public boolean isPersistent() { + return false; + } + + private final native void N_Success(long self, String response, boolean persistent); private final native void N_Failure(long self, int error_code, String error_message); } + +class CefQueryCallback_N_Persistent extends CefQueryCallback_N { + CefQueryCallback_N_Persistent() {} + + @Override + public boolean isPersistent() { + return true; + } +} diff --git a/java/tests/detailed/handler/MessageRouterHandlerEx.java b/java/tests/detailed/handler/MessageRouterHandlerEx.java index bc4b780b..0e21eb6d 100644 --- a/java/tests/detailed/handler/MessageRouterHandlerEx.java +++ b/java/tests/detailed/handler/MessageRouterHandlerEx.java @@ -47,6 +47,14 @@ public boolean onQuery(CefBrowser browser, CefFrame frame, long query_id, String router_ = null; callback.success(""); } + } else if (request.startsWith("doPersistent")) { + if (persistent) { + callback.success("Hello,"); + callback.success("World!"); + callback.failure(0, "Finished"); + } else { + callback.failure(-1, "Request not marked as persistent"); + } } else { // not handled return false; diff --git a/java/tests/detailed/handler/binding_test2.html b/java/tests/detailed/handler/binding_test2.html index 8a61a96f..b9ebd3ae 100644 --- a/java/tests/detailed/handler/binding_test2.html +++ b/java/tests/detailed/handler/binding_test2.html @@ -17,6 +17,20 @@ }); } +function doPersistent() { + document.getElementById('persist').value = ''; + window.cefQuery({ + request: 'doPersistent', + persistent: true, + onSuccess: function(response) { + document.getElementById('persist').value += ' ' + response; + }, + onFailure: function(error_code, error_message) { + document.getElementById('persist').value += ' ' + error_code + ' ' + error_message; + } + }); +} + function execute(cmd) { window.cefQuery({ request: cmd, @@ -75,6 +89,11 @@
This button tests persistent queries. When the button is pressed, it clears the output, +and when it receives a success message, it appends it to the output. When it finally receives +a failure message, it appends the error_code followed by the error_message.
+ +