# HG changeset patch # User Jaroslav Tulach # Date 1377786901 0 # Node ID a936dd8280dc193d01d48d69665e0b6a98227239 # Parent e414f379f37829ee1699425551a6d6ac3cd94bac WebSocketTest passes OK against modified version of 0.5 net.java.html APIs - rev. b04268c0ded9 diff -r e414f379f378 -r a936dd8280dc ko/bck2brwsr/pom.xml --- a/ko/bck2brwsr/pom.xml Thu Aug 29 08:00:42 2013 +0000 +++ b/ko/bck2brwsr/pom.xml Thu Aug 29 14:35:01 2013 +0000 @@ -92,5 +92,11 @@ ${project.version} jar + + org.apidesign.html + net.java.html.boot + 0.5 + jar + diff -r e414f379f378 -r a936dd8280dc ko/bck2brwsr/src/main/java/org/apidesign/bck2brwsr/ko2brwsr/BrwsrCtxImpl.java --- a/ko/bck2brwsr/src/main/java/org/apidesign/bck2brwsr/ko2brwsr/BrwsrCtxImpl.java Thu Aug 29 08:00:42 2013 +0000 +++ b/ko/bck2brwsr/src/main/java/org/apidesign/bck2brwsr/ko2brwsr/BrwsrCtxImpl.java Thu Aug 29 14:35:01 2013 +0000 @@ -26,12 +26,13 @@ import org.apidesign.html.json.spi.PropertyBinding; import org.apidesign.html.json.spi.Technology; import org.apidesign.html.json.spi.Transfer; +import org.apidesign.html.json.spi.WSTransfer; /** * * @author Jaroslav Tulach */ -final class BrwsrCtxImpl implements Technology, Transfer { +final class BrwsrCtxImpl implements Technology, Transfer, WSTransfer { private BrwsrCtxImpl() {} public static final BrwsrCtxImpl DEFAULT = new BrwsrCtxImpl(); @@ -126,4 +127,19 @@ public void runSafe(Runnable r) { r.run(); } + + @Override + public LoadWS open(String url, JSONCall callback) { + return new LoadWS(callback, url); + } + + @Override + public void send(LoadWS socket, JSONCall data) { + socket.send(data); + } + + @Override + public void close(LoadWS socket) { + socket.close(); + } } diff -r e414f379f378 -r a936dd8280dc ko/bck2brwsr/src/main/java/org/apidesign/bck2brwsr/ko2brwsr/LoadWS.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ko/bck2brwsr/src/main/java/org/apidesign/bck2brwsr/ko2brwsr/LoadWS.java Thu Aug 29 14:35:01 2013 +0000 @@ -0,0 +1,126 @@ +/** + * Back 2 Browser Bytecode Translator + * Copyright (C) 2012 Jaroslav Tulach + * + * 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 net.java.html.js.JavaScriptBody; +import org.apidesign.html.json.spi.JSONCall; + +/** Communication with WebSockets for WebView 1.8. + * + * @author Jaroslav Tulach + */ +final class LoadWS { + private static final boolean SUPPORTED = isWebSocket(); + private final Object ws; + private final JSONCall call; + LoadWS(JSONCall first, String url) { + call = first; + ws = initWebSocket(this, url); + if (ws == null) { + first.notifyError(new IllegalArgumentException("Wrong URL: " + url)); + } + } + + static boolean isSupported() { + return SUPPORTED; + } + + void send(JSONCall call) { + push(call); + } + + private synchronized void push(JSONCall call) { + send(ws, call.getMessage()); + } + + void onOpen(Object ev) { + if (!call.isDoOutput()) { + call.notifySuccess(null); + } + } + + + @JavaScriptBody(args = { "data" }, body = "try {\n" + + " return eval('(' + data + ')');\n" + + " } catch (error) {;\n" + + " return data;\n" + + " }\n" + ) + private static native Object toJSON(String data); + + void onMessage(Object ev, String data) { + Object json = toJSON(data); + call.notifySuccess(json); + } + + void onError(Object ev) { + call.notifyError(new Exception(ev.toString())); + } + + void onClose(boolean wasClean, int code, String reason) { + call.notifyError(null); + } + + @JavaScriptBody(args = {}, body = "if (window.WebSocket) return true; else return false;") + private static boolean isWebSocket() { + return false; + } + + @JavaScriptBody(args = { "back", "url" }, javacall = true, body = "" + + "if (window.WebSocket) {\n" + + " try {\n" + + " var ws = new window.WebSocket(url);\n" + + " ws.onopen = function(ev) {\n" + + " back.@org.apidesign.bck2brwsr.ko2brwsr.LoadWS::onOpen(Ljava/lang/Object;)(ev);\n" + + " };\n" + + " ws.onmessage = function(ev) {\n" + + " back.@org.apidesign.bck2brwsr.ko2brwsr.LoadWS::onMessage(Ljava/lang/Object;Ljava/lang/String;)(ev, ev.data);\n" + + " };\n" + + " ws.onerror = function(ev) {\n" + + " back.@org.apidesign.bck2brwsr.ko2brwsr.LoadWS::onError(Ljava/lang/Object;)(ev);\n" + + " };\n" + + " ws.onclose = function(ev) {\n" + + " back.@org.apidesign.bck2brwsr.ko2brwsr.LoadWS::onClose(ZILjava/lang/String;)(ev.wasClean, ev.code, ev.reason);\n" + + " };\n" + + " return ws;\n" + + " } catch (ex) {\n" + + " return null;\n" + + " }\n" + + "} else {\n" + + " return null;\n" + + "}\n" + ) + private static Object initWebSocket(Object back, String url) { + return null; + } + + + @JavaScriptBody(args = { "ws", "msg" }, body = "" + + "ws.send(msg);" + ) + private void send(Object ws, String msg) { + } + + @JavaScriptBody(args = { "ws" }, body = "ws.close();") + private static void close(Object ws) { + } + + void close() { + close(ws); + } +} diff -r e414f379f378 -r a936dd8280dc ko/bck2brwsr/src/test/java/org/apidesign/bck2brwsr/ko2brwsr/Bck2BrwsrKnockoutTest.java --- a/ko/bck2brwsr/src/test/java/org/apidesign/bck2brwsr/ko2brwsr/Bck2BrwsrKnockoutTest.java Thu Aug 29 08:00:42 2013 +0000 +++ b/ko/bck2brwsr/src/test/java/org/apidesign/bck2brwsr/ko2brwsr/Bck2BrwsrKnockoutTest.java Thu Aug 29 14:35:01 2013 +0000 @@ -28,6 +28,7 @@ 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.openide.util.lookup.ServiceProvider; @@ -51,6 +52,7 @@ public BrwsrCtx createContext() { return Contexts.newBuilder(). register(Transfer.class, BrwsrCtxImpl.DEFAULT, 9). + register(WSTransfer.class, BrwsrCtxImpl.DEFAULT, 9). register(Technology.class, BrwsrCtxImpl.DEFAULT, 9).build(); } diff -r e414f379f378 -r a936dd8280dc launcher/fx/src/main/java/org/apidesign/bck2brwsr/launcher/BaseHTTPLauncher.java --- a/launcher/fx/src/main/java/org/apidesign/bck2brwsr/launcher/BaseHTTPLauncher.java Thu Aug 29 08:00:42 2013 +0000 +++ b/launcher/fx/src/main/java/org/apidesign/bck2brwsr/launcher/BaseHTTPLauncher.java Thu Aug 29 14:35:01 2013 +0000 @@ -157,29 +157,29 @@ private HttpServer initServer(String path, boolean addClasses) throws IOException { HttpServer s = HttpServer.createSimpleServer(path, new PortRange(8080, 65535)); - final WebSocketAddOn addon = new WebSocketAddOn(); - for (NetworkListener listener : s.getListeners()) { - listener.registerAddOn(addon); - } - + /* ThreadPoolConfig fewThreads = ThreadPoolConfig.defaultConfig().copy(). setPoolName("Fx/Bck2 Brwsr"). - setCorePoolSize(1). + setCorePoolSize(3). setMaxPoolSize(5); ThreadPoolConfig oneKernel = ThreadPoolConfig.defaultConfig().copy(). setPoolName("Kernel Fx/Bck2"). - setCorePoolSize(1). + setCorePoolSize(3). setMaxPoolSize(3); for (NetworkListener nl : s.getListeners()) { nl.getTransport().setWorkerThreadPoolConfig(fewThreads); nl.getTransport().setKernelThreadPoolConfig(oneKernel); } - + */ final ServerConfiguration conf = s.getServerConfiguration(); if (addClasses) { conf.addHttpHandler(new VM(), "/bck2brwsr.js"); conf.addHttpHandler(new Classes(resources), "/classes/"); } + final WebSocketAddOn addon = new WebSocketAddOn(); + for (NetworkListener listener : s.getListeners()) { + listener.registerAddOn(addon); + } return s; } diff -r e414f379f378 -r a936dd8280dc launcher/pom.xml --- a/launcher/pom.xml Thu Aug 29 08:00:42 2013 +0000 +++ b/launcher/pom.xml Thu Aug 29 14:35:01 2013 +0000 @@ -12,7 +12,7 @@ pom Launchers - 2.3.2 + 2.3.3 api