package freenet.client.filter; import java.net.MalformedURLException; import java.net.URISyntaxException; import freenet.client.filter.HTMLFilter.ParsedTag; import freenet.clients.http.FProxyFetchTracker; import freenet.clients.http.ToadletContext; import freenet.clients.http.updateableelements.ImageElement; import freenet.keys.FreenetURI; import freenet.l10n.NodeL10n; import freenet.support.HTMLEncoder; /** This TagReplcaerCallback adds pushing support for freesites, and replaces their img's to pushed ones */ public class PushingTagReplacerCallback implements TagReplacerCallback { /** The FProxyFetchTracker */ private FProxyFetchTracker tracker; /** The maxSize used for fetching */ private long maxSize; /** The current ToadletContext */ private ToadletContext ctx; /** * Constructor * * @param tracker * - The FProxyFetchTracker * @param maxSize * - The maxSize used for fetching * @param ctx * - The current ToadletContext */ public PushingTagReplacerCallback(FProxyFetchTracker tracker, long maxSize, ToadletContext ctx) { this.tracker = tracker; this.maxSize = maxSize; this.ctx = ctx; } /** * Returns the javascript code that initializes the l10n on the client side. It must be inserted to the page. * * @return The javascript code that needs to be inserted in order to l10n work */ public static String getClientSideLocalizationScript() { StringBuilder l10nBuilder = new StringBuilder("var l10n={\n"); boolean isNamePresentAtLeastOnce=false; for (String key : NodeL10n.getBase().getAllNamesWithPrefix("fproxy.push")) { l10nBuilder.append(key.substring("fproxy.push".length() + 1) + ": \"" + HTMLEncoder.encode(NodeL10n.getBase().getString(key)) + "\",\n"); isNamePresentAtLeastOnce=true; } String l10n = isNamePresentAtLeastOnce?l10nBuilder.substring(0, l10nBuilder.length() - 2):l10nBuilder.toString(); l10n = l10n.concat("\n};"); return l10n; } @Override public String processTag(ParsedTag pt, URIProcessor uriProcessor) { // If javascript or pushing is disabled, then it won't need pushing if (ctx.getContainer().isFProxyJavascriptEnabled() && ctx.getContainer().isFProxyWebPushingEnabled()) { if (pt.element.toLowerCase().compareTo("img") == 0) { // Img's needs to be replaced with pushed ImageElement's for (String attr: pt.unparsedAttrs) { String name = attr.substring(0, attr.indexOf('=')); String value = attr.substring(attr.indexOf('=') + 2, attr.length() - 1); if (name.compareTo("src") == 0) { String src; try { // We need absolute URI src = uriProcessor.makeURIAbsolute(uriProcessor.processURI(value, null, false, false)); } catch (CommentException ce) { return null; } catch (URISyntaxException use) { return null; } if (src.startsWith("/")) { src = src.substring(1); } try { // Create the ImageElement return new ImageElement(tracker, new FreenetURI(src), maxSize, ctx, pt, true).generate(); } catch (MalformedURLException mue) { return null; } } } } else if (pt.element.toLowerCase().compareTo("body") == 0 && pt.startSlash==true) { // After the <body>, we need to insert the requestId and the l10n script return "".concat(/*new XmlAlertElement(ctx).generate()*/"".concat("<input id=\"requestId\" type=\"hidden\" value=\"" + ctx.getUniqueId() + "\" name=\"requestId\"/>")).concat("<script type=\"text/javascript\" language=\"javascript\">".concat(getClientSideLocalizationScript()).concat("</script>")).concat("</body>"); } else if (pt.element.toLowerCase().compareTo("head") == 0) { // After the <head>, we need to add GWT support return "<head><script type=\"text/javascript\" language=\"javascript\" src=\"/static/freenetjs/freenetjs.nocache.js\"></script><noscript><style> .jsonly {display:none;}</style></noscript><link href=\"/static/reset.css\" rel=\"stylesheet\" type=\"text/css\" />"; } } return null; } }