1.1 --- a/project.htmljava/manifest.mf Tue Feb 11 18:05:20 2014 +0100
1.2 +++ b/project.htmljava/manifest.mf Wed Feb 19 07:16:17 2014 +0100
1.3 @@ -3,5 +3,5 @@
1.4 OpenIDE-Module: org.netbeans.modules.project.htmljava
1.5 OpenIDE-Module-Layer: org/netbeans/modules/project/htmljava/layer.xml
1.6 OpenIDE-Module-Localizing-Bundle: org/netbeans/modules/project/htmljava/Bundle.properties
1.7 -OpenIDE-Module-Specification-Version: 1.1
1.8 +OpenIDE-Module-Specification-Version: 1.2
1.9
2.1 --- a/project.htmljava/src/org/netbeans/modules/project/htmljava/layer.xml Tue Feb 11 18:05:20 2014 +0100
2.2 +++ b/project.htmljava/src/org/netbeans/modules/project/htmljava/layer.xml Wed Feb 19 07:16:17 2014 +0100
2.3 @@ -42,6 +42,7 @@
2.4 <folder name="java">
2.5 <folder name="pkg">
2.6 <file name="DataModelTest.java" url="prj/DataModelTest.src"/>
2.7 + <file name="JsInteractionTest.java" url="prj/JsInteractionTest.src"/>
2.8 </folder>
2.9 </folder>
2.10 </folder>
3.1 --- a/project.htmljava/src/org/netbeans/modules/project/htmljava/prj/DataModel.src Tue Feb 11 18:05:20 2014 +0100
3.2 +++ b/project.htmljava/src/org/netbeans/modules/project/htmljava/prj/DataModel.src Wed Feb 19 07:16:17 2014 +0100
3.3 @@ -25,7 +25,20 @@
3.4 @Function static void turnOn(Data model) {
3.5 model.setOn(true);
3.6 }
3.7 - @Function static void turnOff(Data model) {
3.8 - model.setOn(false);
3.9 + @Function static void turnOff(final Data model) {
3.10 + confirmByUser("Really turn off?", new Runnable() {
3.11 + @Override
3.12 + public void run() {
3.13 + model.setOn(false);
3.14 + }
3.15 + });
3.16 }
3.17 +
3.18 + /** Shows direct interaction with JavaScript */
3.19 + @net.java.html.js.JavaScriptBody(
3.20 + args = { "msg", "callback" },
3.21 + javacall = true,
3.22 + body = "alert(msg); callback.@java.lang.Runnable::run()();"
3.23 + )
3.24 + static native void confirmByUser(String msg, Runnable callback);
3.25 }
4.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
4.2 +++ b/project.htmljava/src/org/netbeans/modules/project/htmljava/prj/JsInteractionTest.src Wed Feb 19 07:16:17 2014 +0100
4.3 @@ -0,0 +1,103 @@
4.4 +package @PKG@;
4.5 +
4.6 +import java.io.Closeable;
4.7 +import java.io.Reader;
4.8 +import java.net.URL;
4.9 +import java.util.ArrayList;
4.10 +import java.util.List;
4.11 +import javax.script.Invocable;
4.12 +import javax.script.ScriptEngine;
4.13 +import javax.script.ScriptEngineManager;
4.14 +import javax.script.ScriptException;
4.15 +import org.apidesign.html.boot.spi.Fn;
4.16 +import static org.testng.Assert.assertEquals;
4.17 +import org.testng.annotations.AfterMethod;
4.18 +import org.testng.annotations.BeforeMethod;
4.19 +import org.testng.annotations.Test;
4.20 +
4.21 +/** Tests for behavior of @JavaScriptBody methods. Set your JavaScript
4.22 + * environment up (for example define <code>alert</code> or use some
4.23 + * emulation library like <em>env.js</em>), register script presenter
4.24 + * and then you can call methods that deal with JavaScript in your tests.
4.25 + */
4.26 +public class JsInteractionTest {
4.27 + private Closeable jsEngine;
4.28 + @BeforeMethod public void initializeJSEngine() throws Exception {
4.29 + jsEngine = Fn.activate(new ScriptPresenter());
4.30 + }
4.31 +
4.32 + @AfterMethod public void shutdownJSEngine() throws Exception {
4.33 + jsEngine.close();
4.34 + }
4.35 +
4.36 + @Test public void testCallbackFromJavaScript() throws Exception {
4.37 + class R implements Runnable {
4.38 + int called;
4.39 +
4.40 + @Override
4.41 + public void run() {
4.42 + called++;
4.43 + }
4.44 + }
4.45 + R callback = new R();
4.46 +
4.47 + DataModel.confirmByUser("Hello", callback);
4.48 +
4.49 + assertEquals(callback.called, 1, "One immediate callback");
4.50 + }
4.51 +
4.52 + private static class ScriptPresenter implements Fn.Presenter {
4.53 + private final ScriptEngine eng;
4.54 +
4.55 + public ScriptPresenter() throws ScriptException {
4.56 + eng = new ScriptEngineManager().getEngineByName("javascript");
4.57 + eng.eval("function alert(msg) { Packages.java.lang.System.out.println(msg); };");
4.58 + }
4.59 +
4.60 + @Override
4.61 + public Fn defineFn(String code, String... names) {
4.62 + StringBuilder sb = new StringBuilder();
4.63 + sb.append("(function() {");
4.64 + sb.append(" return function(");
4.65 + String sep = "";
4.66 + for (String n : names) {
4.67 + sb.append(sep).append(n);
4.68 + sep = ",";
4.69 + }
4.70 + sb.append(") {\n");
4.71 + sb.append(code);
4.72 + sb.append("};");
4.73 + sb.append("})()");
4.74 +
4.75 + final Object fn;
4.76 + try {
4.77 + fn = eng.eval(sb.toString());
4.78 + } catch (ScriptException ex) {
4.79 + throw new IllegalStateException(ex);
4.80 + }
4.81 + return new Fn(this) {
4.82 + @Override
4.83 + public Object invoke(Object thiz, Object... args) throws Exception {
4.84 + List<Object> all = new ArrayList<Object>(args.length + 1);
4.85 + all.add(thiz == null ? fn : thiz);
4.86 + for (int i = 0; i < args.length; i++) {
4.87 + all.add(args[i]);
4.88 + }
4.89 + Object ret = ((Invocable)eng).invokeMethod(fn, "call", all.toArray()); // NOI18N
4.90 + return fn.equals(ret) ? null : thiz;
4.91 + }
4.92 + };
4.93 + }
4.94 +
4.95 + @Override
4.96 + public void displayPage(URL page, Runnable onPageLoad) {
4.97 + // not really displaying anything
4.98 + onPageLoad.run();
4.99 + }
4.100 +
4.101 + @Override
4.102 + public void loadScript(Reader code) throws Exception {
4.103 + eng.eval(code);
4.104 + }
4.105 + }
4.106 +}
5.1 --- a/project.htmljava/src/org/netbeans/modules/project/htmljava/prj/pom.txt Tue Feb 11 18:05:20 2014 +0100
5.2 +++ b/project.htmljava/src/org/netbeans/modules/project/htmljava/prj/pom.txt Wed Feb 19 07:16:17 2014 +0100
5.3 @@ -11,8 +11,8 @@
5.4
5.5 <properties>
5.6 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
5.7 - <net.java.html.version>0.7</net.java.html.version>
5.8 - <bck2brwsr.version>0.8</bck2brwsr.version>
5.9 + <net.java.html.version>0.7.5</net.java.html.version>
5.10 + <bck2brwsr.version>0.8.1</bck2brwsr.version>
5.11 <brwsr.startpage>pages/index.html</brwsr.startpage>
5.12 <project.mainclass>@PKG@.Main</project.mainclass>
5.13 <netbeans.compile.on.save>none</netbeans.compile.on.save>
5.14 @@ -20,6 +20,19 @@
5.15 <build>
5.16 <plugins>
5.17 <plugin>
5.18 + <groupId>org.netbeans.html</groupId>
5.19 + <artifactId>html4j-maven-plugin</artifactId>
5.20 + <version>${net.java.html.version}</version>
5.21 + <executions>
5.22 + <execution>
5.23 + <id>js-classes</id>
5.24 + <goals>
5.25 + <goal>process-js-annotations</goal>
5.26 + </goals>
5.27 + </execution>
5.28 + </executions>
5.29 + </plugin>
5.30 + <plugin>
5.31 <groupId>org.apache.maven.plugins</groupId>
5.32 <artifactId>maven-compiler-plugin</artifactId>
5.33 <version>2.3.2</version>