Correction: Adding ""--add-exports javafx.graphics/javafx.scene.robot=ALL-UNNAMED" to buildSrc/addExports.
For posterity :) On Mon, Dec 4, 2017 at 6:08 PM, Michael Ennen <[email protected]> wrote: > Ah, indeed, missed adding "--add-opens > javafx.graphics/javafx.scene.robot=ALL-UNNAMED" > to buildSrc/addExports. > Thanks for the guidance on that. > > I will continue to work on this in the GitHub repo and polish it up (add > javadocs, better method signatures, etc.) and > even plan on maybe improving the underlying native Robot implementations > (for example fixing/improving the > way color profiles are handled for MacRobot). > > I will also take a look at "fixing" JemmyFX to use the new public API (as > well as any other place in the JavaFX code > base that does). > > I was expecting that JDK 11 would be the appropriate time frame, > especially because it will be the release where > private APIs will be totally inaccessible, correct? > > After I get it in a reasonable state should I post back on this mailing > list thread or what would be the appropriate > way? > > Thanks Kevin. > > On Mon, Dec 4, 2017 at 5:12 PM, Kevin Rushforth < > [email protected]> wrote: > >> 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 <[email protected]> >> <[email protected]> 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 <[email protected]> >> <[email protected]> >> 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.openjdk.java.net/openjfx/10-dev/rt/file/tip/modules/javafx. >> graphics/src/main/java/com/sun/javafx/application/ParametersImpl.java >> <http://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 >> >> >> >> >> > > > -- > Michael Ennen > -- Michael Ennen
