jaroslav@1230: /** jaroslav@1230: * Back 2 Browser Bytecode Translator jaroslav@1230: * Copyright (C) 2012 Jaroslav Tulach jaroslav@1230: * jaroslav@1230: * This program is free software: you can redistribute it and/or modify jaroslav@1230: * it under the terms of the GNU General Public License as published by jaroslav@1230: * the Free Software Foundation, version 2 of the License. jaroslav@1230: * jaroslav@1230: * This program is distributed in the hope that it will be useful, jaroslav@1230: * but WITHOUT ANY WARRANTY; without even the implied warranty of jaroslav@1230: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the jaroslav@1230: * GNU General Public License for more details. jaroslav@1230: * jaroslav@1230: * You should have received a copy of the GNU General Public License jaroslav@1230: * along with this program. Look for COPYING file in the top folder. jaroslav@1230: * If not, see http://opensource.org/licenses/GPL-2.0. jaroslav@1230: */ jaroslav@1230: package org.apidesign.bck2brwsr.kofx; jaroslav@1230: jaroslav@1230: import java.io.BufferedReader; jaroslav@1230: import java.io.IOException; jaroslav@1230: import java.io.InputStreamReader; jaroslav@1230: import java.net.URI; jaroslav@1230: import java.net.URISyntaxException; jaroslav@1230: import java.net.URL; jaroslav@1230: import java.net.URLConnection; jaroslav@1230: import java.util.Map; jaroslav@1230: import net.java.html.BrwsrCtx; jaroslav@1230: import net.java.html.js.JavaScriptBody; jaroslav@1230: import org.apidesign.bck2brwsr.vmtest.VMTest; jaroslav@1418: import org.apidesign.html.boot.spi.Fn; jaroslav@1230: import org.apidesign.html.context.spi.Contexts; jaroslav@1230: import org.apidesign.html.json.spi.Technology; jaroslav@1230: import org.apidesign.html.json.spi.Transfer; jaroslav@1249: import org.apidesign.html.json.spi.WSTransfer; jaroslav@1230: import org.apidesign.html.json.tck.KOTest; jaroslav@1230: import org.apidesign.html.json.tck.KnockoutTCK; jaroslav@1230: import org.json.JSONException; jaroslav@1230: import org.json.JSONObject; jaroslav@1424: import org.netbeans.html.ko4j.KO4J; jaroslav@1418: import org.netbeans.html.wstyrus.TyrusContext; jaroslav@1230: import org.openide.util.lookup.ServiceProvider; jaroslav@1230: import org.testng.annotations.Factory; jaroslav@1230: jaroslav@1230: /** jaroslav@1230: * jaroslav@1230: * @author Jaroslav Tulach jaroslav@1230: */ jaroslav@1230: @ServiceProvider(service = KnockoutTCK.class) jaroslav@1230: public final class KnockoutFXTest extends KnockoutTCK { jaroslav@1230: public KnockoutFXTest() { jaroslav@1230: } jaroslav@1230: jaroslav@1230: @Factory public static Object[] compatibilityTests() { jaroslav@1230: return VMTest.newTests(). jaroslav@1230: withClasses(testClasses()). jaroslav@1230: withTestAnnotation(KOTest.class). jaroslav@1230: withLaunchers("fxbrwsr").build(); jaroslav@1230: } jaroslav@1230: jaroslav@1230: @Override jaroslav@1230: public BrwsrCtx createContext() { jaroslav@1424: KO4J ko = new KO4J(Fn.activePresenter()); jaroslav@1249: TyrusContext tc = new TyrusContext(); jaroslav@1249: Contexts.Builder b = Contexts.newBuilder(). jaroslav@1424: register(Technology.class, ko.knockout(), 10). jaroslav@1424: register(Transfer.class, ko.transferViaOrgJSON(), 10); jaroslav@1249: try { jaroslav@1249: Class.forName("java.util.function.Function"); jaroslav@1249: // prefer WebView's WebSockets on JDK8 jaroslav@1424: b.register(WSTransfer.class, ko.websocketsViaBrowser(), 10); jaroslav@1249: } catch (ClassNotFoundException ex) { jaroslav@1249: // ok, JDK7 needs tyrus jaroslav@1249: b.register(WSTransfer.class, tc, 20); jaroslav@1249: } jaroslav@1249: return b.build(); jaroslav@1230: } jaroslav@1230: jaroslav@1230: @Override jaroslav@1230: public Object createJSON(Map values) { jaroslav@1230: JSONObject json = new JSONObject(); jaroslav@1230: for (Map.Entry entry : values.entrySet()) { jaroslav@1230: try { jaroslav@1230: json.put(entry.getKey(), entry.getValue()); jaroslav@1230: } catch (JSONException ex) { jaroslav@1230: throw new IllegalStateException(ex); jaroslav@1230: } jaroslav@1230: } jaroslav@1230: return json; jaroslav@1230: } jaroslav@1230: jaroslav@1230: @Override jaroslav@1230: @JavaScriptBody(args = { "s", "args" }, body = "" jaroslav@1230: + "var f = new Function(s); " jaroslav@1230: + "return f.apply(null, args);" jaroslav@1230: ) jaroslav@1230: public native Object executeScript(String script, Object[] arguments); jaroslav@1230: jaroslav@1230: @JavaScriptBody(args = { }, body = jaroslav@1230: "var h;" jaroslav@1230: + "if (!!window && !!window.location && !!window.location.href)\n" jaroslav@1230: + " h = window.location.href;\n" jaroslav@1230: + "else " jaroslav@1230: + " h = null;" jaroslav@1230: + "return h;\n" jaroslav@1230: ) jaroslav@1230: private static native String findBaseURL(); jaroslav@1230: jaroslav@1230: @Override jaroslav@1230: public URI prepareURL(String content, String mimeType, String[] parameters) { jaroslav@1230: try { jaroslav@1230: final URL baseURL = new URL(findBaseURL()); jaroslav@1230: StringBuilder sb = new StringBuilder(); jaroslav@1230: sb.append("/dynamic?mimeType=").append(mimeType); jaroslav@1230: for (int i = 0; i < parameters.length; i++) { jaroslav@1230: sb.append("¶m" + i).append("=").append(parameters[i]); jaroslav@1230: } jaroslav@1230: String mangle = content.replace("\n", "%0a") jaroslav@1230: .replace("\"", "\\\"").replace(" ", "%20"); jaroslav@1230: sb.append("&content=").append(mangle); jaroslav@1230: jaroslav@1230: URL query = new URL(baseURL, sb.toString()); jaroslav@1230: URLConnection c = query.openConnection(); jaroslav@1230: BufferedReader br = new BufferedReader(new InputStreamReader(c.getInputStream())); jaroslav@1230: URI connectTo = new URI(br.readLine()); jaroslav@1230: return connectTo; jaroslav@1230: } catch (IOException ex) { jaroslav@1230: throw new IllegalStateException(ex); jaroslav@1230: } catch (URISyntaxException ex) { jaroslav@1230: throw new IllegalStateException(ex); jaroslav@1230: } jaroslav@1230: } jaroslav@1230: }