diff --git a/wicket-core/src/main/java/org/apache/wicket/core/util/string/JavaScriptUtils.java b/wicket-core/src/main/java/org/apache/wicket/core/util/string/JavaScriptUtils.java index 2eb4a28ed9..f3871fb316 100644 --- a/wicket-core/src/main/java/org/apache/wicket/core/util/string/JavaScriptUtils.java +++ b/wicket-core/src/main/java/org/apache/wicket/core/util/string/JavaScriptUtils.java @@ -95,6 +95,33 @@ public static CharSequence escapeQuotesAndBackslash(final CharSequence input) return s; } + /** + * Removes the surrounding single quotes from a string after trimming + * leading and trailing whitespace. + * + *
Examples:
+ *
+ * unquoteSingleQuoted(" 'url' ") -> "url"
+ * unquoteSingleQuoted("'url'") -> "url"
+ * unquoteSingleQuoted("''") -> ""
+ *
+ *
+ * @param s the single-quoted string
+ * @return the contents between the outer single quotes
+ */
+ public static String unquoteSingleQuoted(String s)
+ {
+ if (s != null)
+ {
+ var trimmed = s.trim();
+ if (trimmed.length() > 1 && trimmed.startsWith("'") && trimmed.endsWith("'"))
+ {
+ s = trimmed.substring(1, trimmed.length() - 1);
+ }
+ }
+ return s;
+ }
+
/**
* Write a reference to a javascript file to the response object
*
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/link/ExternalLink.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/link/ExternalLink.java
index 09607c8fc8..229f77d8f9 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/link/ExternalLink.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/link/ExternalLink.java
@@ -27,6 +27,8 @@
import org.apache.wicket.request.cycle.RequestCycle;
import org.apache.wicket.request.flow.RedirectToUrlException;
+import static org.apache.wicket.core.util.string.JavaScriptUtils.escapeQuotesAndBackslash;
+
/**
* * A simple anchor link (<a href="http://url">) pointing to any URL. Usually this is used for @@ -189,7 +191,7 @@ public void renderHead(IHeaderResponse response) { if (popupSettings != null) { - popupSettings.setTarget(url); + popupSettings.setTarget("'" + url + "'"); response.render(OnEventHeaderItem.forComponent(this, "click", popupSettings.getPopupJavaScript())); return; @@ -208,7 +210,7 @@ public void renderHead(IHeaderResponse response) response.render(OnEventHeaderItem.forComponent(this, "click", "var win = this.ownerDocument.defaultView || this.ownerDocument.parentWindow; " // + "if (win == window) { window.location.href='" // - + JavaScriptUtils.escapeQuotes(url) // + + escapeQuotesAndBackslash(url) // + "'; } ;return false")); return; } diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/link/Link.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/link/Link.java index a2b8486403..cf0fb445c8 100644 --- a/wicket-core/src/main/java/org/apache/wicket/markup/html/link/Link.java +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/link/Link.java @@ -28,6 +28,8 @@ import org.apache.wicket.model.IModel; import org.apache.wicket.request.mapper.parameter.PageParameters; +import static org.apache.wicket.core.util.string.JavaScriptUtils.escapeQuotesAndBackslash; + /** * Implementation of a hyperlink component. A link can be used with an anchor (<a href...) * element or any element that supports the onclick javascript event handler (such as buttons, td @@ -414,7 +416,7 @@ public void renderHead(IHeaderResponse response) // next check for popup settings if (popupSettings != null) { - popupSettings.setTarget(url.toString()); + popupSettings.setTarget("'" + url.toString() + "'"); response.render(OnEventHeaderItem.forComponent(this, "click", popupSettings.getPopupJavaScript())); return; @@ -431,7 +433,7 @@ public void renderHead(IHeaderResponse response) // generated during page load. This check ensures that the click is ignored response.render(OnEventHeaderItem.forComponent(this, "click", "var win = this.ownerDocument.defaultView || this.ownerDocument.parentWindow; " - + "if (win == window) { window.location.href='" + url + + "if (win == window) { window.location.href='" + escapeQuotesAndBackslash(url) + "'; } ;return false")); } } diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/link/PopupSettings.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/link/PopupSettings.java index e62b3e01be..bb20ed711a 100644 --- a/wicket-core/src/main/java/org/apache/wicket/markup/html/link/PopupSettings.java +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/link/PopupSettings.java @@ -21,6 +21,9 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import static org.apache.wicket.core.util.string.JavaScriptUtils.escapeQuotesAndBackslash; +import static org.apache.wicket.core.util.string.JavaScriptUtils.unquoteSingleQuoted; + /** * A popup specification can be used as a property of the {@link Link}classes to specify that the @@ -156,10 +159,10 @@ public String getPopupJavaScript() windowTitle = windowTitle.replaceAll("\\W", "_"); } + var escapedTarget = escapeQuotesAndBackslash(unquoteSingleQuoted(target)); StringBuilder script = new StringBuilder(// - "var w = window.open('"// - + JavaScriptUtils.escapeQuotes(target) // - + "', '").append(windowTitle).append("', '"); + "var w = window.open('" + escapedTarget + "', '" // + ).append(windowTitle).append("', '"); script.append("scrollbars=").append(flagToString(SCROLLBARS)); script.append(",location=").append(flagToString(LOCATION_BAR));