Prevent JVM crashes: Don't react to page loads when the URL is allready different
authorJaroslav Tulach <jtulach@netbeans.org>
Wed, 19 Mar 2014 18:29:52 +0100
changeset 636d31666353dc4
parent 619 ae10a70c2f5a
child 637 8a393a9fc99b
Prevent JVM crashes: Don't react to page loads when the URL is allready different
boot-fx/src/main/java/net/java/html/boot/fx/FXBrowsers.java
boot-fx/src/main/java/org/netbeans/html/boot/fx/FXBrwsr.java
     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      }