Modern Linux systems often come with 
[Wayland](https://wayland.freedesktop.org/) by default.
This comes with some difficulties, and one of them is the inability to get 
screenshots from the system.
This is because we now use the [X Window System 
API](https://en.wikipedia.org/wiki/X_Window_System) to capture screenshots and 
it cannot access data outside the [XWayland 
server](https://wayland.freedesktop.org/xserver.html) 

But this functionality is a very important part of automated testing.


At the moment there are two obvious solutions to this problem, and both use 
[xdg-desktop-portal](https://github.com/flatpak/xdg-desktop-portal):

1. [org.freedesktop.portal.Screenshot DBUS 
API](https://flatpak.github.io/xdg-desktop-portal/#gdbus-org.freedesktop.portal.Screenshot)
It has several drawbacks though:
+ It saves a screenshot to disk, which must be read and deleted(may add some 
delays depending on the type of a disk drive).
+ There is no way to disable the visual "screen flash" after screenshot
+ It asks a user confirmation to save a screenshot. This confirmation can be 
saved on Gnome 43+. 
Since we would like Ubuntu 22.04 LTS which comes with Gnome 42 this option is 
not acceptable for us because it would require user confirmation for each 
screenshot.
But we still can consider this option as a fallback.



2. 
[org.freedesktop.portal.ScreenCast](https://flatpak.github.io/xdg-desktop-portal/#gdbus-org.freedesktop.portal.ScreenCast)
It typically used by applications that need to capture the contents of the 
user's screen or a specific window for the purpose of sharing, recording, or 
streaming.
This might be a bit of overkill, but it avoids several of the problems 
mentioned in the Screenshot API.

+ implementation is more complicated comparing to Screenshot API
+ no intermediate file, screenshot data can be obtained from memory
+ Permission to make screenshots can be stored with 
[`restore_token`](https://flatpak.github.io/xdg-desktop-portal/#gdbus-method-org-freedesktop-portal-ScreenCast.SelectSources)


So this PR adds the ability to take screenshots using the ScreenCast API. This 
functionality is currently disabled by default.

This change also introduces some new behavior for the robot:
A system window now appears asking for confirmation from the user to capture 
the screen.
+ The user can refuse the screen capture completely. In this case a security 
exception will be thrown.
+ The user can allow a screen capture for all screens or some of them. For 
screens without permission there will be a black image.
+ If the user wishes to change their mind about the screens allowed to be 
captured, the user should use the new `Robot#resetScreenCapturePermission` 
method

Also added several system properties:
`awt.robot.screencastEnabled` false by default, uses the ScreenCast API if true
`awt.robot.screencastDebug` false by default, prints some debug information if 
true

For convenience, this change is divided into two commits:
1. added [pipewire headers](https://gitlab.freedesktop.org/pipewire/pipewire/) 
that are needed for the build
2. main changes 

Changes in the documentation are in a separate PR (#13804) also for convenience.

At the moment, the planned supported systems are Ubuntu 22.04+, the latest 
Oracle Linux 9.1 and RHEL 9.1 has some issues with restore_token support.

-------------

Commit messages:
 - replace tabs with spaces
 - main changes
 - add pipewire header files

Changes: https://git.openjdk.org/jdk/pull/13803/files
 Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=13803&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8280982
  Stats: 14277 lines in 107 files changed: 14237 ins; 18 del; 22 mod
  Patch: https://git.openjdk.org/jdk/pull/13803.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/13803/head:pull/13803

PR: https://git.openjdk.org/jdk/pull/13803

Reply via email to