diff --git a/.github/workflows/build-jcef.yml b/.github/workflows/build-jcef.yml index 83512b8c..84cdfcd3 100644 --- a/.github/workflows/build-jcef.yml +++ b/.github/workflows/build-jcef.yml @@ -5,8 +5,9 @@ on: workflow_dispatch: jobs: + java-cef-linux: - runs-on: [ubuntu-20.04] + runs-on: [ubuntu-22.04] strategy: matrix: platform: [amd64, arm64] @@ -56,7 +57,6 @@ 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: | @@ -96,7 +96,7 @@ jobs: jcef_build/macos_${{ matrix.platform }}.tar.gz.sha256 if-no-files-found: error check-secret: - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 if: github.ref == 'refs/heads/master' steps: - name: Check secret @@ -108,10 +108,9 @@ jobs: 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 + runs-on: ubuntu-22.04 if: github.ref == 'refs/heads/master' strategy: matrix: 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/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..85ef426a 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 @@ -673,6 +676,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) {} @@ -757,8 +769,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..f7d8de1e 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 @@ -396,6 +399,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..e0294848 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) { @@ -771,6 +767,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 +858,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/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/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/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..e5a37118 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: @@ -1010,21 +1010,43 @@ 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); - } - - 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, - "windowless_frame_rate", &settings.windowless_frame_rate); + GetJNIFieldInt(env, cefBrowserSettings, objs->jbrowserSettings, + "windowless_frame_rate", &settings.windowless_frame_rate); + 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; @@ -1033,27 +1055,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 +1067,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 +1199,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 +1570,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); @@ -2160,6 +2174,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/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..0134be54 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", @@ -908,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, diff --git a/native/render_handler.cpp b/native/render_handler.cpp index dee74281..c2e28114 100644 --- a/native/render_handler.cpp +++ b/native/render_handler.cpp @@ -9,7 +9,7 @@ namespace { -// Create a new java.awt.Rectangle. +// Create a java.awt.Rectangle. jobject NewJNIRect(JNIEnv* env, const CefRect& rect) { ScopedJNIClass cls(env, "java/awt/Rectangle"); if (!cls) @@ -270,6 +270,48 @@ 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; + + // Get view rect to determine width and height + 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); + + 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, 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