When an exception is thrown from `AnimationTimer::handle`, the JavaFX 
application freezes. The reason is that the user exception will bubble up into 
framework code, preventing the normal operation of JavaFX.

The following program demonstrates the defect:


public class FailingAnimationTimer extends Application {
    @Override
    public void start(Stage stage) throws Exception {
        var button = new Button("start timer");
        button.setOnAction(_ -> {
            var timer = new AnimationTimer() {
                @Override
                public void handle(long l) {
                    throw new RuntimeException("foo");
                }
            };

            timer.start();
        });

        var root = new HBox();
        root.getChildren().add(new TextField("test"));
        root.getChildren().add(button);
        stage.setScene(new Scene(root));
        stage.show();
    }
}


The solution is to not allow user exceptions to bubble up into animation 
framework code. If an exception occurs, it is instead sent to the current 
thread's uncaught exception handler. This is the same thing that we already do 
for exceptions thrown by invalidation listeners and change listeners.

In addition to that, a failing animation timer has the potential to spam logs, 
which is why I introduced a cut-off value at 100 exceptions for each individual 
timer, after which no further exceptions from this particular timer are sent to 
the uncaught exception handler. After reaching the cut-off value, the following 
warning is logged:

`WARNING: Too many exceptions thrown by AnimationTimer, ignoring further 
exceptions. The cut-off number can be set with the system property 
com.sun.scenario.animation.failingTimerThreshold (current = 100).`

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

Commit messages:
 - fix
 - failing test

Changes: https://git.openjdk.org/jfx/pull/1811/files
  Webrev: https://webrevs.openjdk.org/?repo=jfx&pr=1811&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8357157
  Stats: 224 lines in 2 files changed: 200 ins; 4 del; 20 mod
  Patch: https://git.openjdk.org/jfx/pull/1811.diff
  Fetch: git fetch https://git.openjdk.org/jfx.git pull/1811/head:pull/1811

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

Reply via email to