# HG changeset patch # User Jaroslav Tulach # Date 1358878598 -3600 # Node ID a0d8b5ab79a24b195ef73c1836887d389ab325e9 # Parent ec343ebe862e842477af229cb12f0b7c21add34d @BrwsrTest can reference @HtmlFragment and manipulate it diff -r ec343ebe862e -r a0d8b5ab79a2 launcher/src/main/java/org/apidesign/bck2brwsr/launcher/Bck2BrwsrLauncher.java --- a/launcher/src/main/java/org/apidesign/bck2brwsr/launcher/Bck2BrwsrLauncher.java Tue Jan 22 18:07:23 2013 +0100 +++ b/launcher/src/main/java/org/apidesign/bck2brwsr/launcher/Bck2BrwsrLauncher.java Tue Jan 22 19:16:38 2013 +0100 @@ -55,7 +55,7 @@ */ final class Bck2BrwsrLauncher extends Launcher implements Closeable { private static final Logger LOG = Logger.getLogger(Bck2BrwsrLauncher.class.getName()); - private static final MethodInvocation END = new MethodInvocation(null, null); + private static final MethodInvocation END = new MethodInvocation(null, null, null); private Set loaders = new LinkedHashSet<>(); private BlockingQueue methods = new LinkedBlockingQueue<>(); private long timeOut; @@ -70,9 +70,9 @@ } @Override - public MethodInvocation addMethod(Class clazz, String method) throws IOException { + MethodInvocation addMethod(Class clazz, String method, String html) throws IOException { loaders.add(clazz.getClassLoader()); - MethodInvocation c = new MethodInvocation(clazz.getName(), method); + MethodInvocation c = new MethodInvocation(clazz.getName(), method, html); methods.add(c); try { c.await(timeOut); @@ -174,7 +174,13 @@ + "className: '" + cn + "', " + "methodName: '" + mn + "', " + "request: " + cnt - + "}"); + ); + if (mi.html != null) { + response.getWriter().write(", html: '"); + response.getWriter().write(encodeJSON(mi.html)); + response.getWriter().write("'"); + } + response.getWriter().write("}"); cnt++; } }, "/data"); @@ -182,6 +188,22 @@ this.brwsr = launchServerAndBrwsr(server, "/execute"); } + private static String encodeJSON(String in) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < in.length(); i++) { + char ch = in.charAt(i); + if (ch < 32 || ch == '\'' || ch == '"') { + sb.append("\\u"); + String hs = "0000" + Integer.toHexString(ch); + hs = hs.substring(hs.length() - 4); + sb.append(hs); + } else { + sb.append(ch); + } + } + return sb.toString(); + } + @Override public void shutdown() throws IOException { methods.offer(END); @@ -348,7 +370,7 @@ public Page(Res res, String resource, String... args) { this.res = res; this.resource = resource; - this.args = args; + this.args = args.length == 0 ? new String[] { "$0" } : args; } @Override diff -r ec343ebe862e -r a0d8b5ab79a2 launcher/src/main/java/org/apidesign/bck2brwsr/launcher/Console.java --- a/launcher/src/main/java/org/apidesign/bck2brwsr/launcher/Console.java Tue Jan 22 18:07:23 2013 +0100 +++ b/launcher/src/main/java/org/apidesign/bck2brwsr/launcher/Console.java Tue Jan 22 19:16:38 2013 +0100 @@ -53,7 +53,7 @@ private static native void closeWindow(); private static void log(String newText) { - String id = "result"; + String id = "bck2brwsr.result"; String attr = "value"; setAttr(id, attr, getAttr(id, attr) + "\n" + newText); setAttr(id, "scrollTop", getAttr(id, "scrollHeight")); @@ -63,7 +63,7 @@ String clazz = (String) getAttr("clazz", "value"); String method = (String) getAttr("method", "value"); Object res = invokeMethod(clazz, method); - setAttr("result", "value", res); + setAttr("bck2brwsr.result", "value", res); } @JavaScriptBody(args = { "url", "callback", "arr" }, body = "" @@ -111,10 +111,14 @@ } Case c = Case.parseData(data); + if (c.getHtmlFragment() != null) { + setAttr("bck2brwsr.fragment", "innerHTML", c.getHtmlFragment()); + } log("Invoking " + c.getClassName() + '.' + c.getMethodName() + " as request: " + c.getRequestId()); Object result = invokeMethod(c.getClassName(), c.getMethodName()); + setAttr("bck2brwsr.fragment", "innerHTML", ""); log("Result: " + result); result = encodeURL("" + result); @@ -237,11 +241,19 @@ public String getRequestId() { return value("request", data); } + + public String getHtmlFragment() { + return value("html", data); + } @JavaScriptBody(args = "s", body = "return eval('(' + s + ')');") private static native Object toJSON(String s); - @JavaScriptBody(args = {"p", "d"}, body = "return d[p].toString();") + @JavaScriptBody(args = {"p", "d"}, body = + "var v = d[p];\n" + + "if (typeof v === 'undefined') return null;\n" + + "return v.toString();" + ) private static native String value(String p, Object d); } } diff -r ec343ebe862e -r a0d8b5ab79a2 launcher/src/main/java/org/apidesign/bck2brwsr/launcher/JSLauncher.java --- a/launcher/src/main/java/org/apidesign/bck2brwsr/launcher/JSLauncher.java Tue Jan 22 18:07:23 2013 +0100 +++ b/launcher/src/main/java/org/apidesign/bck2brwsr/launcher/JSLauncher.java Tue Jan 22 19:16:38 2013 +0100 @@ -42,10 +42,9 @@ private Object console; - @Override - public MethodInvocation addMethod(Class clazz, String method) { + @Override MethodInvocation addMethod(Class clazz, String method, String html) { loaders.add(clazz.getClassLoader()); - MethodInvocation mi = new MethodInvocation(clazz.getName(), method); + MethodInvocation mi = new MethodInvocation(clazz.getName(), method, html); try { mi.result(code.invokeMethod( console, diff -r ec343ebe862e -r a0d8b5ab79a2 launcher/src/main/java/org/apidesign/bck2brwsr/launcher/Launcher.java --- a/launcher/src/main/java/org/apidesign/bck2brwsr/launcher/Launcher.java Tue Jan 22 18:07:23 2013 +0100 +++ b/launcher/src/main/java/org/apidesign/bck2brwsr/launcher/Launcher.java Tue Jan 22 19:16:38 2013 +0100 @@ -32,12 +32,12 @@ Launcher() { } - abstract MethodInvocation addMethod(Class clazz, String method) throws IOException; + abstract MethodInvocation addMethod(Class clazz, String method, String html) throws IOException; public abstract void initialize() throws IOException; public abstract void shutdown() throws IOException; - public MethodInvocation invokeMethod(Class clazz, String method) throws IOException { - return addMethod(clazz, method); + public MethodInvocation invokeMethod(Class clazz, String method, String html) throws IOException { + return addMethod(clazz, method, html); } diff -r ec343ebe862e -r a0d8b5ab79a2 launcher/src/main/java/org/apidesign/bck2brwsr/launcher/MethodInvocation.java --- a/launcher/src/main/java/org/apidesign/bck2brwsr/launcher/MethodInvocation.java Tue Jan 22 18:07:23 2013 +0100 +++ b/launcher/src/main/java/org/apidesign/bck2brwsr/launcher/MethodInvocation.java Tue Jan 22 19:16:38 2013 +0100 @@ -28,12 +28,14 @@ final CountDownLatch wait = new CountDownLatch(1); final String className; final String methodName; + final String html; private String result; private Throwable exception; - MethodInvocation(String className, String methodName) { + MethodInvocation(String className, String methodName, String html) { this.className = className; this.methodName = methodName; + this.html = html; } void await(long timeOut) throws InterruptedException { diff -r ec343ebe862e -r a0d8b5ab79a2 launcher/src/main/resources/org/apidesign/bck2brwsr/launcher/harness.xhtml --- a/launcher/src/main/resources/org/apidesign/bck2brwsr/launcher/harness.xhtml Tue Jan 22 18:07:23 2013 +0100 +++ b/launcher/src/main/resources/org/apidesign/bck2brwsr/launcher/harness.xhtml Tue Jan 22 19:16:38 2013 +0100 @@ -27,10 +27,12 @@ -

Bck2Browser Execution Harness

+

Bck2Brwsr Execution Harness

- + +