Prevent JVM crashes: Don't react to page loads when the URL is allready different
1.1 --- a/boot-fx/src/main/java/net/java/html/boot/fx/FXBrowsers.java Sat Mar 15 17:28:16 2014 +0100
1.2 +++ b/boot-fx/src/main/java/net/java/html/boot/fx/FXBrowsers.java Wed Mar 19 18:29:52 2014 +0100
1.3 @@ -88,18 +88,33 @@
1.4 }
1.5
1.6 @Override
1.7 - protected WebView findView(URL resource) {
1.8 + protected WebView findView(final URL resource) {
1.9 final Worker<Void> w = webView.getEngine().getLoadWorker();
1.10 w.stateProperty().addListener(new ChangeListener<Worker.State>() {
1.11 + private String previous;
1.12 +
1.13 @Override
1.14 public void changed(ObservableValue<? extends Worker.State> ov, Worker.State t, Worker.State newState) {
1.15 if (newState.equals(Worker.State.SUCCEEDED)) {
1.16 - onPageLoad();
1.17 + if (checkValid()) {
1.18 + onPageLoad();
1.19 + }
1.20 }
1.21 if (newState.equals(Worker.State.FAILED)) {
1.22 + checkValid();
1.23 throw new IllegalStateException("Failed to load " + url);
1.24 }
1.25 }
1.26 +
1.27 + private boolean checkValid() {
1.28 + final String crnt = webView.getEngine().getLocation();
1.29 + if (previous != null && !previous.equals(crnt)) {
1.30 + w.stateProperty().removeListener(this);
1.31 + return false;
1.32 + }
1.33 + previous = crnt;
1.34 + return true;
1.35 + }
1.36 });
1.37
1.38 return webView;
2.1 --- a/boot-fx/src/main/java/org/netbeans/html/boot/fx/FXBrwsr.java Sat Mar 15 17:28:16 2014 +0100
2.2 +++ b/boot-fx/src/main/java/org/netbeans/html/boot/fx/FXBrwsr.java Wed Mar 19 18:29:52 2014 +0100
2.3 @@ -166,16 +166,30 @@
2.4 root.setCenter(view);
2.5 final Worker<Void> w = view.getEngine().getLoadWorker();
2.6 w.stateProperty().addListener(new ChangeListener<Worker.State>() {
2.7 + private String previous;
2.8 +
2.9 @Override
2.10 public void changed(ObservableValue<? extends Worker.State> ov, Worker.State t, Worker.State newState) {
2.11 if (newState.equals(Worker.State.SUCCEEDED)) {
2.12 - FXConsole.register(view.getEngine());
2.13 - onLoad.onPageLoad();
2.14 + if (checkValid()) {
2.15 + FXConsole.register(view.getEngine());
2.16 + onLoad.onPageLoad();
2.17 + }
2.18 }
2.19 if (newState.equals(Worker.State.FAILED)) {
2.20 throw new IllegalStateException("Failed to load " + url);
2.21 }
2.22 }
2.23 + private boolean checkValid() {
2.24 + final String crnt = view.getEngine().getLocation();
2.25 + if (previous != null && !previous.equals(crnt)) {
2.26 + w.stateProperty().removeListener(this);
2.27 + return false;
2.28 + }
2.29 + previous = crnt;
2.30 + return true;
2.31 + }
2.32 +
2.33 });
2.34 return view;
2.35 }