This is an automated email from the ASF dual-hosted git repository.

bitstorm pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/wicket.git


The following commit(s) were added to refs/heads/master by this push:
     new 456bc0259e WICKET-7183 fix popupsettings#setTarget regression (#1504)
456bc0259e is described below

commit 456bc0259e91dffaf8ca9563df480b15557d0795
Author: pedrosans <[email protected]>
AuthorDate: Fri Jul 10 07:15:41 2026 -0300

    WICKET-7183 fix popupsettings#setTarget regression (#1504)
---
 .../wicket/core/util/string/JavaScriptUtils.java   | 27 ++++++++++++++++++++++
 .../wicket/markup/html/link/ExternalLink.java      |  6 +++--
 .../org/apache/wicket/markup/html/link/Link.java   |  6 +++--
 .../wicket/markup/html/link/PopupSettings.java     |  9 +++++---
 4 files changed, 41 insertions(+), 7 deletions(-)

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 class JavaScriptUtils
                return s;
        }
 
+       /**
+        * Removes the surrounding single quotes from a string after trimming
+        * leading and trailing whitespace.
+        *
+        * <p>Examples:</p>
+        * <pre>
+        * unquoteSingleQuoted(" 'url'   ") -> "url"
+        * unquoteSingleQuoted("'url'")     -> "url"
+        * unquoteSingleQuoted("''")        -> ""
+        * </pre>
+        *
+        * @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.UrlUtils;
 import org.apache.wicket.request.cycle.RequestCycle;
 import org.apache.wicket.request.flow.RedirectToUrlException;
 
+import static 
org.apache.wicket.core.util.string.JavaScriptUtils.escapeQuotesAndBackslash;
+
 /**
  * <p>
  * A simple anchor link (&lt;a href="http://url"&gt;) pointing to any URL. 
Usually this is used for
@@ -189,7 +191,7 @@ public class ExternalLink extends AbstractLink
                {
                        if (popupSettings != null)
                        {
-                               popupSettings.setTarget(url);
+                               popupSettings.setTarget("'" + url + "'");
                                
response.render(OnEventHeaderItem.forComponent(this, "click",
                                        popupSettings.getPopupJavaScript()));
                                return;
@@ -208,7 +210,7 @@ public class ExternalLink extends AbstractLink
                                
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.markup.head.OnEventHeaderItem;
 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 
(&lt;a href...)
  * element or any element that supports the onclick javascript event handler 
(such as buttons, td
@@ -414,7 +416,7 @@ public abstract class Link<T> extends AbstractLink 
implements IRequestListener,
                        // 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 abstract class Link<T> extends AbstractLink 
implements IRequestListener,
                                // 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.apache.wicket.util.io.IClusterable;
 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 class PopupSettings implements IClusterable
                        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));

Reply via email to