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