-
Bug
-
Resolution: Won't Fix
-
P4
-
None
-
8, 9
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.
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.