This file was deleted.

This file was deleted.

This file was deleted.

@@ -4,11 +4,11 @@
<parent>
<groupId>org.apidesign.bck2brwsr</groupId>
<artifactId>javaquery</artifactId>
<version>0.8</version>
<version>0.8.1</version>
</parent>
<groupId>org.apidesign.bck2brwsr</groupId>
<artifactId>javaquery.api</artifactId>
<version>0.8</version>
<version>0.8.1</version>
<name>JavaQuery API</name>
<url>http://maven.apache.org</url>
<build>
@@ -1226,6 +1226,12 @@ private String checkType(Prprt p, boolean[] isModel, boolean[] isEnum, boolean[]
isModel[0] = true;
} else {
ret = tm.toString();
int idx = ret.indexOf("<any?>.");
if (idx >= 0) {
ret = ret.substring(idx + 7);
isEnum[0] = false;
return ret;
}
}
TypeMirror enm = processingEnv.getElementUtils().getTypeElement("java.lang.Enum").asType();
enm = processingEnv.getTypeUtils().erasure(enm);
@@ -281,31 +281,31 @@ static void fetchViaJSONP(Person p, JSONik model) {
assert Sex.FEMALE.equals(p.getSex()) : "Expecting FEMALE: " + p.getSex();
}

@Http(@Http.Resource(
content = "{'info':[{'firstName': 'Gitar', 'sex': 'FEMALE'}]}",
path="/people.json",
mimeType = "application/json"
))
@BrwsrTest public void loadAndParseArrayInPeople() throws InterruptedException {
if (js == null) {
js = new JSONik();
js.applyBindings();

js.fetchPeople("people.json");
}

if (0 == js.getFetchedCount()) {
throw new InterruptedException();
}

assert js.getFetchedCount() == 1 : "One person loaded: " + js.getFetchedCount();

Person p = js.getFetched();

assert p != null : "We should get our person back: " + p;
assert "Gitar".equals(p.getFirstName()) : "Expecting Gitar: " + p.getFirstName();
assert Sex.FEMALE.equals(p.getSex()) : "Expecting FEMALE: " + p.getSex();
}
// @Http(@Http.Resource(
// content = "{'info':[{'firstName': 'Gitar', 'sex': 'FEMALE'}]}",
// path="/people.json",
// mimeType = "application/json"
// ))
// @BrwsrTest public void loadAndParseArrayInPeople() throws InterruptedException {
// if (js == null) {
// js = new JSONik();
// js.applyBindings();
//
// js.fetchPeople("people.json");
// }
//
// if (0 == js.getFetchedCount()) {
// throw new InterruptedException();
// }
//
// assert js.getFetchedCount() == 1 : "One person loaded: " + js.getFetchedCount();
//
// Person p = js.getFetched();
//
// assert p != null : "We should get our person back: " + p;
// assert "Gitar".equals(p.getFirstName()) : "Expecting Gitar: " + p.getFirstName();
// assert Sex.FEMALE.equals(p.getSex()) : "Expecting FEMALE: " + p.getSex();
// }

