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

Reply via email to