On Wed, 26 Jun 2024 20:14:26 GMT, Phil Race <p...@openjdk.org> wrote:
>> Most of the headful test failures on XWayland are due to screen capture is >> not working. >> >> Wayland, unlike X11, does not allow arbitrary applications to capture the >> screen contents directly. >> Instead, screen capture functionality is managed by the compositor, which >> can enforce stricter controls and permissions, requiring explicit user >> approval for screen capture operations. >> >> This issue is already resolved in OpenJDK ([base >> issue](https://bugs.openjdk.org/browse/JDK-8280982), there are subsequent >> fixes) by using the [ScreenCast XDG >> portal](https://flatpak.github.io/xdg-desktop-portal/docs/doc-org.freedesktop.portal.ScreenCast.html). >> >> The XDG ScreenCast portal is utilized for capturing screen data as it >> provides a secure and standardized method for applications to access screen >> content. >> Additionally, it allows for the reuse of user permissions without requiring >> repeated confirmations, streamlining the user experience and enhancing >> convenience. >> >> >> <hr> >> >> So this changeset is a copy of the OpenJDK fixes with the addition of the >> JavaFX customization. >> For ease of review, you can skip the changes in the first two commits: >> - First commit is a direct copy of files from OpenJDK >> - Second commit removes the `gtk-` prefix before the `gtk_...` and `g_...` >> function calls (in AWT all gtk functions are dynamically loaded, we don't >> need that in JavaFX). >> >> properties added: >> >> - `javafx.robot.screenshotMethod`, accepts `gtk`(existing gtk method) and >> `dbusScreencast`(added by this changeset, used by default for Wayland) >> - `javafx.robot.screenshotDebug` prints debug info if it is set to `true` >> >> <hr> >> >> What are the remaining issues? >> >> 1. >> >> After applying this fix, system tests will pass except for the >> `SwingNodeJDialogTest` test. >> >> This interop test calls `java.awt.Robot#getPixelColor` which internally >> `gtk->g_main_context_iteration(NULL, TRUE);` causes a blocking of javafx gtk >> loop, so the test hangs. >> So a change is required on OpenJDK side to fix this issue. >> >> 2. >> >> Even after solving the `#1`, the >> `SwingNodeJDialogTest.testNodeRemovalBeforeShow` case is still failing. >> >> 3. >> >> Internally the ScreenCast session keeps open for >> [2s](https://github.com/openjdk/jdk/blob/d457609f700bbb1fed233f1a04501c995852e5ac/src/java.desktop/unix/classes/sun/awt/screencast/ScreencastHelper.java#L62). >> This is to reduce overhead in case of frequent consecutive screen captures. >> >> There is a crash when an AWT ScreenCast session o... > > modules/javafx.graphics/src/main/java/com/sun/glass/ui/gtk/screencast/ScreencastHelper.java > line 70: > >> 68: >> AccessController.doPrivileged((PrivilegedAction<Boolean>) () -> { >> 69: final String str = >> 70: >> System.getProperty("fx.robot.screenshotDebug", "false"); > > fx - > javafx Done. > modules/javafx.graphics/src/main/java/com/sun/glass/ui/gtk/screencast/TokenStorage.java > line 69: > >> 67: >> 68: private static final String REL_NAME = >> 69: ".fx/robot/screencast-tokens.properties"; > > should be .javafx > However I think we can try to READ .awt (and .java) first and if it exists > try to use that. > Perhaps WRITE .javafx ? > If we don't understand what is at .awt or .java then we would then READ > .javafx and if it is not there or > doesn't work CREATE .javafx > > The overall intent is that if a user authorised Java for AWT then we don't > need to re-ask them for FX so long as we can parse what is there and it works Updated to check two locations: 1. `.java/.robot/screencast-tokens.properties` - the default, should be used by both OpenJDK and JavaFx 2. `.awt/robot/screencast-tokens.properties` - this is currently the only location used by OpenJDK, but it should be changed to the first location after [JDK-8335267](https://bugs.openjdk.org/browse/JDK-8335267) is resolved. If there is a writable file at location `#2`, we won't try to read or write to location `#1`. > tests/system/src/test/java/test/robot/javafx/embed/swing/SwingNodeJDialogTest.java > line 37: > >> 35: public class SwingNodeJDialogTest extends SwingNodeBase { >> 36: >> 37: @Test(timeout = 15000) > > Is this in milliseconds ? Yes. ------------- PR Review Comment: https://git.openjdk.org/jfx/pull/1490#discussion_r1657436086 PR Review Comment: https://git.openjdk.org/jfx/pull/1490#discussion_r1657452752 PR Review Comment: https://git.openjdk.org/jfx/pull/1490#discussion_r1657435430