Proposal For Inclusion of Robot and ParametersImpl in the Public API

Kevin Rushforth kevin.rushforth at oracle.com
Tue Dec 5 00:12:19 UTC 2017


This is a limitation of the the way --patch-modules works. You will need 
to add an entry in:

buildSrc/addExports

Btw, as for the proposal itself, this might need to be a JEP depending 
on the scope. In any case, it could be considered in the JDK 11 time 
frame, but there are several things that need to be worked out before 
making Robot a public API, including the fact that the JemmyFX framework 
in the openjfx/jfx/tests directory uses Robot. Once you get a working 
prototype, it would be interesting to discuss it in more detail.

-- Kevin


Michael Ennen wrote:
> Currently I am stuck with tests not being able to see the new
> "javafx.scene.robot" module:
>
>   
>> Task :systemTests:compileTestJava
>>     
> C:\Users\brcolow\dev\openjfx\tests\system\src\test\java\test\robot\com\sun\glass\ui\monocle\ModalDialogTest.java:34:
> error: package javafx.scene.robot is not visible
> import javafx.scene.robot.Robot;
>                    ^
>   (package javafx.scene.robot is declared in module javafx.graphics, which
> does not export it)
> C:\Users\brcolow\dev\openjfx\tests\system\src\test\java\test\robot\com\sun\glass\ui\monocle\RobotTest.java:33:
> error: package javafx.scene.robot is not visible
> import javafx.scene.robot.Robot;
>
> I have added:
>
>     exports javafx.scene.robot;
>
> to: modules/javafx.graphics/src/main/java/module-info.java
>
> But this does not seem to be enough.
>
> On Sun, Dec 3, 2017 at 4:48 PM, Michael Ennen <mike.ennen at gmail.com> wrote:
>
>   
>> I am still working on all the necessary changes to actually allow openjfx
>> to compile.
>> Tons to learn in that arena and I know the code as it is written won't
>> totally work.
>> For example one can no longer:
>>
>> #include "com_sun_glass_ui_Robot.h"
>>
>> as in openjfx\modules\javafx.graphics\src\main\native-glass\win\Robot.cpp
>>
>> But I am not sure how those headers are generated and if I can just simply
>> change
>> it to "#include javafx_scene_robot_Robot.h" (which I very much doubt).
>>
>> On Sun, Dec 3, 2017 at 2:29 PM, Michael Ennen <mike.ennen at gmail.com>
>> wrote:
>>
>>     
>>> I have created a (small) proposal (building on the work of Benjamin
>>> Gudehaus) about moving some classes in to the public API so that TestFX (a
>>> JavaFX UI testing framework) can continue to work with future JDK releases.
>>> The somewhat nicely formatted proposal can be found as a Github gist:
>>>
>>> https://gist.github.com/brcolow/26370db6cab0355186d4a1d13b30fc19
>>>
>>> All suggested changes can be found by using Github Compare View:
>>>
>>> https://github.com/brcolow/openjfx/compare/4ccdbbbce5234e2c5
>>> e1f4f1cb8f20430feaa53b6...master
>>>
>>> But I have copied it to this email for convenience:
>>>
>>> ----------------------- PROPOSAL -----------------------
>>>
>>> TestFX, the JavaFX GUI testing framework currently requires 4 (four)
>>> classes that are part of the JDK's private API. They are:
>>>
>>> [com.sun.glass.ui.Application](http://hg.openjdk.java.net/op
>>> enjfx/10-dev/rt/file/tip/modules/javafx.graphics/src/main/
>>> java/com/sun/glass/ui/Application.java)
>>> [com.sun.glass.ui.Pixels](http://hg.openjdk.java.net/openjfx
>>> /10-dev/rt/file/tip/modules/javafx.graphics/src/main/java/
>>> com/sun/glass/ui/Pixels.java)
>>> [com.sun.glass.ui.Robot](http://hg.openjdk.java.net/openjfx/
>>> 10-dev/rt/file/tip/modules/javafx.graphics/src/main/java/com
>>> /sun/glass/ui/Robot.java)
>>> [com.sun.javafx.application.ParametersImpl](http://hg.openjd
>>> k.java.net/openjfx/10-dev/rt/file/tip/modules/javafx.
>>> graphics/src/main/java/com/sun/javafx/application/ParametersImpl.java)
>>>
>>> In order to compile the project with Java 9, we use the following flags:
>>>
>>> ```sh
>>> --add-exports javafx.graphics/com.sun.glass.ui=org.testfx
>>> --add-exports javafx.graphics/com.sun.javafx.application=org.testfx
>>> ```
>>>
>>> If the --add-exports flags are disabled in a future Java release TestFX
>>> will require these four classes to be moved into the public API to
>>> continue working.
>>>
>>> While these classes are probably not very useful for applications to use
>>> directly, any JavaFX application wanting to write UI tests will most
>>> likely
>>> use TestFX and thus they will indirectly be using these classes.
>>>
>>> JavaFX internal tests also use these classes for essentially the same
>>> purpose (UI tests).
>>>
>>> ### Details of Usage For Each Private API Class
>>>
>>> #### com.sun.javafx.application.ParametersImpl
>>>
>>> ##### TestFX Usage
>>>
>>> ```java
>>> ParametersImpl parameters = new ParametersImpl(applicationArgs);
>>> ParametersImpl.registerParameters(application, parameters);
>>> ```
>>>
>>> The parameters are set on a constructed Application.
>>>
>>> ##### Suggested Public API Replacement
>>>
>>> `javafx.application.Application`:
>>>
>>> ```java
>>> /**
>>>  * Sets the parameters for this Application.
>>>  *
>>>  * <p>
>>>  * NOTE: this method should not be called from the Application
>>> constructor,
>>>  * as it will return null. It may be called in the init() method or any
>>>  * time after that.
>>>  * </p>
>>>  *
>>>  * @param parameters the parameters to set for this Application
>>>  */
>>> public final Parameters setParameters(String... parameters) {
>>>     ParametersImpl parameters = new ParametersImpl(parameters);
>>>     ParametersImpl.registerParameters(this, parameters);
>>> }
>>> ```
>>>
>>> #### com.sun.glass.ui.Application
>>>
>>> ##### TestFX Usage
>>>
>>> ```java
>>> return Application.GetApplication().createRobot();
>>> ```
>>>
>>> The Application class is used to instantiate a Robot.
>>>
>>> ##### Suggested Public API Replacement
>>>
>>> `javafx.application.Application`:
>>>
>>> https://github.com/brcolow/openjfx/blob/master/modules/javaf
>>> x.graphics/src/main/java/javafx/application/Application.java#L527
>>>
>>> #### com.sun.glass.ui.Pixels
>>>
>>> ##### TestFX Usage
>>>
>>> ```java
>>> @Override
>>> public Image getCaptureRegion(Rectangle2D region) {
>>>     return waitForAsyncFx(RETRIEVAL_TIMEOUT_IN_MILLIS, () -> {
>>>         Pixels glassPixels = useRobot().getScreenCapture(
>>>             (int) region.getMinX(), (int) region.getMinY(),
>>>             (int) region.getWidth(), (int) region.getHeight()
>>>         );
>>>         return convertFromGlassPixels(glassPixels);
>>>     });
>>> }
>>>
>>> private Image convertFromGlassPixels(Pixels glassPixels) {
>>>     int width = glassPixels.getWidth();
>>>     int height = glassPixels.getHeight();
>>>     WritableImage image = new WritableImage(width, height);
>>>
>>>     int bytesPerComponent = glassPixels.getBytesPerComponent();
>>>     if (bytesPerComponent == INT_BUFFER_BYTES_PER_COMPONENT) {
>>>         IntBuffer intBuffer = (IntBuffer) glassPixels.getPixels();
>>>         writeIntBufferToImage(intBuffer, image);
>>>     }
>>>
>>>     return image;
>>> }
>>>
>>> private void writeIntBufferToImage(IntBuffer intBuffer,
>>>                                    WritableImage image) {
>>>     PixelWriter pixelWriter = image.getPixelWriter();
>>>     double width = image.getWidth();
>>>     double height = image.getHeight();
>>>
>>>     for (int y = 0; y < height; y++) {
>>>         for (int x = 0; x < width; x++) {
>>>             int argb = intBuffer.get();
>>>             pixelWriter.setArgb(x, y, argb);
>>>         }
>>>     }
>>> }
>>> ```
>>>
>>> Pixels is used to create a screen capture.
>>>
>>> ##### Suggested Public API Replacement
>>>
>>> Bypass needing to expose the Pixels class to the public API by
>>> changing the getScreenCapture method of Robot - that is, changing:
>>>
>>> `public Pixels getScreenCapture(int x, int y, int width, int height)`
>>>
>>> to:
>>>
>>> `public Image getScreenCapture(int x, int y, int width, int height)`
>>>
>>> #### com.sun.glass.ui.Robot
>>>
>>> ##### TestFX Usage
>>>
>>> Essentially every method of Robot is used:
>>>
>>> ```
>>> public void keyPress(int code)
>>> public void keyRelease(int code)
>>> public int getMouseX()
>>> public int getMouseY()
>>> public void mouseMove(int x, int y)
>>> public void mousePress(int buttons)
>>> public void mouseRelease(int buttons)
>>> public void mouseWheel(int wheelAmt)
>>> public int getPixelColor(int x, int y)
>>> public Pixels getScreenCapture(int x, int y, int width, int height)
>>> ```
>>>
>>> ##### Suggested Public API Replacement
>>>
>>> https://github.com/brcolow/openjfx/blob/master/modules/javaf
>>> x.graphics/src/main/java/javafx/scene/robot/Robot.java
>>>
>>>
>>> --
>>> Michael Ennen
>>>
>>>       
>>
>> --
>> Michael Ennen
>>
>>     
>
>
>
>   


More information about the openjfx-dev mailing list