Using HTTP protocol rather than reflection tricks as HTTP will work on all known implementations
diff --git a/ko-bck2brwsr/src/test/java/org/apidesign/html/ko2brwsr/Bck2BrwsrKnockoutTest.java b/ko-bck2brwsr/src/test/java/org/apidesign/html/ko2brwsr/Bck2BrwsrKnockoutTest.java
index 891551c..d57451e 100644
--- a/ko-bck2brwsr/src/test/java/org/apidesign/html/ko2brwsr/Bck2BrwsrKnockoutTest.java
+++ b/ko-bck2brwsr/src/test/java/org/apidesign/html/ko2brwsr/Bck2BrwsrKnockoutTest.java
@@ -20,6 +20,13 @@
*/
package org.apidesign.html.ko2brwsr;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.net.URLConnection;
import java.util.Map;
import net.java.html.BrwsrCtx;
import org.apidesign.bck2brwsr.core.JavaScriptBody;
@@ -27,6 +34,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.tck.KOTest;
import org.apidesign.html.json.tck.KnockoutTCK;
import org.openide.util.lookup.ServiceProvider;
import org.testng.annotations.Factory;
@@ -41,6 +49,7 @@
return VMTest.newTests().
withClasses(testClasses()).
withLaunchers("bck2brwsr").
+ withTestAnnotation(KOTest.class).
build();
}
@@ -78,4 +87,38 @@
"var f = new Function(s); return f.apply(null, args);"
)
private static native Object execScript(String s, Object[] arguments);
+
+ @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
+ public URI prepareURL(String content, String mimeType, String[] parameters) {
+ try {
+ final URL baseURL = new URL(findBaseURL());
+ StringBuilder sb = new StringBuilder();
+ sb.append("/dynamic?mimeType=").append(mimeType);
+ for (int i = 0; i < parameters.length; i++) {
+ sb.append("¶m" + i).append("=").append(parameters[i]);
+ }
+ String mangle = content.replace("\n", "%0a")
+ .replace("\"", "\\\"").replace(" ", "%20");
+ sb.append("&content=").append(mangle);
+
+ URL query = new URL(baseURL, sb.toString());
+ String uri = (String) query.getContent(new Class[] { String.class });
+ URI connectTo = new URI(uri.trim());
+ return connectTo;
+ } catch (IOException ex) {
+ throw new IllegalStateException(ex);
+ } catch (URISyntaxException ex) {
+ throw new IllegalStateException(ex);
+ }
+ }
}
diff --git a/ko-fx/src/test/java/org/apidesign/html/kofx/KnockoutFXTest.java b/ko-fx/src/test/java/org/apidesign/html/kofx/KnockoutFXTest.java
index 3f8a698..89190b7 100644
--- a/ko-fx/src/test/java/org/apidesign/html/kofx/KnockoutFXTest.java
+++ b/ko-fx/src/test/java/org/apidesign/html/kofx/KnockoutFXTest.java
@@ -20,14 +20,18 @@
*/
package org.apidesign.html.kofx;
-import java.io.ByteArrayInputStream;
-import java.io.InputStream;
-import java.lang.reflect.Method;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.PrintWriter;
+import java.net.HttpURLConnection;
import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.net.URLConnection;
import java.util.Map;
import net.java.html.BrwsrCtx;
import net.java.html.js.JavaScriptBody;
-import org.apidesign.bck2brwsr.launcher.InvocationContext;
import org.apidesign.bck2brwsr.vmtest.VMTest;
import org.apidesign.html.context.spi.Contexts;
import org.apidesign.html.json.spi.Technology;
@@ -84,17 +88,37 @@
)
public native Object executeScript(String script, Object[] arguments);
+ @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
public URI prepareURL(String content, String mimeType, String[] parameters) {
- ByteArrayInputStream is = new ByteArrayInputStream(content.getBytes());
try {
- Class<?> real = ClassLoader.getSystemClassLoader().loadClass(InvocationContext.class.getName());
- Method m = real.getMethod("register", InputStream.class, String.class, String.class, String[].class);
- return (URI) m.invoke(null, is,
- mimeType, "/dynamic/res" + content.hashCode(),
- parameters
- );
- } catch (Exception ex) {
+ final URL baseURL = new URL(findBaseURL());
+ StringBuilder sb = new StringBuilder();
+ sb.append("/dynamic?mimeType=").append(mimeType);
+ for (int i = 0; i < parameters.length; i++) {
+ sb.append("¶m" + i).append("=").append(parameters[i]);
+ }
+ String mangle = content.replace("\n", "%0a")
+ .replace("\"", "\\\"").replace(" ", "%20");
+ sb.append("&content=").append(mangle);
+
+ URL query = new URL(baseURL, sb.toString());
+ URLConnection c = query.openConnection();
+ BufferedReader br = new BufferedReader(new InputStreamReader(c.getInputStream()));
+ URI connectTo = new URI(br.readLine());
+ return connectTo;
+ } catch (IOException ex) {
+ throw new IllegalStateException(ex);
+ } catch (URISyntaxException ex) {
throw new IllegalStateException(ex);
}
}