@Http(@Http.Resource(
content = "{'age':[1, 2, 3]}",
@@ -4,7 +4,7 @@

<groupId>org.apidesign.bck2brwsr</groupId>
<artifactId>demo.calculator</artifactId>
<version>0.8</version>
<version>0.8.1</version>
<packaging>jar</packaging>

<name>JavaQuery Demo - Calculator</name>
@@ -4,7 +4,7 @@

<groupId>org.apidesign.bck2brwsr</groupId>
<artifactId>demo.static.calculator</artifactId>
<version>0.8</version>
<version>0.8.1</version>
<packaging>jar</packaging>

<name>JavaQuery Demo - Calculator - Static Compilation</name>

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

@@ -4,17 +4,16 @@
<parent>
<artifactId>bck2brwsr</artifactId>
<groupId>org.apidesign</groupId>
<version>0.8</version>
<version>0.8.1</version>
</parent>
<groupId>org.apidesign.bck2brwsr</groupId>
<artifactId>javaquery</artifactId>
<version>0.8</version>
<version>0.8.1</version>
<packaging>pom</packaging>
<name>JavaQuery API and Demo</name>
<modules>
<module>api</module>
<module>demo-calculator</module>
<module>demo-calculator-dynamic</module>
<module>demo-twitter</module>
</modules>
</project>
</project>
@@ -4,11 +4,11 @@
<parent>
<groupId>org.apidesign.bck2brwsr</groupId>
<artifactId>ko</artifactId>
<version>0.8</version>
<version>0.8.1</version>
</parent>
<groupId>org.apidesign.bck2brwsr</groupId>
<artifactId>ko-archetype-test</artifactId>
<version>0.8</version>
<version>0.8.1</version>
<name>Knockout Bck2Brwsr Archetype Test</name>
<url>http://maven.apache.org</url>
<description>Verifies the Knockout &amp; net.java.html.json archetype behaves properly.</description>
@@ -74,8 +74,8 @@ public class VerifyArchetypeTest {

v.verifyErrorFreeLog();

// does pre-compilation to JavaScript
v.verifyTextInLog("j2js");
// no longer does pre-compilation to JavaScript
// v.verifyTextInLog("j2js");
// uses Bck2BrwsrLauncher
v.verifyTextInLog("BaseHTTPLauncher showBrwsr");
// building zip:
@@ -4,11 +4,11 @@
<parent>
<artifactId>ko</artifactId>
<groupId>org.apidesign.bck2brwsr</groupId>
<version>0.8</version>
<version>0.8.1</version>
</parent>
<groupId>org.apidesign.bck2brwsr</groupId>
<artifactId>knockout4j-archetype</artifactId>
<version>0.8</version>
<version>0.8.1</version>
<packaging>jar</packaging>
<name>Knockout Bck2Brwsr Maven Archetype</name>
<description>
@@ -43,6 +43,7 @@
<bck2brwsr.launcher.version>${project.version}</bck2brwsr.launcher.version>
<bck2brwsr.obfuscationlevel>MINIMAL</bck2brwsr.obfuscationlevel>
<brwsr.startpage>pages/index.html</brwsr.startpage>
<netbeans.compile.on.save>none</netbeans.compile.on.save>
</properties>
<build>
<plugins>
@@ -63,6 +64,19 @@
<launcher>${brwsr}</launcher>
</configuration>
</plugin>
<plugin>
<groupId>org.netbeans.html</groupId>
<artifactId>html4j-maven-plugin</artifactId>
<version>${net.java.html.version}</version>
<executions>
<execution>
<id>js-classes</id>
<goals>
<goal>process-js-annotations</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
@@ -110,7 +124,7 @@
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.5.2</version>
<version>6.7</version>
<scope>test</scope>
</dependency>
<dependency>
@@ -126,11 +140,17 @@
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apidesign.html</groupId>
<groupId>org.netbeans.html</groupId>
<artifactId>net.java.html.json</artifactId>
<version>\${net.java.html.version}</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>org.netbeans.html</groupId>
<artifactId>net.java.html.boot</artifactId>
<version>\${net.java.html.version}</version>
<type>jar</type>
</dependency>
</dependencies>
<profiles>
<profile>
@@ -182,8 +202,8 @@
</build>
<dependencies>
<dependency>
<groupId>org.apidesign.html</groupId>
<artifactId>ko-fx</artifactId>
<groupId>org.netbeans.html</groupId>
<artifactId>ko4j</artifactId>
<version>\${net.java.html.version}</version>
</dependency>
<dependency>
@@ -204,28 +224,16 @@
</activation>
<build>
<plugins>
<plugin>
<groupId>org.apidesign.bck2brwsr</groupId>
<artifactId>bck2brwsr-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>j2js</goal>
</goals>
</execution>
</executions>
<configuration>
<javascript>\${project.build.directory}/bck2brwsr.js</javascript>
<obfuscation>\${bck2brwsr.obfuscationlevel}</obfuscation>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<compilerArguments>
<bootclasspath>netbeans.ignore.jdk.bootclasspath</bootclasspath>
</compilerArguments>
<testExcludes>
<exclude>**/JsInteractionTest*</exclude>
</testExcludes>
</configuration>
</plugin>
<plugin>
@@ -261,6 +269,14 @@
<version>\${bck2brwsr.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.apidesign.bck2brwsr</groupId>
<artifactId>vm4brwsr</artifactId>
<classifier>js</classifier>
<type>zip</type>
<version>\${bck2brwsr.version}</version>
<scope>provided</scope>
</dependency>
</dependencies>
</profile>
</profiles>
@@ -17,18 +17,17 @@
<include>*:rt</include>
</includes>
</dependencySet>
<dependencySet>
<useProjectArtifact>false</useProjectArtifact>
<scope>provided</scope>
<includes>
<include>*:js</include>
</includes>
<unpack>true</unpack>
<outputDirectory>/</outputDirectory>
</dependencySet>
</dependencySets>
<fileSets>
<fileSet>
<directory>${project.build.directory}/classes/${package.replace('.','/')}/</directory>
<includes>
<include>**/*</include>
</includes>
<excludes>
<exclude>**/*.class</exclude>
</excludes>
<outputDirectory>/</outputDirectory>
</fileSet>
<fileSet>
<directory>src/main/webapp/pages</directory>
<outputDirectory>/</outputDirectory>
@@ -40,9 +39,5 @@
<source>${project.build.directory}/${project.build.finalName}.jar</source>
<outputDirectory>/</outputDirectory>
</file>
<file>
<source>${project.build.directory}/bck2brwsr.js</source>
<outputDirectory>/</outputDirectory>
</file>
</files>
</assembly>
@@ -25,7 +25,21 @@ final class DataModel {
@Function static void turnOn(Data model) {
model.setOn(true);
}
@Function static void turnOff(Data model) {
model.setOn(false);

@Function static void turnOff(final Data model) {
confirmByUser("Really turn off?", new Runnable() {
@Override
public void run() {
model.setOn(false);
}
});
}

/** Shows direct interaction with JavaScript */
@net.java.html.js.JavaScriptBody(
args = { "msg", "callback" },
javacall = true,
body = "alert(msg); callback.@java.lang.Runnable::run()();"
)
static native void confirmByUser(String msg, Runnable callback);
}
@@ -9,12 +9,21 @@
0% { -webkit-transform: rotate(0deg); }
100% { -webkit-transform: rotate(360deg); }
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}

.rotate {
-webkit-animation-name: spin;
-webkit-animation-duration: 3s;
-webkit-animation-iteration-count: infinite;
-webkit-animation-direction: alternate;

animation-name: spin;
animation-duration: 3s;
animation-iteration-count: infinite;
animation-direction: alternate;
}

#scene {
@@ -0,0 +1,103 @@
package ${package};

import java.io.Closeable;
import java.io.Reader;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import org.apidesign.html.boot.spi.Fn;
import static org.testng.Assert.assertEquals;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;

/** Tests for behavior of @JavaScriptBody methods. Set your JavaScript
* environment up (for example define <code>alert</code> or use some
* emulation library like <em>env.js</em>), register script presenter
* and then you can call methods that deal with JavaScript in your tests.
*/
public class JsInteractionTest {
private Closeable jsEngine;
@BeforeMethod public void initializeJSEngine() throws Exception {
jsEngine = Fn.activate(new ScriptPresenter());
}

@AfterMethod public void shutdownJSEngine() throws Exception {
jsEngine.close();
}

@Test public void testCallbackFromJavaScript() throws Exception {
class R implements Runnable {
int called;

@Override
public void run() {
called++;
}
}
R callback = new R();

DataModel.confirmByUser("Hello", callback);

assertEquals(callback.called, 1, "One immediate callback");
}

private static class ScriptPresenter implements Fn.Presenter {
private final ScriptEngine eng;

public ScriptPresenter() throws ScriptException {
eng = new ScriptEngineManager().getEngineByName("javascript");
eng.eval("function alert(msg) { Packages.java.lang.System.out.println(msg); };");
}

@Override
public Fn defineFn(String code, String... names) {
StringBuilder sb = new StringBuilder();
sb.append("(function() {");
sb.append(" return function(");
String sep = "";
for (String n : names) {
sb.append(sep).append(n);
sep = ",";
}
sb.append(") {\n");
sb.append(code);
sb.append("};");
sb.append("})()");

final Object fn;
try {
fn = eng.eval(sb.toString());
} catch (ScriptException ex) {
throw new IllegalStateException(ex);
}
return new Fn(this) {
@Override
public Object invoke(Object thiz, Object... args) throws Exception {
List<Object> all = new ArrayList<Object>(args.length + 1);
all.add(thiz == null ? fn : thiz);
for (int i = 0; i < args.length; i++) {
all.add(args[i]);
}
Object ret = ((Invocable)eng).invokeMethod(fn, "call", all.toArray()); // NOI18N
return fn.equals(ret) ? null : thiz;
}
};
}

@Override
public void displayPage(URL page, Runnable onPageLoad) {
// not really displaying anything
onPageLoad.run();
}

@Override
public void loadScript(Reader code) throws Exception {
eng.eval(code);
}
}
}
@@ -4,11 +4,11 @@
<parent>
<groupId>org.apidesign.bck2brwsr</groupId>
<artifactId>ko</artifactId>
<version>0.8</version>
<version>0.8.1</version>
</parent>
<groupId>org.apidesign.bck2brwsr</groupId>
<artifactId>ko-bck2brwsr</artifactId>
<version>0.8</version>
<version>0.8.1</version>
<name>Knockout.b2b</name>
<url>http://maven.apache.org</url>
<build>
@@ -62,6 +62,12 @@
<version>${project.version}</version>
<type>jar</type>
<scope>test</scope>
<exclusions>
<exclusion>
<artifactId>json</artifactId>
<groupId>org.json</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apidesign.bck2brwsr</groupId>
@@ -74,14 +80,20 @@
<artifactId>launcher.http</artifactId>
<version>${project.version}</version>
<scope>test</scope>
<exclusions>
<exclusion>
<artifactId>asm</artifactId>
<groupId>org.ow2.asm</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apidesign.html</groupId>
<groupId>org.netbeans.html</groupId>
<artifactId>net.java.html.json</artifactId>
<version>${net.java.html.version}</version>
</dependency>
<dependency>
<groupId>org.apidesign.html</groupId>
<groupId>org.netbeans.html</groupId>
<artifactId>net.java.html.json.tck</artifactId>
<version>${net.java.html.version}</version>
<scope>test</scope>
@@ -93,10 +105,31 @@
<type>jar</type>
</dependency>
<dependency>
<groupId>org.apidesign.html</groupId>
<groupId>org.netbeans.html</groupId>
<artifactId>net.java.html.boot</artifactId>
<version>0.5</version>
<version>${net.java.html.version}</version>
<type>jar</type>
<exclusions>
<exclusion>
<artifactId>asm</artifactId>
<groupId>org.ow2.asm</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.netbeans.html</groupId>
<artifactId>ko4j</artifactId>
<version>${net.java.html.version}</version>
<exclusions>
<exclusion>
<artifactId>json</artifactId>
<groupId>org.json</groupId>
</exclusion>
<exclusion>
<artifactId>org.json-osgi</artifactId>
<groupId>de.twentyeleven.skysail</groupId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

@@ -0,0 +1,34 @@
/**
* Back 2 Browser Bytecode Translator
* Copyright (C) 2012 Jaroslav Tulach <jaroslav.tulach@apidesign.org>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. Look for COPYING file in the top folder.
* If not, see http://opensource.org/licenses/GPL-2.0.
*/
package org.apidesign.bck2brwsr.ko2brwsr;

import org.apidesign.bck2brwsr.vmtest.VMTest;
import org.apidesign.html.json.tck.JavaScriptTCK;
import org.apidesign.html.json.tck.KOTest;
import org.testng.annotations.Factory;

/**
*
* @author Jaroslav Tulach <jtulach@netbeans.org>
*/
public class Bck2BrwsrJavaScriptBodyTest extends JavaScriptTCK {
@Factory public static Object[] tests() {
return VMTest.newTests().withClasses(testClasses())
.withTestAnnotation(KOTest.class).build();
}
}
@@ -31,6 +31,7 @@
import org.apidesign.html.json.spi.WSTransfer;
import org.apidesign.html.json.tck.KOTest;
import org.apidesign.html.json.tck.KnockoutTCK;
import org.netbeans.html.ko4j.KO4J;
import org.openide.util.lookup.ServiceProvider;
import org.testng.annotations.Factory;

@@ -50,10 +51,11 @@ public final class Bck2BrwsrKnockoutTest extends KnockoutTCK {

@Override
public BrwsrCtx createContext() {
KO4J ko = new KO4J(null);
return Contexts.newBuilder().
register(Transfer.class, BrwsrCtxImpl.DEFAULT, 9).
register(WSTransfer.class, BrwsrCtxImpl.DEFAULT, 9).
register(Technology.class, BrwsrCtxImpl.DEFAULT, 9).build();
register(Transfer.class, ko.transfer(), 9).
register(WSTransfer.class, ko.websockets(), 9).
register(Technology.class, ko.knockout(), 9).build();
}


@@ -4,11 +4,11 @@
<parent>
<groupId>org.apidesign.bck2brwsr</groupId>
<artifactId>ko</artifactId>
<version>0.8</version>
<version>0.8.1</version>
</parent>
<groupId>org.apidesign.bck2brwsr</groupId>
<artifactId>ko-fx</artifactId>
<version>0.8</version>
<version>0.8.1</version>
<name>Knockout.fx in Brwsr</name>
<url>http://maven.apache.org</url>
<properties>
@@ -40,7 +40,7 @@
<type>jar</type>
</dependency>
<dependency>
<groupId>org.apidesign.html</groupId>
<groupId>org.netbeans.html</groupId>
<artifactId>net.java.html.json</artifactId>
<version>${net.java.html.version}</version>
</dependency>
@@ -50,7 +50,7 @@
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apidesign.html</groupId>
<groupId>org.netbeans.html</groupId>
<artifactId>net.java.html.json.tck</artifactId>
<version>${net.java.html.version}</version>
<scope>test</scope>
@@ -67,14 +67,14 @@
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apidesign.html</groupId>
<groupId>org.netbeans.html</groupId>
<artifactId>net.java.html.boot</artifactId>
<version>${net.java.html.version}</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>org.apidesign.html</groupId>
<artifactId>ko-fx</artifactId>
<groupId>org.netbeans.html</groupId>
<artifactId>ko4j</artifactId>
<version>${net.java.html.version}</version>
<type>jar</type>
</dependency>
@@ -86,7 +86,7 @@
<type>jar</type>
</dependency>
<dependency>
<groupId>org.apidesign.html</groupId>
<groupId>org.netbeans.html</groupId>
<artifactId>ko-ws-tyrus</artifactId>
<version>${net.java.html.version}</version>
<scope>test</scope>
@@ -0,0 +1,36 @@
/**
* Back 2 Browser Bytecode Translator
* Copyright (C) 2012 Jaroslav Tulach <jaroslav.tulach@apidesign.org>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. Look for COPYING file in the top folder.
* If not, see http://opensource.org/licenses/GPL-2.0.
*/
package org.apidesign.bck2brwsr.kofx;

import org.apidesign.bck2brwsr.vmtest.VMTest;
import org.apidesign.html.json.tck.JavaScriptTCK;
import org.apidesign.html.json.tck.KOTest;
import org.testng.annotations.Factory;

/**
*
* @author Jaroslav Tulach <jtulach@netbeans.org>
*/
public class JavaScriptBodyFXBrwsrTest extends JavaScriptTCK {
@Factory public static Object[] create() {
return VMTest.newTests().
withLaunchers("fxbrwsr").
withClasses(testClasses()).
withTestAnnotation(KOTest.class).build();
}
}
@@ -28,17 +28,17 @@
import net.java.html.BrwsrCtx;
import net.java.html.js.JavaScriptBody;
import org.apidesign.bck2brwsr.vmtest.VMTest;
import org.apidesign.html.boot.impl.FnUtils;
import org.apidesign.html.boot.spi.Fn;
import org.apidesign.html.context.spi.Contexts;
import org.apidesign.html.json.spi.Technology;
import org.apidesign.html.json.spi.Transfer;
import org.apidesign.html.json.spi.WSTransfer;
import org.apidesign.html.json.tck.KOTest;
import org.apidesign.html.json.tck.KnockoutTCK;
import org.apidesign.html.kofx.FXContext;
import org.apidesign.html.wstyrus.TyrusContext;
import org.json.JSONException;
import org.json.JSONObject;
import org.netbeans.html.ko4j.KO4J;
import org.netbeans.html.wstyrus.TyrusContext;
import org.openide.util.lookup.ServiceProvider;
import org.testng.annotations.Factory;

@@ -60,34 +60,36 @@ public KnockoutFXTest() {

@Override
public BrwsrCtx createContext() {
FXContext fx = new FXContext(FnUtils.currentPresenter());
KO4J ko = new KO4J(Fn.activePresenter());
TyrusContext tc = new TyrusContext();
Contexts.Builder b = Contexts.newBuilder().
register(Technology.class, fx, 10).
register(Transfer.class, fx, 10);
register(Technology.class, ko.knockout(), 10).
register(Transfer.class, ko.transfer(), 10);
try {
Class.forName("java.util.function.Function");
// prefer WebView's WebSockets on JDK8
b.register(WSTransfer.class, fx, 10);
b.register(WSTransfer.class, ko.websockets(), 10);
} catch (ClassNotFoundException ex) {
// ok, JDK7 needs tyrus
b.register(WSTransfer.class, tc, 20);
b.register(Transfer.class, tc, 5);
}
return b.build();
}

@Override
public Object createJSON(Map<String, Object> values) {
JSONObject json = new JSONObject();
Object json = createJSON();
for (Map.Entry<String, Object> entry : values.entrySet()) {
try {
json.put(entry.getKey(), entry.getValue());
} catch (JSONException ex) {
throw new IllegalStateException(ex);
}
setProperty(json, entry.getKey(), entry.getValue());
}
return json;
}

@JavaScriptBody(args = {}, body = "return new Object();")
private static native Object createJSON();
@JavaScriptBody(args = { "json", "key", "value" }, body = "json[key] = value;")
private static native void setProperty(Object json, String key, Object value);

@Override
@JavaScriptBody(args = { "s", "args" }, body = ""
@@ -3,13 +3,13 @@
<modelVersion>4.0.0</modelVersion>
<groupId>org.apidesign.bck2brwsr</groupId>
<artifactId>ko</artifactId>
<version>0.8</version>
<version>0.8.1</version>
<packaging>pom</packaging>
<name>Bck2Brwsr Knockout Support</name>
<parent>
<groupId>org.apidesign</groupId>
<artifactId>bck2brwsr</artifactId>
<version>0.8</version>
<version>0.8.1</version>
</parent>
<modules>
<module>archetype</module>
@@ -4,11 +4,11 @@
<parent>
<groupId>org.apidesign.bck2brwsr</groupId>
<artifactId>launcher-pom</artifactId>
<version>0.8</version>
<version>0.8.1</version>
</parent>
<groupId>org.apidesign.bck2brwsr</groupId>
<artifactId>launcher</artifactId>
<version>0.8</version>
<version>0.8.1</version>
<name>Launcher API</name>
<url>http://maven.apache.org</url>
<properties>
@@ -4,11 +4,11 @@
<parent>
<groupId>org.apidesign.bck2brwsr</groupId>
<artifactId>launcher-pom</artifactId>
<version>0.8</version>
<version>0.8.1</version>
</parent>
<groupId>org.apidesign.bck2brwsr</groupId>
<artifactId>launcher.fx</artifactId>
<version>0.8</version>
<version>0.8.1</version>
<name>FXBrwsr Launcher</name>
<url>http://maven.apache.org</url>
<build>
@@ -75,7 +75,7 @@
<version>4.1</version>
</dependency>
<dependency>
<groupId>org.apidesign.html</groupId>
<groupId>org.netbeans.html</groupId>
<artifactId>net.java.html.boot</artifactId>
<version>${net.java.html.version}</version>
</dependency>
@@ -572,7 +572,10 @@ private static URI pageURL(String protocol, HttpServer server, final String page
}

class Res {
public InputStream get(String resource) throws IOException {
public InputStream get(String resource, int skip) throws IOException {
if (!resource.endsWith(".class")) {
return getResource(resource, skip);
}
URL u = null;
for (ClassLoader l : loaders) {
Enumeration<URL> en = l.getResources(resource);
@@ -585,12 +588,30 @@ public InputStream get(String resource) throws IOException {
}
if (u != null) {
if (u.toExternalForm().contains("rt.jar")) {
LOG.log(Level.WARNING, "Fallback to bootclasspath for {0}", u);
LOG.log(Level.WARNING, "No fallback to bootclasspath for {0}", u);
return null;
}
return u.openStream();
}
throw new IOException("Can't find " + resource);
}
private InputStream getResource(String resource, int skip) throws IOException {
for (ClassLoader l : loaders) {
Enumeration<URL> en = l.getResources(resource);
while (en.hasMoreElements()) {
final URL now = en.nextElement();
if (now.toExternalForm().contains("sisu-inject-bean")) {
// certainly we don't want this resource, as that
// module is not compiled with target 1.6, currently
continue;
}
if (--skip < 0) {
return now.openStream();
}
}
}
throw new IOException("Not found (anymore of) " + resource);
}
}

private static class Page extends HttpHandler {
@@ -623,7 +644,7 @@ public void service(Request request, Response response) throws Exception {
}
OutputStream os = response.getOutputStream();
try {
InputStream is = res.get(r);
InputStream is = res.get(r, 0);
copyStream(is, os, request.getRequestURL().toString(), replace);
} catch (IOException ex) {
response.setDetailMessage(ex.getLocalizedMessage());
@@ -695,7 +716,9 @@ public void service(Request request, Response response) throws Exception {
}
InputStream is = null;
try {
is = loader.get(res);
String skip = request.getParameter("skip");
int skipCnt = skip == null ? 0 : Integer.parseInt(skip);
is = loader.get(res, skipCnt);
response.setContentType("text/javascript");
Writer w = response.getWriter();
w.append("[");
@@ -117,7 +117,9 @@ private String zoom( String zoomFactor ) {
zoom = Math.abs( zoom )/100;
if( zoom <= 0.0 )
return null;
webView.impl_setScale( zoom );
webView.setScaleX(zoom);
webView.setScaleY(zoom);
webView.setScaleZ(zoom);
return (int)(100*zoom) + "%"; //NOI18N
} catch( NumberFormatException nfe ) {
//ignore
@@ -25,8 +25,8 @@
import java.lang.reflect.Modifier;
import java.net.URL;
import java.util.Enumeration;
import net.java.html.js.JavaScriptBody;
import netscape.javascript.JSObject;
import org.apidesign.bck2brwsr.core.JavaScriptBody;

/**
*
@@ -60,8 +60,7 @@ private static void log(String newText) {
}

private static void beginTest(Case c) {
Object[] arr = new Object[2];
beginTest(c.getClassName() + "." + c.getMethodName(), c, arr);
Object[] arr = beginTest(c.getClassName() + "." + c.getMethodName(), c, new Object[2]);
textArea = arr[0];
statusArea = arr[1];
}
@@ -102,23 +101,23 @@ private static void finishTest(Case c, Object res) {
+ "ul.appendChild(li);\n"
+ "arr[0] = pre;\n"
+ "arr[1] = status;\n"
+ "return arr;"
)
private static native void beginTest(String test, Case c, Object[] arr);
private static native Object[] beginTest(String test, Case c, Object[] arr);

@JavaScriptBody(args = { "url", "callback", "arr" }, body =
@JavaScriptBody(args = { "url", "callback" }, javacall = true, body =
"var request = new XMLHttpRequest();\n"
+ "request.open('GET', url, true);\n"
+ "request.setRequestHeader('Content-Type', 'text/plain; charset=utf-8');\n"
+ "request.onreadystatechange = function() {\n"
+ " if (this.readyState!==4) return;\n"
+ " try {\n"
+ " arr[0] = this.responseText;\n"
+ " callback.run();\n"
+ " callback.@org.apidesign.bck2brwsr.launcher.fximpl.OnMessage::onMessage(Ljava/lang/String;)(this.responseText);\n"
+ " } catch (e) { alert(e); }\n"
+ "};\n"
+ "request.send();\n"
)
private static native void loadText(String url, Runnable callback, String[] arr) throws IOException;
private static native void loadText(String url, OnMessage callback) throws IOException;

public static void runHarness(String url) throws IOException {
new Console().harness(url);
@@ -129,19 +128,25 @@ public void harness(String url) throws IOException {
Request r = new Request(url);
}

private static class Request implements Runnable {
private static class Request implements Runnable, OnMessage {
private final String[] arr = { null };
private final String url;
private Case c;
private int retries;

private Request(String url) throws IOException {
this.url = url;
loadText(url, new Run(this), arr);
loadText(url, this);
}
private Request(String url, String u) throws IOException {
this.url = url;
loadText(u, new Run(this), arr);
loadText(u, this);
}

@Override
public void onMessage(String msg) {
arr[0] = msg;
run();
}

@Override
@@ -177,7 +182,7 @@ public void run() {
} catch (Exception ex) {
if (ex instanceof InterruptedException) {
log("Re-scheduling in 100ms");
schedule(new Run(this), 100);
schedule(this, 100);
return;
}
log(ex.getClass().getName() + ":" + ex.getMessage());
@@ -250,7 +255,11 @@ public static byte[] read(String name) throws IOException {
private static void turnAssetionStatusOn() {
}

@JavaScriptBody(args = { "r", "time" }, body = "return window.setTimeout(function() { r.run(); }, time);")
@JavaScriptBody(args = { "r", "time" }, javacall = true, body =
"return window.setTimeout(function() { "
+ "r.@java.lang.Runnable::run()(); "
+ "}, time);"
)
private static native Object schedule(Runnable r, int time);

private static final class Case {