From 8c67b732b55e09dae25bf117e126971869c9bd95 Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Sat, 16 Jul 2022 23:27:14 +0200 Subject: [PATCH 01/15] [JENKINS-60866] Make st:bind tag work without inline JS --- .../stapler/bind/BoundObjectTable.java | 18 +++++++++ .../org/kohsuke/stapler/jelly/BindTag.java | 37 +++++++++++++------ 2 files changed, 43 insertions(+), 12 deletions(-) diff --git a/core/src/main/java/org/kohsuke/stapler/bind/BoundObjectTable.java b/core/src/main/java/org/kohsuke/stapler/bind/BoundObjectTable.java index 8102f22dcc..b4ac50380b 100644 --- a/core/src/main/java/org/kohsuke/stapler/bind/BoundObjectTable.java +++ b/core/src/main/java/org/kohsuke/stapler/bind/BoundObjectTable.java @@ -24,6 +24,7 @@ package org.kohsuke.stapler.bind; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; +import java.io.PrintWriter; import org.kohsuke.stapler.Ancestor; import org.kohsuke.stapler.HttpResponse; import org.kohsuke.stapler.HttpResponses; @@ -187,6 +188,23 @@ public HttpResponse doEnableLogging() { } } + public static final class BindScript { + + private final Bound bound; + private final String variableName; + + public BindScript(Bound bound, String variableName) { + this.bound = bound; + this.variableName = variableName; + } + + public void doIndex(StaplerResponse rsp) throws IOException, ServletException { + rsp.setContentType("application/javascript"); + final PrintWriter writer = rsp.getWriter(); + writer.append(variableName).append(" = ").append(bound.getProxyScript()).append(";"); + } + } + private static final class WellKnownObjectHandle extends Bound { private final String url; private final Object target; diff --git a/jelly/src/main/java/org/kohsuke/stapler/jelly/BindTag.java b/jelly/src/main/java/org/kohsuke/stapler/jelly/BindTag.java index ed82bd9d32..0359b926f8 100644 --- a/jelly/src/main/java/org/kohsuke/stapler/jelly/BindTag.java +++ b/jelly/src/main/java/org/kohsuke/stapler/jelly/BindTag.java @@ -29,8 +29,10 @@ import org.jvnet.maven.jellydoc.annotation.Required; import org.kohsuke.stapler.WebApp; import org.kohsuke.stapler.bind.Bound; +import org.kohsuke.stapler.bind.BoundObjectTable; import org.kohsuke.stapler.framework.adjunct.AdjunctsInPage; import org.xml.sax.SAXException; +import org.xml.sax.helpers.AttributesImpl; /** * Binds a server-side object to client side so that JavaScript can call into server. @@ -70,22 +72,33 @@ public void doTag(XMLOutput out) throws JellyTagException { a.doTag(out); try { - String expr; if (javaObject==null) { - expr = "null"; + if (varName == null) { + out.write("null"); + } else { + // TODO un-inline? + out.startElement("script"); + out.write(varName + "=null;"); + out.endElement("script"); + } } else { Bound h = WebApp.getCurrent().boundObjectTable.bind(javaObject); - expr = h.getProxyScript(); - } - if (varName==null) { - // this mode (of writing just the expression) needs to be used with caution because - // the adjunct tag above might produce