Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8088075

[WebNode] Sometimes STDOUT is not properly collected from Java2JavaScript Bridge

XMLWordPrintable

      Sometimes, STDOUT is not properly collected from Java2JavaScript Bridge.
      Run the following example in JNLP mode to reproduce:

      import java.awt.Toolkit;
      import java.lang.reflect.Field;
      import java.security.AccessControlException;
      import javafx.application.Application;
      import static javafx.application.Application.launch;
      import javafx.beans.value.ChangeListener;
      import javafx.beans.value.ObservableValue;
      import javafx.concurrent.Worker;
      import javafx.concurrent.Worker.State;
      import javafx.scene.Scene;
      import javafx.scene.layout.Priority;
      import javafx.scene.layout.VBox;
      import javafx.scene.web.WebEngine;
      import javafx.scene.web.WebView;
      import javafx.stage.Stage;
      import netscape.javascript.JSObject;

      public class Main extends Application {

          public static void main(String[] args) {
              launch(args);
          }

          @Override
          public void start(Stage stage) throws Exception {
              WebView webView = new WebView();
              final WebEngine webEngine = webView.getEngine();
              webEngine.getLoadWorker().stateProperty().addListener(
                      new ChangeListener<Worker.State>() {
                          @Override
                          public void changed(ObservableValue<? extends State> ov,
                                              State oldValue,
                                              State newValue)
                          {
                              System.err.println("New state: " + newValue);
                              if (newValue == State.SUCCEEDED) {
                                  run(webEngine);
                              }
                          }
                      });

              webEngine.loadContent(
                      "<html>" +
                      "<head>" +
                      "<script>" +
                      "function execute() {" +
                      " var test;" +
                      
                      // Comment the following line to reproduce the issue:
                      " window.checker.message('Started the test'); " +
                      
                      " test = 'SunToolkit.DEFAULT_WAIT_TIME';" +
                      " try {" +
                      " var result = window.defaultToolkit2.DEFAULT_WAIT_TIME;" +
                      " window.checker.message('Delayed ' + test + ' succeeds: ' + result + ' - SECURITY ISSUE');" +
                      " } catch(err) {" +
                      " window.checker.message('Delayed ' + test + ' fails, good');" +
                      " window.checker.message(err.message);" +
                      " }" +

                      "}" +
                      "function schedule() {" +
                      " setTimeout(execute, 1);" +
                      "}" +
                      "</script>" +
                      "</head>" +
                      "<body>" +
                      "</body>" +
                      "</html>");

              stage.setScene(new Scene(webView));
              stage.sizeToScene();
              stage.show();
          }

          private static void run(WebEngine webEngine) {
              try {
                  JSObject window = (JSObject) webEngine.executeScript("window");
                  Toolkit defaultToolkit = Toolkit.getDefaultToolkit();

                  // Schedule delayed test
                  Checker checker = new Checker();
                  window.setMember("checker", checker);
                  window.setMember("defaultToolkit2", defaultToolkit);
                  webEngine.executeScript("schedule();");

              } catch (Throwable th) {
                  //th.printStackTrace();
              }
          }

          public static class Checker {
              public void message(String message) {
                  System.err.println("Checker message: " + message);
              }
          }
      }

      When you comment the tagged line out, no checker messages are printed into Java console's output.

            herrick Andy Herrick (Inactive)
            ilatyshe Irina Grineva (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            5 Start watching this issue

              Created:
              Updated:
              Resolved:
              Imported: