# HG changeset patch # User Jaroslav Tulach # Date 1460957555 -7200 # Node ID cff680298793c833a0c9cbd08fb65aaddc165847 # Parent 789849cabcc74dac755365480589a17e091c9f62 Launcher.createBrowser can specify its own page diff -r 789849cabcc7 -r cff680298793 launcher/api/src/main/java/org/apidesign/bck2brwsr/launcher/Launcher.java --- a/launcher/api/src/main/java/org/apidesign/bck2brwsr/launcher/Launcher.java Mon Apr 18 05:15:11 2016 +0200 +++ b/launcher/api/src/main/java/org/apidesign/bck2brwsr/launcher/Launcher.java Mon Apr 18 07:32:35 2016 +0200 @@ -79,6 +79,18 @@ * @return launcher executing in external browser. */ public static Launcher createBrowser(String cmd) { + return createBrowser(cmd, null, null); + } + + /** Creates launcher that is using external browser. + * + * @param classes classloader offering access to classes and resources + * @param startpage page to show in the browser + * @param cmd null to use java.awt.Desktop to show the launcher + * or a string to execute in an external process (with a parameter to the URL) + * @return launcher executing in external browser. + */ + public static Launcher createBrowser(String cmd, ClassLoader classes, String startpage) { String msg = "Trying to create browser '" + cmd + "'"; try { Class c; @@ -94,7 +106,12 @@ } } Constructor cnstr = c.getConstructor(String.class); - return (Launcher) cnstr.newInstance(cmd); + final Launcher launcher = (Launcher) cnstr.newInstance(cmd); + if (classes != null) { + launcher.addClassLoader(classes); + } + launcher.rootPage(startpage); + return launcher; } catch (Exception ex) { throw new IllegalStateException(msg, ex); } @@ -183,4 +200,8 @@ void addClassLoader(ClassLoader classes) { throw new UnsupportedOperationException(); } + + void rootPage(String startpage) { + throw new UnsupportedOperationException(); + } } diff -r 789849cabcc7 -r cff680298793 launcher/fx/src/main/java/org/apidesign/bck2brwsr/launcher/BaseHTTPLauncher.java --- a/launcher/fx/src/main/java/org/apidesign/bck2brwsr/launcher/BaseHTTPLauncher.java Mon Apr 18 05:15:11 2016 +0200 +++ b/launcher/fx/src/main/java/org/apidesign/bck2brwsr/launcher/BaseHTTPLauncher.java Mon Apr 18 07:32:35 2016 +0200 @@ -87,6 +87,7 @@ private HttpServer server; private CountDownLatch wait; private Thread flushing; + private String rootPage; public BaseHTTPLauncher(String cmd) { this.cmd = cmd; @@ -118,6 +119,12 @@ return loaders.toArray(new ClassLoader[loaders.size()]); } + @Override + void rootPage(String startpage) { + this.rootPage = startpage; + } + + @Override public void showURL(String startpage) throws IOException { if (!startpage.startsWith("/")) { startpage = "/" + startpage; @@ -201,6 +208,12 @@ if (addClasses) { conf.addHttpHandler(new Classes(resources), "/classes/"); } + if (rootPage != null) { + int last = rootPage.lastIndexOf('/'); + String prefix = rootPage.substring(0, last); + String page = rootPage.substring(last); + s.getServerConfiguration().addHttpHandler(new SubTree("/pages" + page, resources, prefix), "/pages/"); + } final WebSocketAddOn addon = new WebSocketAddOn(); for (NetworkListener listener : s.getListeners()) { listener.registerAddOn(addon); @@ -423,7 +436,13 @@ } }, "/data"); - this.brwsr = launchServerAndBrwsr(server, "/execute"); + String page = "/execute"; + if (rootPage != null) { + int last = rootPage.lastIndexOf('/'); + page = "/pages" + rootPage.substring(last); + } + + this.brwsr = launchServerAndBrwsr(server, page); } private static String encodeJSON(String in) { @@ -781,8 +800,14 @@ final String resource; private final String[] args; private final Res res; + private final String ensureBck2Brwsr; public Page(Res res, String resource, String... args) { + this(null, res, resource, args); + } + + Page(String ensureBck2Brwsr, Res res, String resource, String... args) { + this.ensureBck2Brwsr = ensureBck2Brwsr; this.res = res; this.resource = resource; this.args = args.length == 0 ? new String[] { "$0" } : args; @@ -805,10 +830,26 @@ LOG.info("Content type application/xhtml+xml"); replace = args; } - OutputStream os = response.getOutputStream(); try { InputStream is = res.get(r, 0).openStream(); - copyStream(is, os, request.getRequestURL().toString(), replace); + if (ensureBck2Brwsr != null && ensureBck2Brwsr.equals(request.getRequestURI())) { + ByteArrayOutputStream tmp = new ByteArrayOutputStream(); + copyStream(is, tmp, request.getRequestURL().toString(), replace); + String pageText = tmp.toString("UTF-8"); + if (!pageText.contains("bck2brwsr.js")) { + int last = pageText.toLowerCase().indexOf(""); + if (last == -1) { + last = pageText.length(); + } + pageText = pageText.substring(0, last) + + "\n\n\n" + + pageText.substring(last); + } + response.getWriter().write(pageText); + } else { + OutputStream os = response.getOutputStream(); + copyStream(is, os, request.getRequestURL().toString(), replace); + } } catch (IOException ex) { response.setDetailMessage(ex.getLocalizedMessage()); response.setError(); @@ -830,6 +871,9 @@ public SubTree(Res res, String resource, String... args) { super(res, resource, args); } + public SubTree(String ensureBck2Brwsr, Res res, String resource, String... args) { + super(ensureBck2Brwsr, res, resource, args); + } @Override protected String computePage(Request request) { diff -r 789849cabcc7 -r cff680298793 launcher/fx/src/main/java/org/apidesign/bck2brwsr/launcher/fximpl/Console.java --- a/launcher/fx/src/main/java/org/apidesign/bck2brwsr/launcher/fximpl/Console.java Mon Apr 18 05:15:11 2016 +0200 +++ b/launcher/fx/src/main/java/org/apidesign/bck2brwsr/launcher/fximpl/Console.java Mon Apr 18 07:32:35 2016 +0200 @@ -39,7 +39,10 @@ @JavaScriptBody(args = { "elem", "attr" }, body = "return elem[attr].toString();") private static native Object getAttr(Object elem, String attr); - @JavaScriptBody(args = { "id", "attr", "value" }, body = "window.document.getElementById(id)[attr] = value;") + @JavaScriptBody(args = { "id", "attr", "value" }, body = "\n" + + "var e = window.document.getElementById(id);\n" + + "if (e) e[attr] = value;\n" + ) private static native void setAttr(String id, String attr, Object value); @JavaScriptBody(args = { "elem", "attr", "value" }, body = "elem[attr] = value;") diff -r 789849cabcc7 -r cff680298793 launcher/http/src/main/java/org/apidesign/bck2brwsr/launcher/impl/Console.java --- a/launcher/http/src/main/java/org/apidesign/bck2brwsr/launcher/impl/Console.java Mon Apr 18 05:15:11 2016 +0200 +++ b/launcher/http/src/main/java/org/apidesign/bck2brwsr/launcher/impl/Console.java Mon Apr 18 07:32:35 2016 +0200 @@ -40,24 +40,29 @@ } @JavaScriptBody(args = {"id", "attr"}, body = - "return window.document.getElementById(id)[attr].toString();") + "var e = window.document.getElementById(id);" + + "return e ? e[attr].toString() : null;" + ) private static native Object getAttr(String id, String attr); @JavaScriptBody(args = {"elem", "attr"}, body = - "return elem[attr].toString();") + "return elem ? elem[attr].toString() : null;") private static native Object getAttr(Object elem, String attr); @JavaScriptBody(args = {"id", "attr", "value"}, body = - "window.document.getElementById(id)[attr] = value;") + "var e = window.document.getElementById(id);\n" + + "if (e) e[attr] = value;" + ) private static native void setAttr(String id, String attr, Object value); @JavaScriptBody(args = {"elem", "attr", "value"}, body = - "elem[attr] = value;") + "if (elem) elem[attr] = value;") private static native void setAttr(Object id, String attr, Object value); @net.java.html.js.JavaScriptBody(args = {}, body = "return new Date().getTime()") private static native double getTime(); @net.java.html.js.JavaScriptBody(args = { }, body = - "var a = document.createElement('a');" + "if (!document.getElementById('bck2brwsr.fragment')) return;\b" + + "var a = document.createElement('a');\n" + "a.innerHTML = 'Cancel: closing in 10s...';\n" + "a.href = '#';\n" + "var closing = window.setTimeout(function() { window.close(); }, 10000);\n" @@ -119,7 +124,7 @@ + "li.appendChild(span);\n" + "li.appendChild(details);\n" + "p.appendChild(pre);\n" - + "ul.appendChild(li);\n" + + "if (ul) ul.appendChild(li);\n" + "arr[0] = pre;\n" + "arr[1] = status;\n" )