From fb606da01f6e21bbd63110c568945332fd0ecc47 Mon Sep 17 00:00:00 2001 From: Izuna <1zuna@ccbluex.net> Date: Thu, 23 Jan 2025 19:39:36 +0100 Subject: [PATCH 01/16] feat: JCEF w/ CEF 130.1.9+gfc42567+chromium-130.0.6723.70 (#9) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix CefDisplayHandler.onFullscreenModeChange name (see #239) Method names should follow Java naming conventions. * Add two flags to CefPdfPrintSettings * CefApp.getInstance: Support switch values containing '=' (fixes #470) * Update to CEF 126.2.0+g5c56e98+chromium-126.0.6478.62 * Update to CEF 127.3.1+g6cbb30e+chromium-127.0.6533.100 Disabled signal handlers on POSIX systems and removed the previous signal handler fix. * Fix Java signature for CefRequestHandler#onRenderProcessTerminated method * Update to CEF 130.1.9+gfc42567+chromium-130.0.6723.70 This adapts JCEF to a significant change in CEF: the removal of the Alloy Bootstrap. It makes JCEF use the Alloy Runtime mode for "normal" browser windows (because Chrome-style windows can't be integrated into existing native parents, which is how JCEF integrates browsers into Java UI) and changes the DevTools handling to open the DevTools in a separate pop-up window. The latter is necessary because DevTools are unsupported in an Alloy-style window by CEF at the moment, thus it's no longer possible to integrate the DevTools into Java windows. * fix: pack_loading_disabled on context * fix: no AWT OSR --------- Co-authored-by: Vladislav Rassokhin Co-authored-by: Sander van den Berg Co-authored-by: Rene Schneider Co-authored-by: Loïc Frasse-Mathon Co-authored-by: David Cernoch --- CMakeLists.txt | 2 +- java/org/cef/CefClient.java | 25 +++++---- java/org/cef/CefSettings.java | 10 ---- java/org/cef/browser/CefBrowser.java | 15 +++--- java/org/cef/browser/CefBrowser_N.java | 16 +++--- .../org/cef/handler/CefAppHandlerAdapter.java | 10 ++-- java/org/cef/handler/CefDialogHandler.java | 8 ++- java/org/cef/handler/CefDisplayHandler.java | 2 +- .../cef/handler/CefDisplayHandlerAdapter.java | 2 +- java/org/cef/handler/CefDownloadHandler.java | 10 ++-- .../handler/CefDownloadHandlerAdapter.java | 6 ++- java/org/cef/handler/CefLoadHandler.java | 7 --- java/org/cef/handler/CefRequestHandler.java | 9 +++- .../cef/handler/CefRequestHandlerAdapter.java | 3 +- java/org/cef/misc/CefPdfPrintSettings.java | 12 +++++ native/CMakeLists.txt | 4 -- native/CefBrowser_N.cpp | 52 ++++++++++++------- native/context.cpp | 21 ++------ native/dialog_handler.cpp | 25 ++++++--- native/dialog_handler.h | 2 + native/display_handler.cpp | 2 +- native/download_handler.cpp | 14 +++-- native/download_handler.h | 2 +- native/jni_util.cpp | 14 ----- native/request_handler.cpp | 21 +++++--- native/request_handler.h | 4 +- native/signal_restore_posix.cpp | 38 -------------- native/signal_restore_posix.h | 11 ---- 28 files changed, 162 insertions(+), 185 deletions(-) delete mode 100644 native/signal_restore_posix.cpp delete mode 100644 native/signal_restore_posix.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 9e12f87e..7affb595 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -132,7 +132,7 @@ set_property(GLOBAL PROPERTY OS_FOLDERS ON) # Specify the CEF distribution version. if(NOT DEFINED CEF_VERSION) - set(CEF_VERSION "122.1.10+gc902316+chromium-122.0.6261.112") + set(CEF_VERSION "130.1.9+gfc42567+chromium-130.0.6723.70") endif() # Determine the platform. diff --git a/java/org/cef/CefClient.java b/java/org/cef/CefClient.java index e3008c41..a3c4c386 100644 --- a/java/org/cef/CefClient.java +++ b/java/org/cef/CefClient.java @@ -212,10 +212,11 @@ public void removeDialogHandler() { @Override public boolean onFileDialog(CefBrowser browser, FileDialogMode mode, String title, - String defaultFilePath, Vector acceptFilters, CefFileDialogCallback callback) { + String defaultFilePath, Vector acceptFilters, Vector acceptExtensions, + Vector acceptDescriptions, CefFileDialogCallback callback) { if (dialogHandler_ != null && browser != null) { - return dialogHandler_.onFileDialog( - browser, mode, title, defaultFilePath, acceptFilters, callback); + return dialogHandler_.onFileDialog(browser, mode, title, defaultFilePath, acceptFilters, + acceptExtensions, acceptDescriptions, callback); } return false; } @@ -244,9 +245,9 @@ public void onTitleChange(CefBrowser browser, String title) { } @Override - public void OnFullscreenModeChange(CefBrowser browser, boolean fullscreen) { + public void onFullscreenModeChange(CefBrowser browser, boolean fullscreen) { if (displayHandler_ != null && browser != null) - displayHandler_.OnFullscreenModeChange(browser, fullscreen); + displayHandler_.onFullscreenModeChange(browser, fullscreen); } @Override @@ -303,10 +304,12 @@ public void removeDownloadHandler() { } @Override - public void onBeforeDownload(CefBrowser browser, CefDownloadItem downloadItem, - String suggestedName, CefBeforeDownloadCallback callback) { + public boolean onBeforeDownload(CefBrowser browser, CefDownloadItem downloadItem, + String suggestedName, CefBeforeDownloadCallback callback) { if (downloadHandler_ != null && browser != null) - downloadHandler_.onBeforeDownload(browser, downloadItem, suggestedName, callback); + return downloadHandler_.onBeforeDownload( + browser, downloadItem, suggestedName, callback); + return false; } @Override @@ -757,8 +760,10 @@ public boolean onCertificateError( } @Override - public void onRenderProcessTerminated(CefBrowser browser, TerminationStatus status) { - if (requestHandler_ != null) requestHandler_.onRenderProcessTerminated(browser, status); + public void onRenderProcessTerminated( + CefBrowser browser, TerminationStatus status, int error_code, String error_string) { + if (requestHandler_ != null) + requestHandler_.onRenderProcessTerminated(browser, status, error_code, error_string); } // CefWindowHandler diff --git a/java/org/cef/CefSettings.java b/java/org/cef/CefSettings.java index 49583d0a..209b6042 100644 --- a/java/org/cef/CefSettings.java +++ b/java/org/cef/CefSettings.java @@ -214,15 +214,6 @@ public ColorType clone() { */ public String locales_dir_path = null; - /** - * Set to true to disable loading of pack files for resources and locales. - * A resource bundle handler must be provided for the browser and render - * processes via CefApp::GetResourceBundleHandler() if loading of pack files - * is disabled. Also configurable using the "disable-pack-loading" command- - * line switch. - */ - public boolean pack_loading_disabled = false; - /** * Set to a value between 1024 and 65535 to enable remote debugging on the * specified port. For example, if 8080 is specified the remote debugging URL @@ -284,7 +275,6 @@ public CefSettings clone() { tmp.javascript_flags = javascript_flags; tmp.resources_dir_path = resources_dir_path; tmp.locales_dir_path = locales_dir_path; - tmp.pack_loading_disabled = pack_loading_disabled; tmp.remote_debugging_port = remote_debugging_port; tmp.uncaught_exception_stack_size = uncaught_exception_stack_size; if (background_color != null) tmp.background_color = background_color.clone(); diff --git a/java/org/cef/browser/CefBrowser.java b/java/org/cef/browser/CefBrowser.java index d9343120..cfe3e039 100644 --- a/java/org/cef/browser/CefBrowser.java +++ b/java/org/cef/browser/CefBrowser.java @@ -331,18 +331,21 @@ public void runFileDialog(FileDialogMode mode, String title, String defaultFileP public void stopFinding(boolean clearSelection); /** - * Get an instance of the DevTools to be displayed in its own window or to be - * embedded within your UI. Only one instance per browser is available. + * Get an instance of the DevTools to be displayed in its own window. */ - public CefBrowser getDevTools(); + public void openDevTools(); /** - * Get an instance of the DevTools to be displayed in its own window or to be - * embedded within your UI. Only one instance per browser is available. + * Open an instance of the DevTools to be displayed in its own window. * * @param inspectAt a position in the UI which should be inspected. */ - public CefBrowser getDevTools(Point inspectAt); + public void openDevTools(Point inspectAt); + + /** + * Close the DevTools. + */ + public void closeDevTools(); /** * Get an instance of a client that can be used to leverage the DevTools diff --git a/java/org/cef/browser/CefBrowser_N.java b/java/org/cef/browser/CefBrowser_N.java index 72502f64..6c4d5595 100644 --- a/java/org/cef/browser/CefBrowser_N.java +++ b/java/org/cef/browser/CefBrowser_N.java @@ -35,7 +35,6 @@ public abstract class CefBrowser_N extends CefNativeAdapter implements CefBrowse private final CefRequestContext request_context_; private volatile CefBrowser_N parent_ = null; private volatile Point inspectAt_ = null; - private volatile CefBrowser_N devTools_ = null; private volatile CefDevToolsClient devToolsClient_ = null; private boolean closeAllowed_ = false; private volatile boolean isClosed_ = false; @@ -112,7 +111,6 @@ public synchronized void onBeforeClose() { if (request_context_ != null) request_context_.dispose(); if (parent_ != null) { parent_.closeDevTools(); - parent_.devTools_ = null; parent_ = null; } if (devToolsClient_ != null) { @@ -121,16 +119,13 @@ public synchronized void onBeforeClose() { } @Override - public CefBrowser getDevTools() { - return getDevTools(null); + public void openDevTools() { + openDevTools(null); } @Override - public synchronized CefBrowser getDevTools(Point inspectAt) { - if (devTools_ == null) { - devTools_ = createDevToolsBrowser(client_, url_, request_context_, this, inspectAt); - } - return devTools_; + public synchronized void openDevTools(Point inspectAt) { + createDevToolsBrowser(client_, url_, request_context_, this, inspectAt).createImmediately(); } @Override @@ -572,7 +567,8 @@ public void stopFinding(boolean clearSelection) { } } - protected final void closeDevTools() { + @Override + public void closeDevTools() { try { N_CloseDevTools(); } catch (UnsatisfiedLinkError ule) { diff --git a/java/org/cef/handler/CefAppHandlerAdapter.java b/java/org/cef/handler/CefAppHandlerAdapter.java index 1d0bc15b..9947b74c 100644 --- a/java/org/cef/handler/CefAppHandlerAdapter.java +++ b/java/org/cef/handler/CefAppHandlerAdapter.java @@ -48,11 +48,13 @@ public void onBeforeCommandLineProcessing(String process_type, CefCommandLine co case 1: { // Switches can optionally have a value specified using the '=' delimiter // (e.g. "-switch=value"). - String[] switchVals = arg.substring(switchCnt).split("="); - if (switchVals.length == 2) { - command_line.appendSwitchWithValue(switchVals[0], switchVals[1]); + String switchStr = arg.substring(switchCnt); + int index = switchStr.indexOf('='); + if (index > 0) { + command_line.appendSwitchWithValue( + switchStr.substring(0, index), switchStr.substring(index + 1)); } else { - command_line.appendSwitch(switchVals[0]); + command_line.appendSwitch(switchStr); } break; } diff --git a/java/org/cef/handler/CefDialogHandler.java b/java/org/cef/handler/CefDialogHandler.java index 311de4cb..12ffdea7 100644 --- a/java/org/cef/handler/CefDialogHandler.java +++ b/java/org/cef/handler/CefDialogHandler.java @@ -38,11 +38,17 @@ enum FileDialogMode { * "image/*"), (b) individual file extensions (e.g. ".txt" or ".png"), or (c) * combined description and file extension delimited using "|" and ";" (e.g. * "Image Types|.png;.gif;.jpg"). + * @param acceptExtensions provides the semicolon-delimited expansion of MIME + * types to file extensions (if known, or empty string otherwise). + * @param acceptDescriptions provides the descriptions for MIME types (if known, + * or empty string otherwise). For example, the "image/*" mime type might + * have extensions ".png;.jpg;.bmp;..." and description "Image Files". * @param callback is a callback handler for handling own file dialogs. * * @return To display a custom dialog return true and execute callback. * To display the default dialog return false. */ public boolean onFileDialog(CefBrowser browser, FileDialogMode mode, String title, - String defaultFilePath, Vector acceptFilters, CefFileDialogCallback callback); + String defaultFilePath, Vector acceptFilters, Vector acceptExtensions, + Vector acceptDescriptions, CefFileDialogCallback callback); } diff --git a/java/org/cef/handler/CefDisplayHandler.java b/java/org/cef/handler/CefDisplayHandler.java index 5913794e..f2a828eb 100644 --- a/java/org/cef/handler/CefDisplayHandler.java +++ b/java/org/cef/handler/CefDisplayHandler.java @@ -33,7 +33,7 @@ public interface CefDisplayHandler { * @param browser The browser generating the event. * @param fullscreen True if fullscreen mode is on. */ - public void OnFullscreenModeChange(CefBrowser browser, boolean fullscreen); + public void onFullscreenModeChange(CefBrowser browser, boolean fullscreen); /** * About to display a tooltip. diff --git a/java/org/cef/handler/CefDisplayHandlerAdapter.java b/java/org/cef/handler/CefDisplayHandlerAdapter.java index 302ae6b0..90d22d50 100644 --- a/java/org/cef/handler/CefDisplayHandlerAdapter.java +++ b/java/org/cef/handler/CefDisplayHandlerAdapter.java @@ -25,7 +25,7 @@ public void onTitleChange(CefBrowser browser, String title) { } @Override - public void OnFullscreenModeChange(CefBrowser browser, boolean fullscreen) { + public void onFullscreenModeChange(CefBrowser browser, boolean fullscreen) { return; } diff --git a/java/org/cef/handler/CefDownloadHandler.java b/java/org/cef/handler/CefDownloadHandler.java index 66ea49a4..3f0ee6f2 100644 --- a/java/org/cef/handler/CefDownloadHandler.java +++ b/java/org/cef/handler/CefDownloadHandler.java @@ -15,9 +15,11 @@ */ public interface CefDownloadHandler { /** - * Called before a download begins. By default the download will be canceled. - * Execute callback either asynchronously or in this method to continue the download - * if desired. + * Called before a download begins. Return true and execute |callback| either + * asynchronously or in this method to continue or cancel the download. + * Return false to proceed with default handling (cancel with Alloy style, + * download shelf with Chrome style). Do not keep a reference to + * downloadItem outside of this method. * * @param browser The desired browser. * @param downloadItem The item to be downloaded. Do not keep a reference to it outside this @@ -25,7 +27,7 @@ public interface CefDownloadHandler { * @param suggestedName is the suggested name for the download file. * @param callback start the download by calling the Continue method */ - public void onBeforeDownload(CefBrowser browser, CefDownloadItem downloadItem, + public boolean onBeforeDownload(CefBrowser browser, CefDownloadItem downloadItem, String suggestedName, CefBeforeDownloadCallback callback); /** diff --git a/java/org/cef/handler/CefDownloadHandlerAdapter.java b/java/org/cef/handler/CefDownloadHandlerAdapter.java index 8b1f46aa..f0311637 100644 --- a/java/org/cef/handler/CefDownloadHandlerAdapter.java +++ b/java/org/cef/handler/CefDownloadHandlerAdapter.java @@ -16,8 +16,10 @@ */ public abstract class CefDownloadHandlerAdapter implements CefDownloadHandler { @Override - public void onBeforeDownload(CefBrowser browser, CefDownloadItem downloadItem, - String suggestedName, CefBeforeDownloadCallback callback) {} + public boolean onBeforeDownload(CefBrowser browser, CefDownloadItem downloadItem, + String suggestedName, CefBeforeDownloadCallback callback) { + return false; + } @Override public void onDownloadUpdated( diff --git a/java/org/cef/handler/CefLoadHandler.java b/java/org/cef/handler/CefLoadHandler.java index af50686e..4f0bb831 100644 --- a/java/org/cef/handler/CefLoadHandler.java +++ b/java/org/cef/handler/CefLoadHandler.java @@ -213,13 +213,6 @@ enum ErrorCode { ERR_INVALID_WEB_BUNDLE(-505), ERR_TRUST_TOKEN_OPERATION_FAILED(-506), ERR_TRUST_TOKEN_OPERATION_SUCCESS_WITHOUT_SENDING_REQUEST(-507), - ERR_FTP_FAILED(-601), - ERR_FTP_SERVICE_UNAVAILABLE(-602), - ERR_FTP_TRANSFER_ABORTED(-603), - ERR_FTP_FILE_BUSY(-604), - ERR_FTP_SYNTAX_ERROR(-605), - ERR_FTP_COMMAND_NOT_SUPPORTED(-606), - ERR_FTP_BAD_COMMAND_SEQUENCE(-607), ERR_PKCS12_IMPORT_BAD_PASSWORD(-701), ERR_PKCS12_IMPORT_FAILED(-702), ERR_IMPORT_CA_CERT_NOT_CA(-703), diff --git a/java/org/cef/handler/CefRequestHandler.java b/java/org/cef/handler/CefRequestHandler.java index 7a508323..93cbe95b 100644 --- a/java/org/cef/handler/CefRequestHandler.java +++ b/java/org/cef/handler/CefRequestHandler.java @@ -24,7 +24,9 @@ enum TerminationStatus { TS_ABNORMAL_TERMINATION, //!< Non-zero exit status. TS_PROCESS_WAS_KILLED, //!< SIGKILL or task manager kill. TS_PROCESS_CRASHED, //!< Segmentation fault. - TS_PROCESS_OOM //!< Out of memory. + TS_PROCESS_OOM, //!< Out of memory. + TS_LAUNCH_FAILED, //!< Failed to launch. + TS_INTEGRITY_FAILURE //!< Integrity check failed. } /** @@ -123,6 +125,9 @@ boolean onCertificateError(CefBrowser browser, CefLoadHandler.ErrorCode cert_err * Called on the browser process UI thread when the render process terminates unexpectedly. * @param browser The corresponding browser. * @param status Indicates how the process was terminated. + * @param error_code The process error code. + * @param error_string A string description of the error. */ - void onRenderProcessTerminated(CefBrowser browser, TerminationStatus status); + void onRenderProcessTerminated( + CefBrowser browser, TerminationStatus status, int error_code, String error_string); } diff --git a/java/org/cef/handler/CefRequestHandlerAdapter.java b/java/org/cef/handler/CefRequestHandlerAdapter.java index dd785529..a6c04ef6 100644 --- a/java/org/cef/handler/CefRequestHandlerAdapter.java +++ b/java/org/cef/handler/CefRequestHandlerAdapter.java @@ -51,5 +51,6 @@ public boolean onCertificateError( } @Override - public void onRenderProcessTerminated(CefBrowser browser, TerminationStatus status) {} + public void onRenderProcessTerminated( + CefBrowser browser, TerminationStatus status, int error_code, String error_string) {} } diff --git a/java/org/cef/misc/CefPdfPrintSettings.java b/java/org/cef/misc/CefPdfPrintSettings.java index 49afdc28..a014d81c 100644 --- a/java/org/cef/misc/CefPdfPrintSettings.java +++ b/java/org/cef/misc/CefPdfPrintSettings.java @@ -105,6 +105,16 @@ public enum MarginType { */ public String footer_template; + /** + * Whether or not to generate tagged (accessible) PDF. + */ + public boolean generate_tagged_pdf; + + /** + * Whether or not to embed the document outline into the PDF. + */ + public boolean generate_document_outline; + public CefPdfPrintSettings() {} @Override @@ -125,6 +135,8 @@ public CefPdfPrintSettings clone() { tmp.display_header_footer = this.display_header_footer; tmp.header_template = this.header_template; tmp.footer_template = this.footer_template; + tmp.generate_tagged_pdf = this.generate_tagged_pdf; + tmp.generate_document_outline = this.generate_document_outline; return tmp; } } diff --git a/native/CMakeLists.txt b/native/CMakeLists.txt index 70e88f40..1099cc48 100644 --- a/native/CMakeLists.txt +++ b/native/CMakeLists.txt @@ -148,8 +148,6 @@ set(JCEF_SRCS set(JCEF_SRCS_LINUX critical_wait_posix.cpp jni_util_linux.cpp - signal_restore_posix.cpp - signal_restore_posix.h temp_window_x11.cc temp_window_x11.h util_linux.cpp @@ -157,8 +155,6 @@ set(JCEF_SRCS_LINUX ) set(JCEF_SRCS_MAC critical_wait_posix.cpp - signal_restore_posix.cpp - signal_restore_posix.h temp_window_mac.h temp_window_mac.mm util_mac.h diff --git a/native/CefBrowser_N.cpp b/native/CefBrowser_N.cpp index 6d39d926..482211ec 100644 --- a/native/CefBrowser_N.cpp +++ b/native/CefBrowser_N.cpp @@ -1010,11 +1010,31 @@ void create(std::shared_ptr objs, if (!lifeSpanHandler.get()) return; - CefWindowInfo windowInfo; - windowInfo.SetAsWindowless((CefWindowHandle)windowHandle); + CefRefPtr parentBrowser = + GetCefFromJNIObject(env, objs->jparentBrowser, "CefBrowser"); + CefWindowInfo windowInfo; CefBrowserSettings settings; + // If parentBrowser is set, we want to show the DEV-Tools for that browser. + // Since that cannot be an Alloy-style window, it cannot be integrated into + // Java UI but must be opened as a pop-up. + if (parentBrowser.get() != nullptr) { + CefPoint inspectAt; + if (objs->jinspectAt != nullptr) { + int x, y; + GetJNIPoint(env, objs->jinspectAt, &x, &y); + inspectAt.Set(x, y); + } + + parentBrowser->GetHost()->ShowDevTools(windowInfo, clientHandler.get(), + settings, inspectAt); + JNI_CALL_VOID_METHOD(env, objs->jbrowser, "notifyBrowserCreated", "()V"); + return; + } + + windowInfo.SetAsWindowless((CefWindowHandle)windowHandle); + if (transparent == JNI_FALSE) { // Specify an opaque background color (white) to disable transparency. settings.background_color = CefColorSetARGB(255, 255, 255, 255); @@ -1033,27 +1053,10 @@ void create(std::shared_ptr objs, CefRefPtr context = GetCefFromJNIObject( env, objs->jcontext, "CefRequestContext"); - CefRefPtr parentBrowser = - GetCefFromJNIObject(env, objs->jparentBrowser, "CefBrowser"); - // Add a global ref that will be released in LifeSpanHandler::OnAfterCreated. jobject globalRef = env->NewGlobalRef(objs->jbrowser); lifeSpanHandler->registerJBrowser(globalRef); - // If parentBrowser is set, we want to show the DEV-Tools for that browser - if (parentBrowser.get() != nullptr) { - CefPoint inspectAt; - if (objs->jinspectAt != nullptr) { - int x, y; - GetJNIPoint(env, objs->jinspectAt, &x, &y); - inspectAt.Set(x, y); - } - parentBrowser->GetHost()->ShowDevTools(windowInfo, clientHandler.get(), - settings, inspectAt); - JNI_CALL_VOID_METHOD(env, objs->jbrowser, "notifyBrowserCreated", "()V"); - return; - } - CefRefPtr extra_info; auto router_configs = BrowserProcessHandler::GetMessageRouterConfigs(); if (router_configs) { @@ -1062,6 +1065,10 @@ void create(std::shared_ptr objs, extra_info->SetList("router_configs", router_configs); } + // JCEF requires Alloy runtime style for "normal" browsers in order for them + // to be integratable into Java UI. + windowInfo.runtime_style = CEF_RUNTIME_STYLE_ALLOY; + bool result = CefBrowserHost::CreateBrowser( windowInfo, clientHandler.get(), strUrl, settings, extra_info, context); if (!result) { @@ -1190,6 +1197,12 @@ CefPdfPrintSettings GetJNIPdfPrintSettings(JNIEnv* env, jobject obj) { tmp.clear(); } + GetJNIFieldBoolean(env, cls, obj, "generate_tagged_pdf", + &settings.generate_tagged_pdf); + + GetJNIFieldBoolean(env, cls, obj, "generate_document_outline", + &settings.generate_document_outline); + return settings; } @@ -1555,7 +1568,6 @@ Java_org_cef_browser_CefBrowser_1N_N_1SetWindowVisibility(JNIEnv* env, } #endif } - JNIEXPORT jdouble JNICALL Java_org_cef_browser_CefBrowser_1N_N_1GetZoomLevel(JNIEnv* env, jobject obj) { CefRefPtr browser = JNI_GET_BROWSER_OR_RETURN(env, obj, 0.0); diff --git a/native/context.cpp b/native/context.cpp index 1e4020c1..802c930a 100644 --- a/native/context.cpp +++ b/native/context.cpp @@ -13,10 +13,6 @@ #include "util_mac.h" #endif -#if defined(OS_POSIX) -#include "signal_restore_posix.h" -#endif - namespace { Context* g_context = nullptr; @@ -24,6 +20,11 @@ Context* g_context = nullptr; CefSettings GetJNISettings(JNIEnv* env, jobject obj) { CefString tmp; CefSettings settings; + +#if defined(OS_POSIX) && !defined(OS_ANDROID) + settings.disable_signal_handlers = true; +#endif + if (!obj) return settings; @@ -116,8 +117,6 @@ CefSettings GetJNISettings(JNIEnv* env, jobject obj) { CefString(&settings.main_bundle_path) = tmp; tmp.clear(); } - GetJNIFieldBoolean(env, cls, obj, "pack_loading_disabled", - &settings.pack_loading_disabled); GetJNIFieldInt(env, cls, obj, "remote_debugging_port", &settings.remote_debugging_port); GetJNIFieldInt(env, cls, obj, "uncaught_exception_stack_size", @@ -236,12 +235,6 @@ bool Context::Initialize(JNIEnv* env, new ClientApp(CefString(&settings.cache_path), env, appHandler)); bool res = false; -#if defined(OS_POSIX) - // CefInitialize will reset signal handlers. Backup/restore the original - // signal handlers to avoid crashes in the JVM (see issue #41). - BackupSignalHandlers(); -#endif - #if defined(OS_MACOSX) res = util_mac::CefInitializeOnMainThread(main_args, settings, client_app.get()); @@ -249,10 +242,6 @@ bool Context::Initialize(JNIEnv* env, res = CefInitialize(main_args, settings, client_app.get(), nullptr); #endif -#if defined(OS_POSIX) - RestoreSignalHandlers(); -#endif - return res; } diff --git a/native/dialog_handler.cpp b/native/dialog_handler.cpp index 30acb467..883f675f 100644 --- a/native/dialog_handler.cpp +++ b/native/dialog_handler.cpp @@ -27,12 +27,15 @@ class ScopedJNIFileDialogCallback DialogHandler::DialogHandler(JNIEnv* env, jobject handler) : handle_(env, handler) {} -bool DialogHandler::OnFileDialog(CefRefPtr browser, - FileDialogMode mode, - const CefString& title, - const CefString& default_file_path, - const std::vector& accept_filters, - CefRefPtr callback) { +bool DialogHandler::OnFileDialog( + CefRefPtr browser, + FileDialogMode mode, + const CefString& title, + const CefString& default_file_path, + const std::vector& accept_filters, + const std::vector& accept_extensions, + const std::vector& accept_descriptions, + CefRefPtr callback) { ScopedJNIEnv env; if (!env) return false; @@ -42,6 +45,10 @@ bool DialogHandler::OnFileDialog(CefRefPtr browser, ScopedJNIString jdefaultFilePath(env, default_file_path); ScopedJNIObjectLocal jacceptFilters(env, NewJNIStringVector(env, accept_filters)); + ScopedJNIObjectLocal jacceptExtensions( + env, NewJNIStringVector(env, accept_extensions)); + ScopedJNIObjectLocal jacceptDescriptions( + env, NewJNIStringVector(env, accept_descriptions)); ScopedJNIFileDialogCallback jcallback(env, callback); ScopedJNIObjectResult jmode(env); @@ -61,9 +68,11 @@ bool DialogHandler::OnFileDialog(CefRefPtr browser, env, handle_, "onFileDialog", "(Lorg/cef/browser/CefBrowser;Lorg/cef/handler/" "CefDialogHandler$FileDialogMode;Ljava/lang/String;Ljava/lang/" - "String;Ljava/util/Vector;Lorg/cef/callback/CefFileDialogCallback;)Z", + "String;Ljava/util/Vector;Ljava/util/Vector;Ljava/util/Vector;Lorg/cef/" + "callback/CefFileDialogCallback;)Z", Boolean, jreturn, jbrowser.get(), jmode.get(), jtitle.get(), - jdefaultFilePath.get(), jacceptFilters.get(), jcallback.get()); + jdefaultFilePath.get(), jacceptFilters.get(), jacceptExtensions.get(), + jacceptDescriptions.get(), jcallback.get()); if (jreturn == JNI_FALSE) { // If the Java method returns "false" the callback won't be used and diff --git a/native/dialog_handler.h b/native/dialog_handler.h index d4ec0cd3..0a5411ee 100644 --- a/native/dialog_handler.h +++ b/native/dialog_handler.h @@ -22,6 +22,8 @@ class DialogHandler : public CefDialogHandler { const CefString& title, const CefString& default_file_path, const std::vector& accept_filters, + const std::vector& accept_extensions, + const std::vector& accept_descriptions, CefRefPtr callback) override; protected: diff --git a/native/display_handler.cpp b/native/display_handler.cpp index 13dcd9de..cb0537fa 100644 --- a/native/display_handler.cpp +++ b/native/display_handler.cpp @@ -48,7 +48,7 @@ void DisplayHandler::OnFullscreenModeChange(CefRefPtr browser, return; ScopedJNIBrowser jbrowser(env, browser); - JNI_CALL_VOID_METHOD(env, handle_, "OnFullscreenModeChange", + JNI_CALL_VOID_METHOD(env, handle_, "onFullscreenModeChange", "(Lorg/cef/browser/CefBrowser;Z)V", jbrowser.get(), (jboolean)fullscreen); } diff --git a/native/download_handler.cpp b/native/download_handler.cpp index f594d435..e0b37759 100644 --- a/native/download_handler.cpp +++ b/native/download_handler.cpp @@ -49,14 +49,14 @@ class ScopedJNIDownloadItemCallback DownloadHandler::DownloadHandler(JNIEnv* env, jobject handler) : handle_(env, handler) {} -void DownloadHandler::OnBeforeDownload( +bool DownloadHandler::OnBeforeDownload( CefRefPtr browser, CefRefPtr download_item, const CefString& suggested_name, CefRefPtr callback) { ScopedJNIEnv env; if (!env) - return; + return false; ScopedJNIBrowser jbrowser(env, browser); ScopedJNIDownloadItem jdownloadItem(env, download_item); @@ -64,12 +64,16 @@ void DownloadHandler::OnBeforeDownload( ScopedJNIString jsuggestedName(env, suggested_name); ScopedJNIBeforeDownloadCallback jcallback(env, callback); - JNI_CALL_VOID_METHOD( - env, handle_, "onBeforeDownload", + jboolean jresult = 0; + + JNI_CALL_BOOLEAN_METHOD( + jresult, env, handle_, "onBeforeDownload", "(Lorg/cef/browser/CefBrowser;Lorg/cef/callback/CefDownloadItem;" - "Ljava/lang/String;Lorg/cef/callback/CefBeforeDownloadCallback;)V", + "Ljava/lang/String;Lorg/cef/callback/CefBeforeDownloadCallback;)Z", jbrowser.get(), jdownloadItem.get(), jsuggestedName.get(), jcallback.get()); + + return jresult; } void DownloadHandler::OnDownloadUpdated( diff --git a/native/download_handler.h b/native/download_handler.h index d41ca492..adbaacbb 100644 --- a/native/download_handler.h +++ b/native/download_handler.h @@ -17,7 +17,7 @@ class DownloadHandler : public CefDownloadHandler { DownloadHandler(JNIEnv* env, jobject handler); // CefDownloadHandler methods - virtual void OnBeforeDownload( + virtual bool OnBeforeDownload( CefRefPtr browser, CefRefPtr download_item, const CefString& suggested_name, diff --git a/native/jni_util.cpp b/native/jni_util.cpp index fbc73852..4bee5978 100644 --- a/native/jni_util.cpp +++ b/native/jni_util.cpp @@ -685,20 +685,6 @@ jobject NewJNIErrorCode(JNIEnv* env, cef_errorcode_t errorCode) { JNI_CASE(env, "org/cef/handler/CefLoadHandler$ErrorCode", ERR_TRUST_TOKEN_OPERATION_SUCCESS_WITHOUT_SENDING_REQUEST, jerrorCode); - JNI_CASE(env, "org/cef/handler/CefLoadHandler$ErrorCode", ERR_FTP_FAILED, - jerrorCode); - JNI_CASE(env, "org/cef/handler/CefLoadHandler$ErrorCode", - ERR_FTP_SERVICE_UNAVAILABLE, jerrorCode); - JNI_CASE(env, "org/cef/handler/CefLoadHandler$ErrorCode", - ERR_FTP_TRANSFER_ABORTED, jerrorCode); - JNI_CASE(env, "org/cef/handler/CefLoadHandler$ErrorCode", - ERR_FTP_FILE_BUSY, jerrorCode); - JNI_CASE(env, "org/cef/handler/CefLoadHandler$ErrorCode", - ERR_FTP_SYNTAX_ERROR, jerrorCode); - JNI_CASE(env, "org/cef/handler/CefLoadHandler$ErrorCode", - ERR_FTP_COMMAND_NOT_SUPPORTED, jerrorCode); - JNI_CASE(env, "org/cef/handler/CefLoadHandler$ErrorCode", - ERR_FTP_BAD_COMMAND_SEQUENCE, jerrorCode); JNI_CASE(env, "org/cef/handler/CefLoadHandler$ErrorCode", ERR_PKCS12_IMPORT_BAD_PASSWORD, jerrorCode); JNI_CASE(env, "org/cef/handler/CefLoadHandler$ErrorCode", diff --git a/native/request_handler.cpp b/native/request_handler.cpp index 26d50dbd..0b6f6cec 100644 --- a/native/request_handler.cpp +++ b/native/request_handler.cpp @@ -175,7 +175,9 @@ bool RequestHandler::OnCertificateError(CefRefPtr browser, } void RequestHandler::OnRenderProcessTerminated(CefRefPtr browser, - TerminationStatus status) { + TerminationStatus status, + int error_code, + const CefString& error_string) { // Forward request to ClientHandler to make the message_router_ happy. CefRefPtr client = (ClientHandler*)browser->GetHost()->GetClient().get(); @@ -197,11 +199,18 @@ void RequestHandler::OnRenderProcessTerminated(CefRefPtr browser, TS_PROCESS_CRASHED, jstatus); JNI_CASE(env, "org/cef/handler/CefRequestHandler$TerminationStatus", TS_PROCESS_OOM, jstatus); + JNI_CASE(env, "org/cef/handler/CefRequestHandler$TerminationStatus", + TS_LAUNCH_FAILED, jstatus); + JNI_CASE(env, "org/cef/handler/CefRequestHandler$TerminationStatus", + TS_INTEGRITY_FAILURE, jstatus); } - JNI_CALL_VOID_METHOD( - env, handle_, "onRenderProcessTerminated", - "(Lorg/cef/browser/CefBrowser;" - "Lorg/cef/handler/CefRequestHandler$TerminationStatus;)V", - jbrowser.get(), jstatus.get()); + ScopedJNIString jerrorString(env, error_string); + + JNI_CALL_VOID_METHOD(env, handle_, "onRenderProcessTerminated", + "(Lorg/cef/browser/CefBrowser;" + "Lorg/cef/handler/CefRequestHandler$TerminationStatus;" + "ILjava/lang/String;)V", + jbrowser.get(), jstatus.get(), error_code, + jerrorString.get()); } diff --git a/native/request_handler.h b/native/request_handler.h index 60b47b0b..9ee8356e 100644 --- a/native/request_handler.h +++ b/native/request_handler.h @@ -50,7 +50,9 @@ class RequestHandler : public CefRequestHandler { CefRefPtr ssl_info, CefRefPtr callback) override; void OnRenderProcessTerminated(CefRefPtr browser, - TerminationStatus status) override; + TerminationStatus status, + int error_code, + const CefString& error_string) override; protected: ScopedJNIObjectGlobal handle_; diff --git a/native/signal_restore_posix.cpp b/native/signal_restore_posix.cpp deleted file mode 100644 index 03d22496..00000000 --- a/native/signal_restore_posix.cpp +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright (c) 2014 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. - -#include "signal_restore_posix.h" - -#include -#include - -// arraysize borrowed from base/macros.h -template -char (&ArraySizeHelper(T (&array)[N]))[N]; -#define arraysize(array) (sizeof(ArraySizeHelper(array))) - -namespace { - -const int signals_to_restore[] = {SIGHUP, SIGINT, SIGQUIT, SIGILL, SIGABRT, - SIGFPE, SIGSEGV, SIGALRM, SIGTERM, SIGCHLD, - SIGBUS, SIGTRAP, SIGPIPE}; - -struct sigaction signal_handlers[arraysize(signals_to_restore)]; - -} // namespace - -void BackupSignalHandlers() { - struct sigaction sigact; - for (unsigned i = 0; i < arraysize(signals_to_restore); ++i) { - memset(&sigact, 0, sizeof(sigact)); - sigaction(signals_to_restore[i], nullptr, &sigact); - signal_handlers[i] = sigact; - } -} - -void RestoreSignalHandlers() { - for (unsigned i = 0; i < arraysize(signals_to_restore); ++i) { - sigaction(signals_to_restore[i], &signal_handlers[i], nullptr); - } -} diff --git a/native/signal_restore_posix.h b/native/signal_restore_posix.h deleted file mode 100644 index 830b361a..00000000 --- a/native/signal_restore_posix.h +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright (c) 2014 The Chromium Embedded Framework Authors. All rights -// reserved. Use of this source code is governed by a BSD-style license that -// can be found in the LICENSE file. - -#ifndef SIGNAL_RESTORE_POSIX_H -#define SIGNAL_RESTORE_POSIX_H - -void BackupSignalHandlers(); -void RestoreSignalHandlers(); - -#endif // SIGNAL_RESTORE_POSIX_H From 612ae9fdec5525e4dba7f5e92cc3e9c2928bee19 Mon Sep 17 00:00:00 2001 From: Izuna Date: Sun, 1 Jun 2025 04:44:31 +0200 Subject: [PATCH 02/16] feat: accelerated paint --- java/org/cef/CefBrowserSettings.java | 34 +++++++++ java/org/cef/CefClient.java | 9 +++ java/org/cef/browser/CefBrowser.java | 9 +++ java/org/cef/browser/CefBrowserOsr.java | 5 ++ java/org/cef/browser/CefBrowser_N.java | 9 +++ .../cef/handler/CefAcceleratedPaintInfo.java | 43 ++++++++++++ .../cef/handler/CefOsrRendererSettings.java | 69 +++++++++++++++++++ java/org/cef/handler/CefRenderHandler.java | 11 +++ .../cef/handler/CefRenderHandlerAdapter.java | 16 +++++ native/CefBrowser_N.cpp | 26 ++++++- native/CefBrowser_N.h | 9 +++ native/render_handler.cpp | 42 ++++++++++- native/render_handler.h | 4 ++ 13 files changed, 284 insertions(+), 2 deletions(-) create mode 100644 java/org/cef/handler/CefAcceleratedPaintInfo.java create mode 100644 java/org/cef/handler/CefOsrRendererSettings.java diff --git a/java/org/cef/CefBrowserSettings.java b/java/org/cef/CefBrowserSettings.java index 8733a418..b1993195 100644 --- a/java/org/cef/CefBrowserSettings.java +++ b/java/org/cef/CefBrowserSettings.java @@ -4,6 +4,8 @@ package org.cef; +import org.cef.handler.CefOsrRendererSettings; + /** * Browser initialization settings. Specify NULL or 0 to get the recommended * default values. The consequences of using custom values may not be well @@ -20,12 +22,44 @@ public class CefBrowserSettings { */ public int windowless_frame_rate = 0; + /** + * Set to true to enable shared texture rendering. When enabled, the browser + * will render to a shared texture that can be accessed by the host application + * for hardware-accelerated compositing. This is supported on Windows via D3D11, + * macOS via Metal/OpenGL, and Linux via native buffers. + */ + public boolean shared_texture_enabled = false; + + /** + * Set to true to enable external begin frame scheduling. When enabled, the + * client must call CefBrowserHost::SendExternalBeginFrame to trigger frame + * rendering at the specified frame rate. + */ + public boolean external_begin_frame_enabled = false; + public CefBrowserSettings() {} + /** + * Apply OSR renderer settings to this browser settings object. + * This is a convenience method to configure off-screen rendering settings. + * + * @param osrSettings The OSR renderer settings to apply + */ + public void applyOsrSettings(CefOsrRendererSettings osrSettings) { + if (osrSettings != null) { + this.shared_texture_enabled = osrSettings.shared_texture_enabled; + this.external_begin_frame_enabled = osrSettings.external_begin_frame_enabled; + // Note: windowless_frame_rate can be set separately or via setWindowlessFrameRate() + // Note: background_color and other visual settings are typically handled in CefSettings + } + } + @Override public CefBrowserSettings clone() { CefBrowserSettings tmp = new CefBrowserSettings(); tmp.windowless_frame_rate = windowless_frame_rate; + tmp.shared_texture_enabled = shared_texture_enabled; + tmp.external_begin_frame_enabled = external_begin_frame_enabled; return tmp; } } diff --git a/java/org/cef/CefClient.java b/java/org/cef/CefClient.java index e3008c41..e693e00b 100644 --- a/java/org/cef/CefClient.java +++ b/java/org/cef/CefClient.java @@ -673,6 +673,15 @@ public void onPaint(CefBrowser browser, boolean popup, Rectangle[] dirtyRects, realHandler.onPaint(browser, popup, dirtyRects, buffer, width, height); } + @Override + public void onAcceleratedPaint(CefBrowser browser, boolean popup, Rectangle[] dirtyRects, CefAcceleratedPaintInfo info) { + if (browser == null) return; + + CefRenderHandler realHandler = browser.getRenderHandler(); + if (realHandler != null) + realHandler.onAcceleratedPaint(browser, popup, dirtyRects, info); + } + @Override public void addOnPaintListener(Consumer listener) {} diff --git a/java/org/cef/browser/CefBrowser.java b/java/org/cef/browser/CefBrowser.java index d9343120..6241ced7 100644 --- a/java/org/cef/browser/CefBrowser.java +++ b/java/org/cef/browser/CefBrowser.java @@ -396,6 +396,15 @@ public void runFileDialog(FileDialogMode mode, String title, String defaultFileP */ public void setWindowlessFrameRate(int frameRate); + /** + * Send an external begin frame to trigger frame rendering when external begin frame + * scheduling is enabled. This method should be called at the desired frame rate when + * CefBrowserSettings.external_begin_frame_enabled is set to true. + * + * @throws UnsupportedOperationException if not supported + */ + public void sendExternalBeginFrame(); + /** * Returns the maximum rate in frames per second (fps) that {@code CefRenderHandler::onPaint} * will be called for a windowless browser. The actual fps may be lower if the browser cannot diff --git a/java/org/cef/browser/CefBrowserOsr.java b/java/org/cef/browser/CefBrowserOsr.java index 2fd33b1b..442558b4 100644 --- a/java/org/cef/browser/CefBrowserOsr.java +++ b/java/org/cef/browser/CefBrowserOsr.java @@ -7,6 +7,7 @@ import org.cef.CefBrowserSettings; import org.cef.CefClient; import org.cef.callback.CefDragData; +import org.cef.handler.CefAcceleratedPaintInfo; import org.cef.handler.CefRenderHandler; import org.cef.handler.CefScreenInfo; @@ -107,6 +108,10 @@ public void removeOnPaintListener(Consumer listener) { public void onPaint(CefBrowser browser, boolean popup, Rectangle[] dirtyRects, ByteBuffer buffer, int width, int height) { } + @Override + public void onAcceleratedPaint(CefBrowser browser, boolean popup, Rectangle[] dirtyRects, CefAcceleratedPaintInfo info) { + } + @Override public boolean onCursorChange(CefBrowser browser, final int cursorType) { return true; diff --git a/java/org/cef/browser/CefBrowser_N.java b/java/org/cef/browser/CefBrowser_N.java index 72502f64..316bb822 100644 --- a/java/org/cef/browser/CefBrowser_N.java +++ b/java/org/cef/browser/CefBrowser_N.java @@ -771,6 +771,14 @@ public void setWindowlessFrameRate(int frameRate) { } } + public void sendExternalBeginFrame() { + try { + N_SendExternalBeginFrame(); + } catch (UnsatisfiedLinkError ule) { + ule.printStackTrace(); + } + } + public CompletableFuture getWindowlessFrameRate() { final CompletableFuture future = new CompletableFuture<>(); try { @@ -854,5 +862,6 @@ private final native void N_DragTargetDragEnter( private final native void N_SetParent(long windowHandle, Component canvas); private final native void N_NotifyMoveOrResizeStarted(); private final native void N_SetWindowlessFrameRate(int frameRate); + private final native void N_SendExternalBeginFrame(); private final native void N_GetWindowlessFrameRate(IntCallback frameRateCallback); } diff --git a/java/org/cef/handler/CefAcceleratedPaintInfo.java b/java/org/cef/handler/CefAcceleratedPaintInfo.java new file mode 100644 index 00000000..bd8aeedc --- /dev/null +++ b/java/org/cef/handler/CefAcceleratedPaintInfo.java @@ -0,0 +1,43 @@ +// Copyright (c) 2024 The Chromium Embedded Framework Authors. All rights +// reserved. Use of this source code is governed by a BSD-style license that +// can be found in the LICENSE file. + +package org.cef.handler; + +/** + * Structure representing shared texture info for accelerated painting. + */ +public class CefAcceleratedPaintInfo { + /** + * Shared texture handle. The meaning depends on the platform: + * - Windows: HANDLE to a texture that can be opened with D3D11 OpenSharedResource + * - macOS: IOSurface pointer that can be opened with Metal or OpenGL + * - Linux: Contains several planes, each with an fd to the underlying system native buffer + */ + public long shared_texture_handle = 0; + + /** + * Format of the shared texture. + */ + public int format = 0; + + /** + * Size information for the shared texture. + */ + public int width = 0; + public int height = 0; + + public CefAcceleratedPaintInfo() {} + + public CefAcceleratedPaintInfo(long shared_texture_handle, int format, int width, int height) { + this.shared_texture_handle = shared_texture_handle; + this.format = format; + this.width = width; + this.height = height; + } + + @Override + public CefAcceleratedPaintInfo clone() { + return new CefAcceleratedPaintInfo(shared_texture_handle, format, width, height); + } +} diff --git a/java/org/cef/handler/CefOsrRendererSettings.java b/java/org/cef/handler/CefOsrRendererSettings.java new file mode 100644 index 00000000..a417f03d --- /dev/null +++ b/java/org/cef/handler/CefOsrRendererSettings.java @@ -0,0 +1,69 @@ +// Copyright (c) 2024 The Chromium Embedded Framework Authors. All rights +// reserved. Use of this source code is governed by a BSD-style license that +// can be found in the LICENSE file. + +package org.cef.handler; + +/** + * Settings for off-screen rendering (OSR) configuration. + * Based on CEF's OsrRendererSettings structure. + */ +public class CefOsrRendererSettings { + + /** + * If true draw a border around update rectangles. + */ + public boolean show_update_rect = false; + + /** + * If true return real screen bounds from GetRootScreenRect/GetScreenInfo. + * - Allows window.outerWidth/Height and window.screenX/Y to return correct values. + * - Allows JavaScript window.moveTo/By() and window.resizeTo/By() to provide + * bounds that include the window frame. + * - Causes HTML select popups to be cropped (limitation of implementation). + */ + public boolean real_screen_bounds = true; + + /** + * Background color. Enables transparency if the alpha component is 0. + * 32-bit ARGB color value, not premultiplied. + */ + public int background_color = 0; + + /** + * Render using shared textures. Supported on Windows only via D3D11. + * When enabled, the browser will render to a shared texture that can be + * accessed by the host application for hardware-accelerated compositing. + */ + public boolean shared_texture_enabled = false; + + /** + * Client implements a BeginFrame timer by calling + * CefBrowserHost::SendExternalBeginFrame at the specified frame rate. + */ + public boolean external_begin_frame_enabled = false; + + /** + * Frame rate for external begin frame when external_begin_frame_enabled is true. + */ + public int begin_frame_rate = 0; + + public CefOsrRendererSettings() {} + + /** + * Copy constructor. + */ + public CefOsrRendererSettings(CefOsrRendererSettings other) { + this.show_update_rect = other.show_update_rect; + this.real_screen_bounds = other.real_screen_bounds; + this.background_color = other.background_color; + this.shared_texture_enabled = other.shared_texture_enabled; + this.external_begin_frame_enabled = other.external_begin_frame_enabled; + this.begin_frame_rate = other.begin_frame_rate; + } + + @Override + public CefOsrRendererSettings clone() { + return new CefOsrRendererSettings(this); + } +} diff --git a/java/org/cef/handler/CefRenderHandler.java b/java/org/cef/handler/CefRenderHandler.java index 258df884..68b5de6a 100644 --- a/java/org/cef/handler/CefRenderHandler.java +++ b/java/org/cef/handler/CefRenderHandler.java @@ -67,6 +67,17 @@ public interface CefRenderHandler { public void onPaint(CefBrowser browser, boolean popup, Rectangle[] dirtyRects, ByteBuffer buffer, int width, int height); + /** + * Called when an element has been rendered to the shared texture handle. + * This method is only called when CefWindowInfo::shared_texture_enabled is set to true. + * @param browser The browser generating the event. + * @param popup True if painting a popup window. + * @param dirtyRects Array of dirty regions. + * @param info Contains the shared handle and texture information. + */ + public void onAcceleratedPaint(CefBrowser browser, boolean popup, Rectangle[] dirtyRects, + CefAcceleratedPaintInfo info); + /** * Add provided listener. * @param listener Code that gets executed after a frame was rendered. diff --git a/java/org/cef/handler/CefRenderHandlerAdapter.java b/java/org/cef/handler/CefRenderHandlerAdapter.java index ea782830..6aa71185 100644 --- a/java/org/cef/handler/CefRenderHandlerAdapter.java +++ b/java/org/cef/handler/CefRenderHandlerAdapter.java @@ -5,11 +5,14 @@ package org.cef.handler; import org.cef.browser.CefBrowser; +import org.cef.browser.CefPaintEvent; import org.cef.callback.CefDragData; import java.awt.Point; import java.awt.Rectangle; import java.nio.ByteBuffer; +import java.util.function.Consumer; +import java.util.function.Consumer; /** * An abstract adapter class for receiving render events. @@ -42,6 +45,10 @@ public void onPopupSize(CefBrowser browser, Rectangle size) {} public void onPaint(CefBrowser browser, boolean popup, Rectangle[] dirtyRects, ByteBuffer buffer, int width, int height) {} + @Override + public void onAcceleratedPaint(CefBrowser browser, boolean popup, Rectangle[] dirtyRects, + CefAcceleratedPaintInfo info) {} + @Override public boolean onCursorChange(CefBrowser browser, int cursorType) { return false; @@ -54,4 +61,13 @@ public boolean startDragging(CefBrowser browser, CefDragData dragData, int mask, @Override public void updateDragCursor(CefBrowser browser, int operation) {} + + @Override + public void addOnPaintListener(Consumer listener) {} + + @Override + public void setOnPaintListener(Consumer listener) {} + + @Override + public void removeOnPaintListener(Consumer listener) {} } diff --git a/native/CefBrowser_N.cpp b/native/CefBrowser_N.cpp index 6d39d926..bb277341 100644 --- a/native/CefBrowser_N.cpp +++ b/native/CefBrowser_N.cpp @@ -575,7 +575,7 @@ KeyboardCode KeyboardCodeFromXKeysym(unsigned int keysym) { return VKEY_OEM_7; case XK_ISO_Level5_Shift: return VKEY_OEM_8; - case XK_Shift_L: + case XK_Shift_L: case XK_Shift_R: return VKEY_SHIFT; case XK_Control_L: @@ -1025,6 +1025,22 @@ void create(std::shared_ptr objs, objs->jbrowserSettings != nullptr) { // Dev-tools settings are null GetJNIFieldInt(env, cefBrowserSettings, objs->jbrowserSettings, "windowless_frame_rate", &settings.windowless_frame_rate); + + // Handle shared texture enabled setting + jboolean shared_texture_enabled = JNI_FALSE; + GetJNIFieldBoolean(env, cefBrowserSettings, objs->jbrowserSettings, + "shared_texture_enabled", &shared_texture_enabled); + if (shared_texture_enabled == JNI_TRUE) { + windowInfo.shared_texture_enabled = 1; + } + + // Handle external begin frame enabled setting + jboolean external_begin_frame_enabled = JNI_FALSE; + GetJNIFieldBoolean(env, cefBrowserSettings, objs->jbrowserSettings, + "external_begin_frame_enabled", &external_begin_frame_enabled); + if (external_begin_frame_enabled == JNI_TRUE) { + windowInfo.external_begin_frame_enabled = 1; + } } CefRefPtr browserObj; @@ -2160,6 +2176,14 @@ Java_org_cef_browser_CefBrowser_1N_N_1SetWindowlessFrameRate(JNIEnv* env, host->SetWindowlessFrameRate(frameRate); } +JNIEXPORT void JNICALL +Java_org_cef_browser_CefBrowser_1N_N_1SendExternalBeginFrame(JNIEnv* env, + jobject jbrowser) { + CefRefPtr browser = JNI_GET_BROWSER_OR_RETURN(env, jbrowser); + CefRefPtr host = browser->GetHost(); + host->SendExternalBeginFrame(); +} + void getWindowlessFrameRate(CefRefPtr host, CefRefPtr callback) { callback->onComplete((jint)host->GetWindowlessFrameRate()); diff --git a/native/CefBrowser_N.h b/native/CefBrowser_N.h index c2e4af9b..bda31b9d 100644 --- a/native/CefBrowser_N.h +++ b/native/CefBrowser_N.h @@ -571,6 +571,15 @@ Java_org_cef_browser_CefBrowser_1N_N_1GetWindowlessFrameRate(JNIEnv*, jobject, jobject); +/* + * Class: org_cef_browser_CefBrowser_N + * Method: N_SendExternalBeginFrame + * Signature: ()V + */ +JNIEXPORT void JNICALL +Java_org_cef_browser_CefBrowser_1N_N_1SendExternalBeginFrame(JNIEnv*, + jobject); + #ifdef __cplusplus } #endif diff --git a/native/render_handler.cpp b/native/render_handler.cpp index dee74281..eecf604b 100644 --- a/native/render_handler.cpp +++ b/native/render_handler.cpp @@ -9,7 +9,12 @@ namespace { -// Create a new java.awt.Rectangle. +// Create a // Set the fields of the paint info object + SetJNIFieldLong(env, cls, jpaintInfo, "shared_texture_handle", + static_cast(info.shared_texture_handle)); + SetJNIFieldInt(env, cls, jpaintInfo, "format", info.format); + SetJNIFieldInt(env, cls, jpaintInfo, "width", info.width); + SetJNIFieldInt(env, cls, jpaintInfo, "height", info.height);ava.awt.Rectangle. jobject NewJNIRect(JNIEnv* env, const CefRect& rect) { ScopedJNIClass cls(env, "java/awt/Rectangle"); if (!cls) @@ -270,6 +275,41 @@ void RenderHandler::OnPaint(CefRefPtr browser, jdirectBuffer.get(), width, height); } +void RenderHandler::OnAcceleratedPaint(CefRefPtr browser, + PaintElementType type, + const RectList& dirtyRects, + const CefAcceleratedPaintInfo& info) { + ScopedJNIEnv env; + if (!env) + return; + + ScopedJNIBrowser jbrowser(env, browser); + jboolean jtype = type == PET_VIEW ? JNI_FALSE : JNI_TRUE; + ScopedJNIObjectLocal jrectArray(env, NewJNIRectArray(env, dirtyRects)); + + // Create CefAcceleratedPaintInfo Java object + ScopedJNIClass cls(env, "org/cef/handler/CefAcceleratedPaintInfo"); + if (!cls) + return; + + ScopedJNIObjectLocal jpaintInfo(env, NewJNIObject(env, cls)); + if (!jpaintInfo) + return; + + // Set the fields of the paint info object + SetJNIFieldLong(env, cls, jpaintInfo, "shared_texture_handle", + static_cast(info.shared_texture_handle)); + SetJNIFieldInt(env, cls, jpaintInfo, "format", info.format); + SetJNIFieldInt(env, cls, jpaintInfo, "width", info.width); + SetJNIFieldInt(env, cls, jpaintInfo, "height", info.height); + + JNI_CALL_VOID_METHOD(env, handle_, "onAcceleratedPaint", + "(Lorg/cef/browser/CefBrowser;Z[Ljava/awt/" + "Rectangle;Lorg/cef/handler/CefAcceleratedPaintInfo;)V", + jbrowser.get(), jtype, jrectArray.get(), + jpaintInfo.get()); +} + bool RenderHandler::StartDragging(CefRefPtr browser, CefRefPtr drag_data, DragOperationsMask allowed_ops, diff --git a/native/render_handler.h b/native/render_handler.h index 27379d6e..55352392 100644 --- a/native/render_handler.h +++ b/native/render_handler.h @@ -40,6 +40,10 @@ class RenderHandler : public CefRenderHandler { const void* buffer, int width, int height) override; + virtual void OnAcceleratedPaint(CefRefPtr browser, + PaintElementType type, + const RectList& dirtyRects, + const CefAcceleratedPaintInfo& info) override; virtual bool StartDragging(CefRefPtr browser, CefRefPtr drag_data, DragOperationsMask allowed_ops, From ca2a5424727a0e2429bcf4aada7880540ece48c2 Mon Sep 17 00:00:00 2001 From: Izuna <1zuna@ccbluex.net> Date: Fri, 6 Jun 2025 19:45:33 +0200 Subject: [PATCH 03/16] Update build-jcef.yml --- .github/workflows/build-jcef.yml | 109 ------------------------------- 1 file changed, 109 deletions(-) diff --git a/.github/workflows/build-jcef.yml b/.github/workflows/build-jcef.yml index 83512b8c..e2679ebf 100644 --- a/.github/workflows/build-jcef.yml +++ b/.github/workflows/build-jcef.yml @@ -5,34 +5,6 @@ on: workflow_dispatch: jobs: - java-cef-linux: - runs-on: [ubuntu-20.04] - strategy: - matrix: - platform: [amd64, arm64] - steps: - - uses: actions/checkout@v4 - - name: Install deps and build - run: | - sudo apt update - sudo apt install build-essential g++ cmake ninja-build openjdk-17-jdk python3 libgtk2.0-dev -y - mkdir jcef_build && cd jcef_build - cmake -G "Ninja" -DPROJECT_ARCH=${{ matrix.platform }} -DCMAKE_BUILD_TYPE=Release .. - ninja -j4 - mv native/Release linux_${{ matrix.platform }} - strip linux_${{ matrix.platform }}/libcef.so - python3 ../.github/workflows/scripts/generate_hash.py linux_${{ matrix.platform }} - mv linux_${{ matrix.platform }}/.hash ./ - tar -czf linux_${{ matrix.platform }}.tar.gz linux_${{ matrix.platform }} .hash - sha256sum linux_${{ matrix.platform }}.tar.gz > linux_${{ matrix.platform }}.tar.gz.sha256 - - uses: actions/upload-artifact@v4 - if: ${{ github.ref == 'refs/heads/master' }} - with: - name: 'linux_${{ matrix.platform }}' - path: | - jcef_build/linux_${{ matrix.platform }}.tar.gz - jcef_build/linux_${{ matrix.platform }}.tar.gz.sha256 - if-no-files-found: error java-cef-windows: runs-on: [windows-2022] @@ -56,90 +28,9 @@ jobs: tar -czf windows_${{ matrix.platform }}.tar.gz windows_${{ matrix.platform }} .hash Get-FileHash -Algorithm SHA256 -Path "windows_${{ matrix.platform }}.tar.gz" | Out-File "windows_${{ matrix.platform }}.tar.gz.sha256" - uses: actions/upload-artifact@v4 - if: ${{ github.ref == 'refs/heads/master' }} with: name: 'windows_${{ matrix.platform }}' path: | jcef_build/windows_${{ matrix.platform }}.tar.gz jcef_build/windows_${{ matrix.platform }}.tar.gz.sha256 if-no-files-found: error - - java-cef-macos: - runs-on: [macos-13] - strategy: - matrix: - platform: [amd64, arm64] - steps: - - uses: actions/checkout@v4 - - name: Set up Python 3.9 - uses: actions/setup-python@v4 - with: - python-version: '3.9' - - run: | - brew install ninja - brew install coreutils - sudo xcode-select -s /Applications/Xcode.app - mkdir jcef_build && cd jcef_build - cmake -G "Ninja" -DPROJECT_ARCH=${{ matrix.platform }} -DCMAKE_BUILD_TYPE=Release .. - ninja -j4 - mv native/Release macos_${{ matrix.platform }} - python3 ../.github/workflows/scripts/generate_hash.py macos_${{ matrix.platform }} - mv macos_${{ matrix.platform }}/.hash ./ - tar -czf macos_${{ matrix.platform }}.tar.gz macos_${{ matrix.platform }} .hash - sha256sum macos_${{ matrix.platform }}.tar.gz > macos_${{ matrix.platform }}.tar.gz.sha256 - - uses: actions/upload-artifact@v4 - if: ${{ github.ref == 'refs/heads/master' }} - with: - name: 'macos_${{ matrix.platform }}' - path: | - jcef_build/macos_${{ matrix.platform }}.tar.gz - jcef_build/macos_${{ matrix.platform }}.tar.gz.sha256 - if-no-files-found: error - check-secret: - runs-on: ubuntu-20.04 - if: github.ref == 'refs/heads/master' - steps: - - name: Check secret - env: - API_TOKEN: ${{ secrets.API_TOKEN }} - run: | - if [ -z "$API_TOKEN" ]; then - echo "API_TOKEN is not set. Upload will not proceed." - exit 1 - fi - echo "API_TOKEN is set. Upload can proceed." - - upload-to-api: - needs: [java-cef-linux, java-cef-windows, java-cef-macos, check-secret] - runs-on: ubuntu-20.04 - if: github.ref == 'refs/heads/master' - strategy: - matrix: - platform: [linux_amd64, linux_arm64, windows_amd64, windows_arm64, macos_amd64, macos_arm64] - steps: - - name: Download artifact - uses: actions/download-artifact@v4 - with: - name: ${{ matrix.platform }} - - name: Upload to LiquidBounce API - env: - API_TOKEN: ${{ secrets.API_TOKEN }} - run: | - PLATFORM="${{ matrix.platform }}" - - response=$(curl -w "\n%{http_code}" -X POST \ - -H "Authorization: Bearer $API_TOKEN" \ - -H "Content-Type: application/gzip" \ - --data-binary "@${PLATFORM}.tar.gz" \ - "http://nossl.api.liquidbounce.net/api/v3/resource/mcef-cef/${{ github.sha }}/${PLATFORM}") - - status_code=$(echo "$response" | tail -n1) - response_body=$(echo "$response" | sed '$d') - - echo "Status code: $status_code" - echo "Response body: $response_body" - - if [ "$status_code" -lt 200 ] || [ "$status_code" -ge 300 ]; then - echo "Upload failed with status code $status_code" - exit 1 - fi From e3b4849f1d4a0e833bf3737938290e60490c23ca Mon Sep 17 00:00:00 2001 From: Izuna Seikatsu Date: Fri, 6 Jun 2025 22:02:39 +0200 Subject: [PATCH 04/16] fix: attemtp at fixing the use of GetJNIFieldBoolean --- native/CefBrowser_N.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/native/CefBrowser_N.cpp b/native/CefBrowser_N.cpp index 02be684d..98e67a01 100644 --- a/native/CefBrowser_N.cpp +++ b/native/CefBrowser_N.cpp @@ -1042,23 +1042,22 @@ void create(std::shared_ptr objs, ScopedJNIClass cefBrowserSettings(env, "org/cef/CefBrowserSettings"); if (cefBrowserSettings != nullptr && - objs->jbrowserSettings != nullptr) { // Dev-tools settings are null - GetJNIFieldInt(env, cefBrowserSettings, objs->jbrowserSettings, + objs->jbrowserSettings != nullptr) { // Dev-tools settings are null GetJNIFieldInt(env, cefBrowserSettings, objs->jbrowserSettings, "windowless_frame_rate", &settings.windowless_frame_rate); // Handle shared texture enabled setting - jboolean shared_texture_enabled = JNI_FALSE; + int shared_texture_enabled = 0; GetJNIFieldBoolean(env, cefBrowserSettings, objs->jbrowserSettings, "shared_texture_enabled", &shared_texture_enabled); - if (shared_texture_enabled == JNI_TRUE) { + if (shared_texture_enabled != 0) { windowInfo.shared_texture_enabled = 1; } // Handle external begin frame enabled setting - jboolean external_begin_frame_enabled = JNI_FALSE; + int external_begin_frame_enabled = 0; GetJNIFieldBoolean(env, cefBrowserSettings, objs->jbrowserSettings, "external_begin_frame_enabled", &external_begin_frame_enabled); - if (external_begin_frame_enabled == JNI_TRUE) { + if (external_begin_frame_enabled != 0) { windowInfo.external_begin_frame_enabled = 1; } } From 01c05cee7dce3b1d9d29398ed3d470af6a7232f0 Mon Sep 17 00:00:00 2001 From: Izuna Seikatsu Date: Fri, 6 Jun 2025 22:07:46 +0200 Subject: [PATCH 05/16] fix: holy bracket --- native/CefBrowser_N.cpp | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/native/CefBrowser_N.cpp b/native/CefBrowser_N.cpp index 98e67a01..bb27f65e 100644 --- a/native/CefBrowser_N.cpp +++ b/native/CefBrowser_N.cpp @@ -1039,27 +1039,27 @@ void create(std::shared_ptr objs, // Specify an opaque background color (white) to disable transparency. settings.background_color = CefColorSetARGB(255, 255, 255, 255); } - ScopedJNIClass cefBrowserSettings(env, "org/cef/CefBrowserSettings"); if (cefBrowserSettings != nullptr && - objs->jbrowserSettings != nullptr) { // Dev-tools settings are null GetJNIFieldInt(env, cefBrowserSettings, objs->jbrowserSettings, - "windowless_frame_rate", &settings.windowless_frame_rate); + objs->jbrowserSettings != nullptr) { // Dev-tools settings are null + GetJNIFieldInt(env, cefBrowserSettings, objs->jbrowserSettings, + "windowless_frame_rate", &settings.windowless_frame_rate); - // Handle shared texture enabled setting - int shared_texture_enabled = 0; - GetJNIFieldBoolean(env, cefBrowserSettings, objs->jbrowserSettings, - "shared_texture_enabled", &shared_texture_enabled); - if (shared_texture_enabled != 0) { - windowInfo.shared_texture_enabled = 1; - } + // Handle shared texture enabled setting + int shared_texture_enabled = 0; + GetJNIFieldBoolean(env, cefBrowserSettings, objs->jbrowserSettings, + "shared_texture_enabled", &shared_texture_enabled); + if (shared_texture_enabled != 0) { + windowInfo.shared_texture_enabled = 1; + } - // Handle external begin frame enabled setting - int external_begin_frame_enabled = 0; - GetJNIFieldBoolean(env, cefBrowserSettings, objs->jbrowserSettings, - "external_begin_frame_enabled", &external_begin_frame_enabled); - if (external_begin_frame_enabled != 0) { - windowInfo.external_begin_frame_enabled = 1; - } + // Handle external begin frame enabled setting + int external_begin_frame_enabled = 0; + GetJNIFieldBoolean(env, cefBrowserSettings, objs->jbrowserSettings, + "external_begin_frame_enabled", &external_begin_frame_enabled); + if (external_begin_frame_enabled != 0) { + windowInfo.external_begin_frame_enabled = 1; + } } CefRefPtr browserObj; From 28ef9f358f334324e29a64cf6d9d2506264748e4 Mon Sep 17 00:00:00 2001 From: Izuna Seikatsu Date: Fri, 6 Jun 2025 22:19:10 +0200 Subject: [PATCH 06/16] fix: use correct paint info See https://cef-builds.spotifycdn.com/docs/125.0/classCefAcceleratedPaintInfo.html --- native/render_handler.cpp | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/native/render_handler.cpp b/native/render_handler.cpp index eecf604b..2f62c2c0 100644 --- a/native/render_handler.cpp +++ b/native/render_handler.cpp @@ -9,12 +9,7 @@ namespace { -// Create a // Set the fields of the paint info object - SetJNIFieldLong(env, cls, jpaintInfo, "shared_texture_handle", - static_cast(info.shared_texture_handle)); - SetJNIFieldInt(env, cls, jpaintInfo, "format", info.format); - SetJNIFieldInt(env, cls, jpaintInfo, "width", info.width); - SetJNIFieldInt(env, cls, jpaintInfo, "height", info.height);ava.awt.Rectangle. +// Create a java.awt.Rectangle. jobject NewJNIRect(JNIEnv* env, const CefRect& rect) { ScopedJNIClass cls(env, "java/awt/Rectangle"); if (!cls) @@ -291,17 +286,20 @@ void RenderHandler::OnAcceleratedPaint(CefRefPtr browser, ScopedJNIClass cls(env, "org/cef/handler/CefAcceleratedPaintInfo"); if (!cls) return; - ScopedJNIObjectLocal jpaintInfo(env, NewJNIObject(env, cls)); if (!jpaintInfo) return; + // Get view rect to determine width and height + CefRect viewRect; + GetViewRect(browser, viewRect); + // Set the fields of the paint info object SetJNIFieldLong(env, cls, jpaintInfo, "shared_texture_handle", - static_cast(info.shared_texture_handle)); + reinterpret_cast(info.shared_texture_handle)); SetJNIFieldInt(env, cls, jpaintInfo, "format", info.format); - SetJNIFieldInt(env, cls, jpaintInfo, "width", info.width); - SetJNIFieldInt(env, cls, jpaintInfo, "height", info.height); + SetJNIFieldInt(env, cls, jpaintInfo, "width", viewRect.width); + SetJNIFieldInt(env, cls, jpaintInfo, "height", viewRect.height); JNI_CALL_VOID_METHOD(env, handle_, "onAcceleratedPaint", "(Lorg/cef/browser/CefBrowser;Z[Ljava/awt/" From 95ddb12c2b15eaf5cf4004061bda0fcc06131151 Mon Sep 17 00:00:00 2001 From: Izuna Seikatsu Date: Fri, 6 Jun 2025 22:25:30 +0200 Subject: [PATCH 07/16] feat: support for SetJNIFieldLong --- native/jni_util.cpp | 14 ++++++++++++++ native/jni_util.h | 5 +++++ 2 files changed, 19 insertions(+) diff --git a/native/jni_util.cpp b/native/jni_util.cpp index 4bee5978..0134be54 100644 --- a/native/jni_util.cpp +++ b/native/jni_util.cpp @@ -894,6 +894,20 @@ bool SetJNIFieldBoolean(JNIEnv* env, return false; } +bool SetJNIFieldLong(JNIEnv* env, + jclass cls, + jobject obj, + const char* field_name, + jlong value) { + jfieldID field = env->GetFieldID(cls, field_name, "J"); + if (field) { + env->SetLongField(obj, field, value); + return true; + } + env->ExceptionClear(); + return false; +} + bool GetJNIFieldStaticInt(JNIEnv* env, jclass cls, const char* field_name, diff --git a/native/jni_util.h b/native/jni_util.h index 4b78b3f3..306b2001 100644 --- a/native/jni_util.h +++ b/native/jni_util.h @@ -148,6 +148,11 @@ bool SetJNIFieldBoolean(JNIEnv* env, jobject obj, const char* field_name, int value); +bool SetJNIFieldLong(JNIEnv* env, + jclass cls, + jobject obj, + const char* field_name, + jlong value); // Retrieve the static int value stored in the |field_name| field of |cls|. bool GetJNIFieldStaticInt(JNIEnv* env, From 821fba4101f0f670f6e7f273a7f75458fe5aaf8b Mon Sep 17 00:00:00 2001 From: Izuna Seikatsu Date: Fri, 6 Jun 2025 22:39:43 +0200 Subject: [PATCH 08/16] feat: debugging accelerated paint --- native/CefBrowser_N.cpp | 39 +++++++++++++++++++++++++++++++++------ native/render_handler.cpp | 28 ++++++++++++++++++++++++++-- 2 files changed, 59 insertions(+), 8 deletions(-) diff --git a/native/CefBrowser_N.cpp b/native/CefBrowser_N.cpp index bb27f65e..90d93451 100644 --- a/native/CefBrowser_N.cpp +++ b/native/CefBrowser_N.cpp @@ -1038,8 +1038,7 @@ void create(std::shared_ptr objs, if (transparent == JNI_FALSE) { // Specify an opaque background color (white) to disable transparency. settings.background_color = CefColorSetARGB(255, 255, 255, 255); - } - ScopedJNIClass cefBrowserSettings(env, "org/cef/CefBrowserSettings"); + } ScopedJNIClass cefBrowserSettings(env, "org/cef/CefBrowserSettings"); if (cefBrowserSettings != nullptr && objs->jbrowserSettings != nullptr) { // Dev-tools settings are null GetJNIFieldInt(env, cefBrowserSettings, objs->jbrowserSettings, @@ -1047,19 +1046,47 @@ void create(std::shared_ptr objs, // Handle shared texture enabled setting int shared_texture_enabled = 0; - GetJNIFieldBoolean(env, cefBrowserSettings, objs->jbrowserSettings, - "shared_texture_enabled", &shared_texture_enabled); + bool got_shared_texture = GetJNIFieldBoolean(env, cefBrowserSettings, objs->jbrowserSettings, + "shared_texture_enabled", &shared_texture_enabled); + + // Debug output for shared texture configuration + printf("[DEBUG] Shared Texture Config:\n"); + printf(" - Field retrieval success: %s\n", got_shared_texture ? "YES" : "NO"); + printf(" - Field value: %d\n", shared_texture_enabled); + if (shared_texture_enabled != 0) { windowInfo.shared_texture_enabled = 1; + printf(" - Window shared_texture_enabled set to: 1\n"); + } else { + printf(" - Window shared_texture_enabled remains: 0\n"); } // Handle external begin frame enabled setting int external_begin_frame_enabled = 0; - GetJNIFieldBoolean(env, cefBrowserSettings, objs->jbrowserSettings, - "external_begin_frame_enabled", &external_begin_frame_enabled); + bool got_external_begin_frame = GetJNIFieldBoolean(env, cefBrowserSettings, objs->jbrowserSettings, + "external_begin_frame_enabled", &external_begin_frame_enabled); + + // Debug output for external begin frame configuration + printf("[DEBUG] External Begin Frame Config:\n"); + printf(" - Field retrieval success: %s\n", got_external_begin_frame ? "YES" : "NO"); + printf(" - Field value: %d\n", external_begin_frame_enabled); + if (external_begin_frame_enabled != 0) { windowInfo.external_begin_frame_enabled = 1; + printf(" - Window external_begin_frame_enabled set to: 1\n"); + } else { + printf(" - Window external_begin_frame_enabled remains: 0\n"); } + + // Additional debug info + printf("[DEBUG] Final WindowInfo Configuration:\n"); + printf(" - shared_texture_enabled: %d\n", windowInfo.shared_texture_enabled); + printf(" - external_begin_frame_enabled: %d\n", windowInfo.external_begin_frame_enabled); + printf(" - windowless_frame_rate: %d\n", settings.windowless_frame_rate); + } else { + printf("[DEBUG] Browser settings not available - using defaults\n"); + printf(" - cefBrowserSettings: %p\n", cefBrowserSettings.get()); + printf(" - jbrowserSettings: %p\n", objs->jbrowserSettings); } CefRefPtr browserObj; diff --git a/native/render_handler.cpp b/native/render_handler.cpp index 2f62c2c0..dad5b467 100644 --- a/native/render_handler.cpp +++ b/native/render_handler.cpp @@ -253,6 +253,13 @@ void RenderHandler::OnPaint(CefRefPtr browser, const void* buffer, int width, int height) { + // Debug output for regular paint calls + printf("[DEBUG] OnPaint (regular) called:\n"); + printf(" - Type: %s\n", type == PET_VIEW ? "VIEW" : "POPUP"); + printf(" - Dirty rects count: %zu\n", dirtyRects.size()); + printf(" - Buffer: %p\n", buffer); + printf(" - Width: %d, Height: %d\n", width, height); + ScopedJNIEnv env; if (!env) return; @@ -268,12 +275,21 @@ void RenderHandler::OnPaint(CefRefPtr browser, "Rectangle;Ljava/nio/ByteBuffer;II)V", jbrowser.get(), jtype, jrectArray.get(), jdirectBuffer.get(), width, height); + + printf("[DEBUG] OnPaint (regular) completed\n"); } void RenderHandler::OnAcceleratedPaint(CefRefPtr browser, PaintElementType type, const RectList& dirtyRects, const CefAcceleratedPaintInfo& info) { + // Debug output for accelerated paint calls + printf("[DEBUG] OnAcceleratedPaint called:\n"); + printf(" - Type: %s\n", type == PET_VIEW ? "VIEW" : "POPUP"); + printf(" - Dirty rects count: %zu\n", dirtyRects.size()); + printf(" - Shared texture handle: 0x%llx\n", reinterpret_cast(info.shared_texture_handle)); + printf(" - Format: %d\n", info.format); + ScopedJNIEnv env; if (!env) return; @@ -294,18 +310,26 @@ void RenderHandler::OnAcceleratedPaint(CefRefPtr browser, CefRect viewRect; GetViewRect(browser, viewRect); - // Set the fields of the paint info object - SetJNIFieldLong(env, cls, jpaintInfo, "shared_texture_handle", + // Set the fields of the paint info object SetJNIFieldLong(env, cls, jpaintInfo, "shared_texture_handle", reinterpret_cast(info.shared_texture_handle)); SetJNIFieldInt(env, cls, jpaintInfo, "format", info.format); SetJNIFieldInt(env, cls, jpaintInfo, "width", viewRect.width); SetJNIFieldInt(env, cls, jpaintInfo, "height", viewRect.height); + // Debug output for Java object values + printf("[DEBUG] Sending to Java:\n"); + printf(" - shared_texture_handle: 0x%llx\n", reinterpret_cast(info.shared_texture_handle)); + printf(" - format: %d\n", info.format); + printf(" - width: %d (from viewRect)\n", viewRect.width); + printf(" - height: %d (from viewRect)\n", viewRect.height); + JNI_CALL_VOID_METHOD(env, handle_, "onAcceleratedPaint", "(Lorg/cef/browser/CefBrowser;Z[Ljava/awt/" "Rectangle;Lorg/cef/handler/CefAcceleratedPaintInfo;)V", jbrowser.get(), jtype, jrectArray.get(), jpaintInfo.get()); + + printf("[DEBUG] OnAcceleratedPaint completed\n"); } bool RenderHandler::StartDragging(CefRefPtr browser, From fe17b2c93dfd8d631d97ab8bcf0a83815aa352ea Mon Sep 17 00:00:00 2001 From: Izuna Seikatsu Date: Fri, 6 Jun 2025 22:45:58 +0200 Subject: [PATCH 09/16] fix: holy void pointer cast --- native/CefBrowser_N.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/native/CefBrowser_N.cpp b/native/CefBrowser_N.cpp index 90d93451..be46bb6e 100644 --- a/native/CefBrowser_N.cpp +++ b/native/CefBrowser_N.cpp @@ -1085,8 +1085,8 @@ void create(std::shared_ptr objs, printf(" - windowless_frame_rate: %d\n", settings.windowless_frame_rate); } else { printf("[DEBUG] Browser settings not available - using defaults\n"); - printf(" - cefBrowserSettings: %p\n", cefBrowserSettings.get()); - printf(" - jbrowserSettings: %p\n", objs->jbrowserSettings); + printf(" - cefBrowserSettings: %p\n", (void*)cefBrowserSettings.get()); + printf(" - jbrowserSettings: %p\n", (void*)objs->jbrowserSettings); } CefRefPtr browserObj; From 4733ffa38e67945fb0bd1140117c4bae7dedd9a2 Mon Sep 17 00:00:00 2001 From: Izuna Seikatsu Date: Fri, 6 Jun 2025 22:51:57 +0200 Subject: [PATCH 10/16] fix: blame me --- native/render_handler.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/native/render_handler.cpp b/native/render_handler.cpp index dad5b467..7b2156a4 100644 --- a/native/render_handler.cpp +++ b/native/render_handler.cpp @@ -309,8 +309,8 @@ void RenderHandler::OnAcceleratedPaint(CefRefPtr browser, // Get view rect to determine width and height CefRect viewRect; GetViewRect(browser, viewRect); - - // Set the fields of the paint info object SetJNIFieldLong(env, cls, jpaintInfo, "shared_texture_handle", + // Set the fields of the paint info object + SetJNIFieldLong(env, cls, jpaintInfo, "shared_texture_handle", reinterpret_cast(info.shared_texture_handle)); SetJNIFieldInt(env, cls, jpaintInfo, "format", info.format); SetJNIFieldInt(env, cls, jpaintInfo, "width", viewRect.width); From fdacfb7296a9c797cb0e51801e0d85622fe0b3ef Mon Sep 17 00:00:00 2001 From: Izuna Seikatsu Date: Fri, 6 Jun 2025 23:26:42 +0200 Subject: [PATCH 11/16] temp: hard code texture sharing --- native/CefBrowser_N.cpp | 59 ++++++++++++++++++++++------------------- 1 file changed, 32 insertions(+), 27 deletions(-) diff --git a/native/CefBrowser_N.cpp b/native/CefBrowser_N.cpp index be46bb6e..4c9e8882 100644 --- a/native/CefBrowser_N.cpp +++ b/native/CefBrowser_N.cpp @@ -1045,38 +1045,43 @@ void create(std::shared_ptr objs, "windowless_frame_rate", &settings.windowless_frame_rate); // Handle shared texture enabled setting - int shared_texture_enabled = 0; - bool got_shared_texture = GetJNIFieldBoolean(env, cefBrowserSettings, objs->jbrowserSettings, - "shared_texture_enabled", &shared_texture_enabled); + // int shared_texture_enabled = 0; + // bool got_shared_texture = GetJNIFieldBoolean(env, cefBrowserSettings, objs->jbrowserSettings, + // "shared_texture_enabled", &shared_texture_enabled); - // Debug output for shared texture configuration - printf("[DEBUG] Shared Texture Config:\n"); - printf(" - Field retrieval success: %s\n", got_shared_texture ? "YES" : "NO"); - printf(" - Field value: %d\n", shared_texture_enabled); + // // Debug output for shared texture configuration + // printf("[DEBUG] Shared Texture Config:\n"); + // printf(" - Field retrieval success: %s\n", got_shared_texture ? "YES" : "NO"); + // printf(" - Field value: %d\n", shared_texture_enabled); - if (shared_texture_enabled != 0) { - windowInfo.shared_texture_enabled = 1; - printf(" - Window shared_texture_enabled set to: 1\n"); - } else { - printf(" - Window shared_texture_enabled remains: 0\n"); - } - + // if (shared_texture_enabled != 0) { + // windowInfo.shared_texture_enabled = 1; + // printf(" - Window shared_texture_enabled set to: 1\n"); + // } else { + // printf(" - Window shared_texture_enabled remains: 0\n"); + // } + // TODO: Fix JNIFieldBoolean get for shared_texture_enabled + windowInfo.shared_texture_enabled = 1; + // Handle external begin frame enabled setting - int external_begin_frame_enabled = 0; - bool got_external_begin_frame = GetJNIFieldBoolean(env, cefBrowserSettings, objs->jbrowserSettings, - "external_begin_frame_enabled", &external_begin_frame_enabled); + // int external_begin_frame_enabled = 0; + // bool got_external_begin_frame = GetJNIFieldBoolean(env, cefBrowserSettings, objs->jbrowserSettings, + // "external_begin_frame_enabled", &external_begin_frame_enabled); - // Debug output for external begin frame configuration - printf("[DEBUG] External Begin Frame Config:\n"); - printf(" - Field retrieval success: %s\n", got_external_begin_frame ? "YES" : "NO"); - printf(" - Field value: %d\n", external_begin_frame_enabled); + // // Debug output for external begin frame configuration + // printf("[DEBUG] External Begin Frame Config:\n"); + // printf(" - Field retrieval success: %s\n", got_external_begin_frame ? "YES" : "NO"); + // printf(" - Field value: %d\n", external_begin_frame_enabled); - if (external_begin_frame_enabled != 0) { - windowInfo.external_begin_frame_enabled = 1; - printf(" - Window external_begin_frame_enabled set to: 1\n"); - } else { - printf(" - Window external_begin_frame_enabled remains: 0\n"); - } + // if (external_begin_frame_enabled != 0) { + // windowInfo.external_begin_frame_enabled = 1; + // printf(" - Window external_begin_frame_enabled set to: 1\n"); + // } else { + // printf(" - Window external_begin_frame_enabled remains: 0\n"); + // } + + // TODO: Fix JNIFieldBoolean get for external_begin_frame_enabled + // windowInfo.external_begin_frame_enabled = 1; // Additional debug info printf("[DEBUG] Final WindowInfo Configuration:\n"); From 251c7aa62c4f0b3d2d719013416d01863665a02e Mon Sep 17 00:00:00 2001 From: Izuna Date: Thu, 26 Jun 2025 01:35:29 +0200 Subject: [PATCH 12/16] wip: try building on linux and macOS --- .github/workflows/build-jcef.yml | 108 +++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) diff --git a/.github/workflows/build-jcef.yml b/.github/workflows/build-jcef.yml index e2679ebf..84cdfcd3 100644 --- a/.github/workflows/build-jcef.yml +++ b/.github/workflows/build-jcef.yml @@ -6,6 +6,35 @@ on: jobs: + java-cef-linux: + runs-on: [ubuntu-22.04] + strategy: + matrix: + platform: [amd64, arm64] + steps: + - uses: actions/checkout@v4 + - name: Install deps and build + run: | + sudo apt update + sudo apt install build-essential g++ cmake ninja-build openjdk-17-jdk python3 libgtk2.0-dev -y + mkdir jcef_build && cd jcef_build + cmake -G "Ninja" -DPROJECT_ARCH=${{ matrix.platform }} -DCMAKE_BUILD_TYPE=Release .. + ninja -j4 + mv native/Release linux_${{ matrix.platform }} + strip linux_${{ matrix.platform }}/libcef.so + python3 ../.github/workflows/scripts/generate_hash.py linux_${{ matrix.platform }} + mv linux_${{ matrix.platform }}/.hash ./ + tar -czf linux_${{ matrix.platform }}.tar.gz linux_${{ matrix.platform }} .hash + sha256sum linux_${{ matrix.platform }}.tar.gz > linux_${{ matrix.platform }}.tar.gz.sha256 + - uses: actions/upload-artifact@v4 + if: ${{ github.ref == 'refs/heads/master' }} + with: + name: 'linux_${{ matrix.platform }}' + path: | + jcef_build/linux_${{ matrix.platform }}.tar.gz + jcef_build/linux_${{ matrix.platform }}.tar.gz.sha256 + if-no-files-found: error + java-cef-windows: runs-on: [windows-2022] strategy: @@ -34,3 +63,82 @@ jobs: jcef_build/windows_${{ matrix.platform }}.tar.gz jcef_build/windows_${{ matrix.platform }}.tar.gz.sha256 if-no-files-found: error + + java-cef-macos: + runs-on: [macos-13] + strategy: + matrix: + platform: [amd64, arm64] + steps: + - uses: actions/checkout@v4 + - name: Set up Python 3.9 + uses: actions/setup-python@v4 + with: + python-version: '3.9' + - run: | + brew install ninja + brew install coreutils + sudo xcode-select -s /Applications/Xcode.app + mkdir jcef_build && cd jcef_build + cmake -G "Ninja" -DPROJECT_ARCH=${{ matrix.platform }} -DCMAKE_BUILD_TYPE=Release .. + ninja -j4 + mv native/Release macos_${{ matrix.platform }} + python3 ../.github/workflows/scripts/generate_hash.py macos_${{ matrix.platform }} + mv macos_${{ matrix.platform }}/.hash ./ + tar -czf macos_${{ matrix.platform }}.tar.gz macos_${{ matrix.platform }} .hash + sha256sum macos_${{ matrix.platform }}.tar.gz > macos_${{ matrix.platform }}.tar.gz.sha256 + - uses: actions/upload-artifact@v4 + if: ${{ github.ref == 'refs/heads/master' }} + with: + name: 'macos_${{ matrix.platform }}' + path: | + jcef_build/macos_${{ matrix.platform }}.tar.gz + jcef_build/macos_${{ matrix.platform }}.tar.gz.sha256 + if-no-files-found: error + check-secret: + runs-on: ubuntu-22.04 + if: github.ref == 'refs/heads/master' + steps: + - name: Check secret + env: + API_TOKEN: ${{ secrets.API_TOKEN }} + run: | + if [ -z "$API_TOKEN" ]; then + echo "API_TOKEN is not set. Upload will not proceed." + exit 1 + fi + echo "API_TOKEN is set. Upload can proceed." + upload-to-api: + needs: [java-cef-linux, java-cef-windows, java-cef-macos, check-secret] + runs-on: ubuntu-22.04 + if: github.ref == 'refs/heads/master' + strategy: + matrix: + platform: [linux_amd64, linux_arm64, windows_amd64, windows_arm64, macos_amd64, macos_arm64] + steps: + - name: Download artifact + uses: actions/download-artifact@v4 + with: + name: ${{ matrix.platform }} + - name: Upload to LiquidBounce API + env: + API_TOKEN: ${{ secrets.API_TOKEN }} + run: | + PLATFORM="${{ matrix.platform }}" + + response=$(curl -w "\n%{http_code}" -X POST \ + -H "Authorization: Bearer $API_TOKEN" \ + -H "Content-Type: application/gzip" \ + --data-binary "@${PLATFORM}.tar.gz" \ + "http://nossl.api.liquidbounce.net/api/v3/resource/mcef-cef/${{ github.sha }}/${PLATFORM}") + + status_code=$(echo "$response" | tail -n1) + response_body=$(echo "$response" | sed '$d') + + echo "Status code: $status_code" + echo "Response body: $response_body" + + if [ "$status_code" -lt 200 ] || [ "$status_code" -ge 300 ]; then + echo "Upload failed with status code $status_code" + exit 1 + fi From 9225a3aeac70c9bb37b417a3784ef56c37a7a77f Mon Sep 17 00:00:00 2001 From: Izuna Seikatsu Date: Thu, 26 Jun 2025 01:50:00 +0200 Subject: [PATCH 13/16] fix: unix compile --- native/render_handler.cpp | 30 +++++------------------------- 1 file changed, 5 insertions(+), 25 deletions(-) diff --git a/native/render_handler.cpp b/native/render_handler.cpp index 7b2156a4..c2e28114 100644 --- a/native/render_handler.cpp +++ b/native/render_handler.cpp @@ -253,13 +253,6 @@ void RenderHandler::OnPaint(CefRefPtr browser, const void* buffer, int width, int height) { - // Debug output for regular paint calls - printf("[DEBUG] OnPaint (regular) called:\n"); - printf(" - Type: %s\n", type == PET_VIEW ? "VIEW" : "POPUP"); - printf(" - Dirty rects count: %zu\n", dirtyRects.size()); - printf(" - Buffer: %p\n", buffer); - printf(" - Width: %d, Height: %d\n", width, height); - ScopedJNIEnv env; if (!env) return; @@ -275,21 +268,12 @@ void RenderHandler::OnPaint(CefRefPtr browser, "Rectangle;Ljava/nio/ByteBuffer;II)V", jbrowser.get(), jtype, jrectArray.get(), jdirectBuffer.get(), width, height); - - printf("[DEBUG] OnPaint (regular) completed\n"); } void RenderHandler::OnAcceleratedPaint(CefRefPtr browser, PaintElementType type, const RectList& dirtyRects, const CefAcceleratedPaintInfo& info) { - // Debug output for accelerated paint calls - printf("[DEBUG] OnAcceleratedPaint called:\n"); - printf(" - Type: %s\n", type == PET_VIEW ? "VIEW" : "POPUP"); - printf(" - Dirty rects count: %zu\n", dirtyRects.size()); - printf(" - Shared texture handle: 0x%llx\n", reinterpret_cast(info.shared_texture_handle)); - printf(" - Format: %d\n", info.format); - ScopedJNIEnv env; if (!env) return; @@ -310,26 +294,22 @@ void RenderHandler::OnAcceleratedPaint(CefRefPtr browser, CefRect viewRect; GetViewRect(browser, viewRect); // Set the fields of the paint info object +#if defined(OS_WIN) SetJNIFieldLong(env, cls, jpaintInfo, "shared_texture_handle", reinterpret_cast(info.shared_texture_handle)); +#else + // On non-Windows platforms, shared_texture_handle is not available + SetJNIFieldLong(env, cls, jpaintInfo, "shared_texture_handle", 0); +#endif SetJNIFieldInt(env, cls, jpaintInfo, "format", info.format); SetJNIFieldInt(env, cls, jpaintInfo, "width", viewRect.width); SetJNIFieldInt(env, cls, jpaintInfo, "height", viewRect.height); - // Debug output for Java object values - printf("[DEBUG] Sending to Java:\n"); - printf(" - shared_texture_handle: 0x%llx\n", reinterpret_cast(info.shared_texture_handle)); - printf(" - format: %d\n", info.format); - printf(" - width: %d (from viewRect)\n", viewRect.width); - printf(" - height: %d (from viewRect)\n", viewRect.height); - JNI_CALL_VOID_METHOD(env, handle_, "onAcceleratedPaint", "(Lorg/cef/browser/CefBrowser;Z[Ljava/awt/" "Rectangle;Lorg/cef/handler/CefAcceleratedPaintInfo;)V", jbrowser.get(), jtype, jrectArray.get(), jpaintInfo.get()); - - printf("[DEBUG] OnAcceleratedPaint completed\n"); } bool RenderHandler::StartDragging(CefRefPtr browser, From 5ec98fd4fbe5942378238eea7c97bf7dd412b830 Mon Sep 17 00:00:00 2001 From: Izuna Seikatsu Date: Thu, 26 Jun 2025 01:52:19 +0200 Subject: [PATCH 14/16] Revert "temp: hard code texture sharing" This reverts commit fdacfb7296a9c797cb0e51801e0d85622fe0b3ef. --- native/CefBrowser_N.cpp | 59 +++++++++++++++++++---------------------- 1 file changed, 27 insertions(+), 32 deletions(-) diff --git a/native/CefBrowser_N.cpp b/native/CefBrowser_N.cpp index 4c9e8882..be46bb6e 100644 --- a/native/CefBrowser_N.cpp +++ b/native/CefBrowser_N.cpp @@ -1045,43 +1045,38 @@ void create(std::shared_ptr objs, "windowless_frame_rate", &settings.windowless_frame_rate); // Handle shared texture enabled setting - // int shared_texture_enabled = 0; - // bool got_shared_texture = GetJNIFieldBoolean(env, cefBrowserSettings, objs->jbrowserSettings, - // "shared_texture_enabled", &shared_texture_enabled); + int shared_texture_enabled = 0; + bool got_shared_texture = GetJNIFieldBoolean(env, cefBrowserSettings, objs->jbrowserSettings, + "shared_texture_enabled", &shared_texture_enabled); - // // Debug output for shared texture configuration - // printf("[DEBUG] Shared Texture Config:\n"); - // printf(" - Field retrieval success: %s\n", got_shared_texture ? "YES" : "NO"); - // printf(" - Field value: %d\n", shared_texture_enabled); + // Debug output for shared texture configuration + printf("[DEBUG] Shared Texture Config:\n"); + printf(" - Field retrieval success: %s\n", got_shared_texture ? "YES" : "NO"); + printf(" - Field value: %d\n", shared_texture_enabled); - // if (shared_texture_enabled != 0) { - // windowInfo.shared_texture_enabled = 1; - // printf(" - Window shared_texture_enabled set to: 1\n"); - // } else { - // printf(" - Window shared_texture_enabled remains: 0\n"); - // } - // TODO: Fix JNIFieldBoolean get for shared_texture_enabled - windowInfo.shared_texture_enabled = 1; - + if (shared_texture_enabled != 0) { + windowInfo.shared_texture_enabled = 1; + printf(" - Window shared_texture_enabled set to: 1\n"); + } else { + printf(" - Window shared_texture_enabled remains: 0\n"); + } + // Handle external begin frame enabled setting - // int external_begin_frame_enabled = 0; - // bool got_external_begin_frame = GetJNIFieldBoolean(env, cefBrowserSettings, objs->jbrowserSettings, - // "external_begin_frame_enabled", &external_begin_frame_enabled); + int external_begin_frame_enabled = 0; + bool got_external_begin_frame = GetJNIFieldBoolean(env, cefBrowserSettings, objs->jbrowserSettings, + "external_begin_frame_enabled", &external_begin_frame_enabled); - // // Debug output for external begin frame configuration - // printf("[DEBUG] External Begin Frame Config:\n"); - // printf(" - Field retrieval success: %s\n", got_external_begin_frame ? "YES" : "NO"); - // printf(" - Field value: %d\n", external_begin_frame_enabled); + // Debug output for external begin frame configuration + printf("[DEBUG] External Begin Frame Config:\n"); + printf(" - Field retrieval success: %s\n", got_external_begin_frame ? "YES" : "NO"); + printf(" - Field value: %d\n", external_begin_frame_enabled); - // if (external_begin_frame_enabled != 0) { - // windowInfo.external_begin_frame_enabled = 1; - // printf(" - Window external_begin_frame_enabled set to: 1\n"); - // } else { - // printf(" - Window external_begin_frame_enabled remains: 0\n"); - // } - - // TODO: Fix JNIFieldBoolean get for external_begin_frame_enabled - // windowInfo.external_begin_frame_enabled = 1; + if (external_begin_frame_enabled != 0) { + windowInfo.external_begin_frame_enabled = 1; + printf(" - Window external_begin_frame_enabled set to: 1\n"); + } else { + printf(" - Window external_begin_frame_enabled remains: 0\n"); + } // Additional debug info printf("[DEBUG] Final WindowInfo Configuration:\n"); From e02720409a4c0856fdfafe112511a38106cec5aa Mon Sep 17 00:00:00 2001 From: Izuna Seikatsu Date: Thu, 26 Jun 2025 01:59:41 +0200 Subject: [PATCH 15/16] no debugging required --- native/CefBrowser_N.cpp | 26 -------------------------- 1 file changed, 26 deletions(-) diff --git a/native/CefBrowser_N.cpp b/native/CefBrowser_N.cpp index be46bb6e..77177363 100644 --- a/native/CefBrowser_N.cpp +++ b/native/CefBrowser_N.cpp @@ -1049,16 +1049,8 @@ void create(std::shared_ptr objs, bool got_shared_texture = GetJNIFieldBoolean(env, cefBrowserSettings, objs->jbrowserSettings, "shared_texture_enabled", &shared_texture_enabled); - // Debug output for shared texture configuration - printf("[DEBUG] Shared Texture Config:\n"); - printf(" - Field retrieval success: %s\n", got_shared_texture ? "YES" : "NO"); - printf(" - Field value: %d\n", shared_texture_enabled); - if (shared_texture_enabled != 0) { windowInfo.shared_texture_enabled = 1; - printf(" - Window shared_texture_enabled set to: 1\n"); - } else { - printf(" - Window shared_texture_enabled remains: 0\n"); } // Handle external begin frame enabled setting @@ -1066,27 +1058,9 @@ void create(std::shared_ptr objs, bool got_external_begin_frame = GetJNIFieldBoolean(env, cefBrowserSettings, objs->jbrowserSettings, "external_begin_frame_enabled", &external_begin_frame_enabled); - // Debug output for external begin frame configuration - printf("[DEBUG] External Begin Frame Config:\n"); - printf(" - Field retrieval success: %s\n", got_external_begin_frame ? "YES" : "NO"); - printf(" - Field value: %d\n", external_begin_frame_enabled); - if (external_begin_frame_enabled != 0) { windowInfo.external_begin_frame_enabled = 1; - printf(" - Window external_begin_frame_enabled set to: 1\n"); - } else { - printf(" - Window external_begin_frame_enabled remains: 0\n"); } - - // Additional debug info - printf("[DEBUG] Final WindowInfo Configuration:\n"); - printf(" - shared_texture_enabled: %d\n", windowInfo.shared_texture_enabled); - printf(" - external_begin_frame_enabled: %d\n", windowInfo.external_begin_frame_enabled); - printf(" - windowless_frame_rate: %d\n", settings.windowless_frame_rate); - } else { - printf("[DEBUG] Browser settings not available - using defaults\n"); - printf(" - cefBrowserSettings: %p\n", (void*)cefBrowserSettings.get()); - printf(" - jbrowserSettings: %p\n", (void*)objs->jbrowserSettings); } CefRefPtr browserObj; From ee0c5d8fa46a228b997023ae91d6e05e263529a3 Mon Sep 17 00:00:00 2001 From: Izuna Seikatsu Date: Thu, 26 Jun 2025 02:08:28 +0200 Subject: [PATCH 16/16] refactor: settings --- native/CefBrowser_N.cpp | 22 ++++------------------ 1 file changed, 4 insertions(+), 18 deletions(-) diff --git a/native/CefBrowser_N.cpp b/native/CefBrowser_N.cpp index 77177363..e5a37118 100644 --- a/native/CefBrowser_N.cpp +++ b/native/CefBrowser_N.cpp @@ -1043,24 +1043,10 @@ void create(std::shared_ptr objs, objs->jbrowserSettings != nullptr) { // Dev-tools settings are null GetJNIFieldInt(env, cefBrowserSettings, objs->jbrowserSettings, "windowless_frame_rate", &settings.windowless_frame_rate); - - // Handle shared texture enabled setting - int shared_texture_enabled = 0; - bool got_shared_texture = GetJNIFieldBoolean(env, cefBrowserSettings, objs->jbrowserSettings, - "shared_texture_enabled", &shared_texture_enabled); - - if (shared_texture_enabled != 0) { - windowInfo.shared_texture_enabled = 1; - } - - // Handle external begin frame enabled setting - int external_begin_frame_enabled = 0; - bool got_external_begin_frame = GetJNIFieldBoolean(env, cefBrowserSettings, objs->jbrowserSettings, - "external_begin_frame_enabled", &external_begin_frame_enabled); - - if (external_begin_frame_enabled != 0) { - windowInfo.external_begin_frame_enabled = 1; - } + GetJNIFieldBoolean(env, cefBrowserSettings, objs->jbrowserSettings, + "shared_texture_enabled", &windowInfo.shared_texture_enabled); + GetJNIFieldBoolean(env, cefBrowserSettings, objs->jbrowserSettings, + "external_begin_frame_enabled", &windowInfo.external_begin_frame_enabled); } CefRefPtr browserObj;