Updating to newest version and adding use of @JavaScriptBody with debugging
authorJaroslav Tulach <jtulach@netbeans.org>
Wed, 19 Feb 2014 07:16:17 +0100
changeset 1817195232a041be0
parent 18170 2aed3988eeb1
child 18172 f4e3e2267188
Updating to newest version and adding use of @JavaScriptBody with debugging
project.htmljava/manifest.mf
project.htmljava/src/org/netbeans/modules/project/htmljava/layer.xml
project.htmljava/src/org/netbeans/modules/project/htmljava/prj/DataModel.src
project.htmljava/src/org/netbeans/modules/project/htmljava/prj/JsInteractionTest.src
project.htmljava/src/org/netbeans/modules/project/htmljava/prj/pom.txt
     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>