mirror of
https://github.com/Eaglercraft-TeaVM-Fork/eagler-teavm.git
synced 2025-01-03 05:44:10 -08:00
Add mocks for WebSockets in html4j
This commit is contained in:
parent
a311f291aa
commit
385b696de9
|
@ -29,6 +29,7 @@ import org.netbeans.html.context.spi.Contexts;
|
||||||
import org.netbeans.html.json.spi.JSONCall;
|
import org.netbeans.html.json.spi.JSONCall;
|
||||||
import org.netbeans.html.json.spi.Technology;
|
import org.netbeans.html.json.spi.Technology;
|
||||||
import org.netbeans.html.json.spi.Transfer;
|
import org.netbeans.html.json.spi.Transfer;
|
||||||
|
import org.netbeans.html.json.spi.WSTransfer;
|
||||||
import org.netbeans.html.json.tck.KnockoutTCK;
|
import org.netbeans.html.json.tck.KnockoutTCK;
|
||||||
import org.netbeans.html.ko4j.KO4J;
|
import org.netbeans.html.ko4j.KO4J;
|
||||||
import org.teavm.jso.JSBody;
|
import org.teavm.jso.JSBody;
|
||||||
|
@ -43,23 +44,24 @@ import org.testng.Assert;
|
||||||
*
|
*
|
||||||
* @author Jaroslav Tulach <jtulach@netbeans.org>
|
* @author Jaroslav Tulach <jtulach@netbeans.org>
|
||||||
*/
|
*/
|
||||||
public final class KnockoutFXTest extends KnockoutTCK implements Transfer {
|
public final class KnockoutFXTest extends KnockoutTCK implements Transfer, WSTransfer<WSImpl> {
|
||||||
private static Class<?> browserClass;
|
private static Class<?> browserClass;
|
||||||
private static Fn.Presenter browserContext;
|
private static Fn.Presenter browserContext;
|
||||||
private KO4J ko4j = new KO4J();
|
private KO4J ko4j = new KO4J();
|
||||||
private final Map<String, Request> urlMap = new HashMap<>();
|
private final Map<String, Request> urlMap = new HashMap<>();
|
||||||
|
private final Map<String, WSImpl> wsUrlMap = new HashMap<>();
|
||||||
|
|
||||||
public KnockoutFXTest() {
|
public KnockoutFXTest() {
|
||||||
}
|
}
|
||||||
|
|
||||||
static synchronized ClassLoader getClassLoader() throws InterruptedException {
|
static ClassLoader getClassLoader() throws InterruptedException {
|
||||||
while (browserClass == null) {
|
while (browserClass == null) {
|
||||||
KnockoutFXTest.class.wait();
|
KnockoutFXTest.class.wait();
|
||||||
}
|
}
|
||||||
return browserClass.getClassLoader();
|
return browserClass.getClassLoader();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static synchronized void initialized(Class<?> browserCls) throws Exception {
|
public static void initialized(Class<?> browserCls) throws Exception {
|
||||||
browserClass = browserCls;
|
browserClass = browserCls;
|
||||||
browserContext = Fn.activePresenter();
|
browserContext = Fn.activePresenter();
|
||||||
KnockoutFXTest.class.notifyAll();
|
KnockoutFXTest.class.notifyAll();
|
||||||
|
@ -81,6 +83,7 @@ public final class KnockoutFXTest extends KnockoutTCK implements Transfer {
|
||||||
return Contexts.newBuilder()
|
return Contexts.newBuilder()
|
||||||
.register(Transfer.class, this, 1)
|
.register(Transfer.class, this, 1)
|
||||||
.register(Technology.class, ko4j.knockout(), 1)
|
.register(Technology.class, ko4j.knockout(), 1)
|
||||||
|
.register(WSTransfer.class, this, 1)
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -105,21 +108,24 @@ public final class KnockoutFXTest extends KnockoutTCK implements Transfer {
|
||||||
)
|
)
|
||||||
public native Object executeScript(String s, Object[] args);
|
public native Object executeScript(String s, Object[] args);
|
||||||
|
|
||||||
@JavaScriptBody(args = { }, body =
|
|
||||||
"var h;" +
|
|
||||||
"if (!!window && !!window.location && !!window.location.href)\n" +
|
|
||||||
" h = window.location.href;\n" +
|
|
||||||
"else " +
|
|
||||||
" h = null;" +
|
|
||||||
"return h;\n")
|
|
||||||
private static native String findBaseURL();
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public URI prepareURL(String content, String mimeType, String[] parameters) {
|
public URI prepareURL(String content, String mimeType, String[] parameters) {
|
||||||
try {
|
try {
|
||||||
|
boolean isWS = false;
|
||||||
|
for (String param : parameters) {
|
||||||
|
if (param.equals("protocol:ws")) {
|
||||||
|
isWS = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
String url = "http://localhost/dynamic/" + urlMap.size();
|
String url = "http://localhost/dynamic/" + urlMap.size();
|
||||||
|
if (!isWS) {
|
||||||
urlMap.put(url, new Request(content, mimeType, parameters));
|
urlMap.put(url, new Request(content, mimeType, parameters));
|
||||||
return new URI(url);
|
return new URI(url);
|
||||||
|
} else {
|
||||||
|
wsUrlMap.put(url, new WSImpl(url, content));
|
||||||
|
return new URI(url);
|
||||||
|
}
|
||||||
} catch (URISyntaxException ex) {
|
} catch (URISyntaxException ex) {
|
||||||
throw new IllegalStateException(ex);
|
throw new IllegalStateException(ex);
|
||||||
}
|
}
|
||||||
|
@ -224,6 +230,43 @@ public final class KnockoutFXTest extends KnockoutTCK implements Transfer {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public WSImpl open(String url, JSONCall callback) {
|
||||||
|
WSImpl impl = wsUrlMap.get(url);
|
||||||
|
if (impl != null) {
|
||||||
|
impl.callback = callback;
|
||||||
|
callback.notifySuccess(null);
|
||||||
|
} else {
|
||||||
|
callback.notifyError(null);
|
||||||
|
}
|
||||||
|
return impl;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void send(WSImpl socket, JSONCall data) {
|
||||||
|
String content = socket.content;
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
for (int i = 0; i < content.length(); i++) {
|
||||||
|
if (content.charAt(i) == '$') {
|
||||||
|
int digit = content.charAt(++i) - '0';
|
||||||
|
if (digit == 0) {
|
||||||
|
sb.append(data.getMessage());
|
||||||
|
} else {
|
||||||
|
sb.append('$').append(content.charAt(i));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
sb.append(content.charAt(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
socket.callback.notifySuccess(eval("(" + sb + ")"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close(WSImpl socket) {
|
||||||
|
wsUrlMap.remove(socket.url);
|
||||||
|
socket.callback.notifyError(null);
|
||||||
|
}
|
||||||
|
|
||||||
@JSBody(params = { "name", "callback" }, script = "window[name] = callback;")
|
@JSBody(params = { "name", "callback" }, script = "window[name] = callback;")
|
||||||
private static native void defineFunction(String name, JSONPCallback callback);
|
private static native void defineFunction(String name, JSONPCallback callback);
|
||||||
|
|
||||||
|
@ -235,6 +278,9 @@ public final class KnockoutFXTest extends KnockoutTCK implements Transfer {
|
||||||
void dataReceived(JSObject dataReceived);
|
void dataReceived(JSObject dataReceived);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@JSBody(params = "text", script = "return eval(text);")
|
||||||
|
private static native JSObject eval(String text);
|
||||||
|
|
||||||
private static final class Request {
|
private static final class Request {
|
||||||
final String content;
|
final String content;
|
||||||
final String mimeType;
|
final String mimeType;
|
||||||
|
|
18
html4j/src/test/java/org/teavm/html4j/test/WSImpl.java
Normal file
18
html4j/src/test/java/org/teavm/html4j/test/WSImpl.java
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
package org.teavm.html4j.test;
|
||||||
|
|
||||||
|
import org.netbeans.html.json.spi.JSONCall;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Alexey Andreev
|
||||||
|
*/
|
||||||
|
class WSImpl {
|
||||||
|
String url;
|
||||||
|
JSONCall callback;
|
||||||
|
String content;
|
||||||
|
|
||||||
|
public WSImpl(String url, String content) {
|
||||||
|
this.url = url;
|
||||||
|
this.content = content;
|
||||||
|
}
|
||||||
|
}
|
|
@ -19,7 +19,6 @@ import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import org.mozilla.javascript.Token;
|
import org.mozilla.javascript.Token;
|
||||||
import org.mozilla.javascript.ast.AstNode;
|
import org.mozilla.javascript.ast.AstNode;
|
||||||
import org.mozilla.javascript.ast.AstRoot;
|
|
||||||
import org.mozilla.javascript.ast.ExpressionStatement;
|
import org.mozilla.javascript.ast.ExpressionStatement;
|
||||||
import org.mozilla.javascript.ast.Name;
|
import org.mozilla.javascript.ast.Name;
|
||||||
import org.mozilla.javascript.ast.NodeVisitor;
|
import org.mozilla.javascript.ast.NodeVisitor;
|
||||||
|
@ -37,7 +36,7 @@ final class JSBodyInlineUtil {
|
||||||
private JSBodyInlineUtil() {
|
private JSBodyInlineUtil() {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static AstNode isSuitableForInlining(MethodReference method, String[] parameters, AstRoot ast) {
|
public static AstNode isSuitableForInlining(MethodReference method, String[] parameters, AstNode ast) {
|
||||||
AstNode statement = isSingleStatement(ast);
|
AstNode statement = isSingleStatement(ast);
|
||||||
if (statement == null) {
|
if (statement == null) {
|
||||||
return null;
|
return null;
|
||||||
|
|
|
@ -29,6 +29,7 @@ import org.mozilla.javascript.CompilerEnvirons;
|
||||||
import org.mozilla.javascript.Context;
|
import org.mozilla.javascript.Context;
|
||||||
import org.mozilla.javascript.ast.AstNode;
|
import org.mozilla.javascript.ast.AstNode;
|
||||||
import org.mozilla.javascript.ast.AstRoot;
|
import org.mozilla.javascript.ast.AstRoot;
|
||||||
|
import org.mozilla.javascript.ast.FunctionNode;
|
||||||
import org.teavm.diagnostics.Diagnostics;
|
import org.teavm.diagnostics.Diagnostics;
|
||||||
import org.teavm.javascript.spi.GeneratedBy;
|
import org.teavm.javascript.spi.GeneratedBy;
|
||||||
import org.teavm.javascript.spi.InjectedBy;
|
import org.teavm.javascript.spi.InjectedBy;
|
||||||
|
@ -562,14 +563,15 @@ class JSClassProcessor {
|
||||||
env.setLanguageVersion(Context.VERSION_1_8);
|
env.setLanguageVersion(Context.VERSION_1_8);
|
||||||
env.setIdeMode(true);
|
env.setIdeMode(true);
|
||||||
JSParser parser = new JSParser(env, errorReporter);
|
JSParser parser = new JSParser(env, errorReporter);
|
||||||
parser.enterFunction();
|
//parser.enterFunction();
|
||||||
AstRoot rootNode;
|
AstRoot rootNode;
|
||||||
try {
|
try {
|
||||||
rootNode = parser.parse(new StringReader(script), null, 0);
|
rootNode = parser.parse(new StringReader("function(){" + script + "}"), null, 0);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
throw new RuntimeException("IO Error occured", e);
|
throw new RuntimeException("IO Error occured", e);
|
||||||
}
|
}
|
||||||
parser.exitFunction();
|
AstNode body = ((FunctionNode) rootNode.getFirstChild()).getBody();
|
||||||
|
//parser.exitFunction();
|
||||||
|
|
||||||
repository.methodMap.put(methodToProcess.getReference(), proxyMethod);
|
repository.methodMap.put(methodToProcess.getReference(), proxyMethod);
|
||||||
if (errorReporter.hasErrors()) {
|
if (errorReporter.hasErrors()) {
|
||||||
|
@ -577,11 +579,11 @@ class JSClassProcessor {
|
||||||
script, parameterNames));
|
script, parameterNames));
|
||||||
} else {
|
} else {
|
||||||
AstNode expr = JSBodyInlineUtil.isSuitableForInlining(methodToProcess.getReference(),
|
AstNode expr = JSBodyInlineUtil.isSuitableForInlining(methodToProcess.getReference(),
|
||||||
parameterNames, rootNode);
|
parameterNames, body);
|
||||||
if (expr != null) {
|
if (expr != null) {
|
||||||
repository.inlineMethods.add(methodToProcess.getReference());
|
repository.inlineMethods.add(methodToProcess.getReference());
|
||||||
} else {
|
} else {
|
||||||
expr = rootNode;
|
expr = body;
|
||||||
}
|
}
|
||||||
javaInvocationProcessor.process(location, expr);
|
javaInvocationProcessor.process(location, expr);
|
||||||
repository.emitters.put(proxyMethod, new JSBodyAstEmitter(isStatic, expr, parameterNames));
|
repository.emitters.put(proxyMethod, new JSBodyAstEmitter(isStatic, expr, parameterNames));
|
||||||
|
|
Loading…
Reference in New Issue
Block a user