RFR: 8326712: Robot tests fail on XWayland [v2]
Alexander Zvegintsev
azvegint at openjdk.org
Fri Jun 28 18:12:37 UTC 2024
> 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 overlaps with the FX ScreenCast session. E.g. `java.awt.Robot#getPixelColor()` and `jav...
Alexander Zvegintsev has updated the pull request incrementally with two additional commits since the last revision:
- do not throw SecurityException
- Revert "remove HEADLESS check"
-------------
Changes:
- all: https://git.openjdk.org/jfx/pull/1490/files
- new: https://git.openjdk.org/jfx/pull/1490/files/3aa56a2c..33fa5385
Webrevs:
- full: https://webrevs.openjdk.org/?repo=jfx&pr=1490&range=01
- incr: https://webrevs.openjdk.org/?repo=jfx&pr=1490&range=00-01
Stats: 31 lines in 6 files changed: 22 ins; 1 del; 8 mod
Patch: https://git.openjdk.org/jfx/pull/1490.diff
Fetch: git fetch https://git.openjdk.org/jfx.git pull/1490/head:pull/1490
PR: https://git.openjdk.org/jfx/pull/1490
More information about the openjfx-dev
mailing list