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

dashorst pushed a commit to branch wicket-10.x
in repository https://gitbox.apache.org/repos/asf/wicket.git

commit e21266a8533e213f43c0143727fcee34d9987553
Author: Pedro Santos <[email protected]>
AuthorDate: Sat Oct 3 12:03:39 2026 -0300

    Keep the upload progress bar instance in a map keyed by the markup id
    
    UploadProgressBar named the global variable that holds its client-side
    instance after the markup id of its bar (window.upb_<id>), an identifier
    position, so a legal markup id carrying a hyphen or a dot broke the
    generated script. The instance now lives in Wicket.WUPB.instances with
    the markup id as the key, where the id is written as a string.
    
    A markup id is a value: script generated from it may quote it, never
    paste it into an identifier position.
    
    Co-Authored-By: Claude Fable 5 <[email protected]>
---
 .../markup/html/form/upload/UploadProgressBar.java |  2 +-
 .../ajax/markup/html/form/upload/progressbar.js    |  1 +
 .../html/form/upload/UploadProgressBarTest.java    | 45 ++++++++++++++++++++++
 3 files changed, 47 insertions(+), 1 deletion(-)

diff --git 
a/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/UploadProgressBar.java
 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/UploadProgressBar.java
index 513e962f06..887f3a4c3d 100644
--- 
a/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/UploadProgressBar.java
+++ 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/UploadProgressBar.java
@@ -285,7 +285,7 @@ public class UploadProgressBar extends Panel
        }
 
        private String getVarName() {
-               return "window.upb_" + barDiv.getMarkupId();
+               return "Wicket.WUPB.instances['" + barDiv.getMarkupId() + "']";
        }
 
 
diff --git 
a/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/progressbar.js
 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/progressbar.js
index f540347786..84b5893cfe 100644
--- 
a/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/progressbar.js
+++ 
b/wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/progressbar.js
@@ -23,6 +23,7 @@
        }
 
        Wicket.WUPB = Wicket.Class.create();
+       Wicket.WUPB.instances = {};
        Wicket.WUPB.prototype = {
 
                initialize : function(formid, statusid, barid, url, fileid, 
initialStatus, onProgressUpdated) {
diff --git 
a/wicket-extensions/src/test/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/UploadProgressBarTest.java
 
b/wicket-extensions/src/test/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/UploadProgressBarTest.java
index 137b04c212..3d16398ebc 100644
--- 
a/wicket-extensions/src/test/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/UploadProgressBarTest.java
+++ 
b/wicket-extensions/src/test/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/UploadProgressBarTest.java
@@ -66,6 +66,20 @@ class UploadProgressBarTest extends WicketTestCase
                assertTrue(response.contains("'l\\'\\\\envoi'"), response);
        }
 
+       /**
+        * The progress bar instance is kept in a map keyed by the markup id of 
the bar, so an id that
+        * is not a legal JavaScript identifier, e.g. one carrying a hyphen or 
a dot, still works.
+        */
+       @Test
+       void barMarkupIdNeedNotBeAJavaScriptIdentifier()
+       {
+               tester.startPage(new CustomBarIdPage());
+
+               String response = tester.getLastResponseAsString();
+               assertTrue(response.contains("Wicket.WUPB.instances['my-bar.1'] 
= new Wicket.WUPB("),
+                       response);
+       }
+
        private static class TestPage extends WebPage implements 
IMarkupResourceStreamProvider
        {
                private static final long serialVersionUID = 1L;
@@ -85,4 +99,35 @@ class UploadProgressBarTest extends WicketTestCase
                                "<form wicket:id=\"form\"><div 
wicket:id=\"bar\"></div></form></body></html>");
                }
        }
+
+       private static class CustomBarIdPage extends WebPage implements 
IMarkupResourceStreamProvider
+       {
+               private static final long serialVersionUID = 1L;
+
+               CustomBarIdPage()
+               {
+                       Form<Void> form = new Form<>("form");
+                       add(form);
+                       form.add(new UploadProgressBar("bar", form)
+                       {
+                               private static final long serialVersionUID = 1L;
+
+                               @Override
+                               protected MarkupContainer 
newBarComponent(String id)
+                               {
+                                       MarkupContainer bar = 
super.newBarComponent(id);
+                                       bar.setMarkupId("my-bar.1");
+                                       return bar;
+                               }
+                       });
+               }
+
+               @Override
+               public IResourceStream getMarkupResourceStream(MarkupContainer 
container,
+                       Class<?> containerClass)
+               {
+                       return new 
StringResourceStream("<html><head></head><body>" +
+                               "<form wicket:id=\"form\"><div 
wicket:id=\"bar\"></div></form></body></html>");
+               }
+       }
 }

Reply via email to