package org.lobobrowser.html.js; import java.net.URL; import java.util.logging.Level; import java.util.logging.Logger; import org.lobobrowser.html.HtmlRendererContext; import org.lobobrowser.html.domimpl.HTMLDocumentImpl; import org.lobobrowser.js.AbstractScriptableDelegate; import org.w3c.dom.Document; public class Location extends AbstractScriptableDelegate { private static final Logger logger = Logger.getLogger(Location.class.getName()); private final Window window; Location(final Window window) { this.window = window; } private URL getURL() { URL url; try { final Document document = this.window.getDocumentNode(); url = document == null ? null : new URL(document.getDocumentURI()); } catch (final java.net.MalformedURLException mfu) { url = null; } return url; } public String getHash() { final URL url = this.getURL(); return url == null ? null : url.getRef(); } public String getHost() { final URL url = this.getURL(); if (url == null) { return null; } return url.getHost() + (url.getPort() == -1 ? "" : ":" + url.getPort()); } public String getHostname() { final URL url = this.getURL(); if (url == null) { return null; } return url.getHost(); } public String getPathname() { final URL url = this.getURL(); return url == null ? null : url.getPath(); } public String getPort() { final URL url = this.getURL(); if (url == null) { return null; } final int port = url.getPort(); return port == -1 ? null : String.valueOf(port); } public String getProtocol() { final URL url = this.getURL(); if (url == null) { return null; } return url.getProtocol() + ":"; } public String getSearch() { final URL url = this.getURL(); final String query = url == null ? null : url.getQuery(); // Javascript requires "?" in its search string. return query == null ? "" : "?" + query; } private String target; public String getTarget() { return this.target; } public void setTarget(final String value) { this.target = value; } public String getHref() { final Document document = this.window.getDocumentNode(); return document == null ? null : document.getDocumentURI(); } public void setHref(final String uri) { final HtmlRendererContext rcontext = this.window.getHtmlRendererContext(); if (rcontext != null) { try { URL url; final Document document = this.window.getDocumentNode(); if (document instanceof HTMLDocumentImpl) { final HTMLDocumentImpl docImpl = (HTMLDocumentImpl) document; url = docImpl.getFullURL(uri); } else { url = new URL(uri); } rcontext.navigate(url, this.target); } catch (final java.net.MalformedURLException mfu) { logger.log(Level.WARNING, "setHref(): Malformed location: [" + uri + "].", mfu); } } } public void reload() { // TODO: This is not really reload. final Document document = this.window.getDocumentNode(); if (document instanceof HTMLDocumentImpl) { final HTMLDocumentImpl docImpl = (HTMLDocumentImpl) document; final HtmlRendererContext rcontext = docImpl.getHtmlRendererContext(); if (rcontext != null) { rcontext.reload(); } else { docImpl.warn("reload(): No renderer context in Location's document."); } } } public void replace(final String href) { this.setHref(href); } @Override public String toString() { // This needs to be href. Callers // rely on that. return this.getHref(); } }