RFR: 8326712: Robot tests fail on XWayland
Alexander Zvegintsev
azvegint at openjdk.org
Fri Jun 28 07:57:51 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 `javafx.scene.robot.Robot#getPixelColor()` are called within 1 second.
-------------
Commit messages:
- Merge branch 'master' into xwayland/8326712_robot_tests
- Use the secondary path for token storage only if it is writable and there is no writable file on the primary path.
- make @SuppressWarnings("removal") individual
- remove HEADLESS check
- use "javafx." prefix for the properties
- comment removal
- distinguish JFX logs
- AWT->JFX naming
- Reuse awt tokens
- Change properties prefixes from "fx." to "jfx."
- ... and 6 more: https://git.openjdk.org/jfx/compare/ca04c87d...3aa56a2c
Changes: https://git.openjdk.org/jfx/pull/1490/files
Webrev: https://webrevs.openjdk.org/?repo=jfx&pr=1490&range=00
Issue: https://bugs.openjdk.org/browse/JDK-8326712
Stats: 14833 lines in 103 files changed: 14820 ins; 0 del; 13 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