# Problem description

When You create a JavaFX native application with *jpackage* for macOS You will 
run into an issue when trying to handle URIs. When Your application isn’t 
running and You have it registered for handling certain types of URIs it won’t 
receive the first URI. 

## Here is a simple example: 

If You have a JavaFX application that handles URIs for example of the form 
*openurifx://your-content* and You have it installed with *jpackage* for macOS 
and now You try to handle an URI by running the following command: 

``` open openurifx://hello-world ``` 

The application will open, but it won’t receive the above URI. If You call the 
same command after the application is already running, everything will work 
fine and the application will receive the URI.

# Problem cause

The cause of the problem is that when You build a JavaFX application and want 
to handle URIs You will have to combine JavaFX and AWT as AWT provides the URI 
handling capabilities. So the startup process is as follows:

1. JavaFX is initialized
2. JavaFX forwards the URI event to AWT
3. AWT is initialized 
4. AWT is ready to handle URI events from JavaFX

The issue is that the URI event is delivered before AWT can handle it and 
therefore is simple dropped. That’s why later URIs will be received and are 
handled properly. 

# Fix

The fix is that JavaFX will wait until it receives a ready event from AWT so 
JavaFX knows that AWT is able to handle events now. After that it will forward 
all buffered URIs and therefore everything will be handled correctly. This 
means that the fix involves both the JFX and JDK repositories and needs to be 
integrated in both. 

**Note**: In the case that a user has only a fix for the JFX part the URIs 
won’t be delivered at all, but there won’t be any error. This means that JavaFX 
applications won’t be able to handle any URIs so it might be an idea to add an 
environment variable to tell JavaFX to not wait for an AWT ready event. Then 
the first URI event would be lost, but at least all the following events would 
be handled properly.

# Tests

To test the error and the fix You can clone this repository: 
https://github.com/pabulaner/openurifx and checkout the branch *first-url*. 
There You will find a README.md with further instructions.

PR inside the JDK: https://github.com/openjdk/jdk/pull/31791

- [x] I confirm that I make this contribution in accordance with the [OpenJDK 
Interim AI Policy](https://openjdk.org/legal/ai).

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

Commit messages:
 - 8198549: Desktop.setOpenURIHandler() only receives event if application is 
already launched
 - 8198549: Desktop.setOpenURIHandler() only receives event if application is 
already launched

Changes: https://git.openjdk.org/jfx/pull/2203/files
  Webrev: https://webrevs.openjdk.org/?repo=jfx&pr=2203&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8198549
  Stats: 43 lines in 2 files changed: 33 ins; 0 del; 10 mod
  Patch: https://git.openjdk.org/jfx/pull/2203.diff
  Fetch: git fetch https://git.openjdk.org/jfx.git pull/2203/head:pull/2203

PR: https://git.openjdk.org/jfx/pull/2203

Reply via email to