You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by mg...@apache.org on 2022/01/18 10:17:41 UTC

[wicket] branch wicket-8.x updated: WICKET-6945 Allow onConfigure to hide forms (#492)

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

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


The following commit(s) were added to refs/heads/wicket-8.x by this push:
     new b709568  WICKET-6945 Allow onConfigure to hide forms (#492)
b709568 is described below

commit b709568b14502e914df739d46b382d17f881fb3c
Author: Mathieu Mitchell <ma...@gmail.com>
AuthorDate: Tue Jan 18 04:58:17 2022 -0500

    WICKET-6945 Allow onConfigure to hide forms (#492)
    
    Currently, MultipartFormComponentListener evaluates form visibility
    before the configuration phase. This prevents code in onConfigure from
    modifying the visibility of forms.
    
    This ensures the listener evaluates the visibility during
    onAfterRespond, which happens after the configuration phase.
    
    The existing test case was modified to ensure modifications to the
    visibility during the onConfigure phase is properly evaluated.
    
    Closes: WICKET-6945
    (cherry picked from commit 54a9c8a2162b3c06f9cdae152f79411b74c5ca87)
    Signed-off-by: Martin Tzvetanov Grigorov <mg...@apache.org>
---
 .../http/MultipartFormComponentListener.java       | 27 +++++++++++++---------
 .../http/MultipartFormComponentListenerBean.java   | 11 ++++++++-
 .../http/MultipartFormComponentListenerPage.html   | 21 +++++++++--------
 .../http/MultipartFormComponentListenerPage.java   | 16 +++++++++++++
 .../http/MultipartFormComponentListenerTest.java   | 11 +++++++--
 5 files changed, 62 insertions(+), 24 deletions(-)

diff --git a/wicket-core/src/main/java/org/apache/wicket/protocol/http/MultipartFormComponentListener.java b/wicket-core/src/main/java/org/apache/wicket/protocol/http/MultipartFormComponentListener.java
index f5572ed..6eadb52 100644
--- a/wicket-core/src/main/java/org/apache/wicket/protocol/http/MultipartFormComponentListener.java
+++ b/wicket-core/src/main/java/org/apache/wicket/protocol/http/MultipartFormComponentListener.java
@@ -22,6 +22,7 @@ import org.apache.wicket.Component;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.markup.html.form.FormComponent;
+import org.apache.wicket.request.cycle.RequestCycle;
 import org.apache.wicket.util.visit.IVisitor;
 
 /**
@@ -35,18 +36,22 @@ public class MultipartFormComponentListener implements AjaxRequestTarget.IListen
 	static final String ENCTYPE_URL_ENCODED = "application/x-www-form-urlencoded";
 
 	@Override
-	public void onBeforeRespond(final Map<String, Component> map, final AjaxRequestTarget target)
+	public void onAfterRespond(final Map<String, Component> map, final AjaxRequestTarget.IJavaScriptResponse response)
 	{
-		target.getPage().visitChildren(FormComponent.class, (IVisitor<FormComponent<?>, Void>) (formComponent, visit) -> {
-			if (formComponent.isMultiPart())
-			{
-				Form<?> form = formComponent.getForm();
-				boolean multiPart = form.isMultiPart();
-				String enctype = multiPart ? Form.ENCTYPE_MULTIPART_FORM_DATA : ENCTYPE_URL_ENCODED;
-				target.appendJavaScript(String.format("Wicket.$('%s').form.enctype='%s'",
-						formComponent.getMarkupId(), enctype));
-				visit.stop();
-			}
+		RequestCycle.get().find(AjaxRequestTarget.class).ifPresent(target -> {
+			target.getPage().visitChildren(Form.class, (IVisitor<Form<?>, Void>) (form, formVisitor) -> {
+				if (form.isVisibleInHierarchy()) {
+					form.visitFormComponents((formComponent, visit) -> {
+						if (formComponent.isMultiPart()) {
+							String enctype = form.isMultiPart() ? Form.ENCTYPE_MULTIPART_FORM_DATA : ENCTYPE_URL_ENCODED;
+							target.appendJavaScript(String.format("Wicket.$('%s').enctype='%s'", form.getMarkupId(), enctype));
+							visit.stop();
+						}
+					});
+				} else {
+					formVisitor.dontGoDeeper();
+				}
+			});
 		});
 	}
 }
diff --git a/wicket-core/src/test/java/org/apache/wicket/protocol/http/MultipartFormComponentListenerBean.java b/wicket-core/src/test/java/org/apache/wicket/protocol/http/MultipartFormComponentListenerBean.java
index 41b6ca4..56e3651 100644
--- a/wicket-core/src/test/java/org/apache/wicket/protocol/http/MultipartFormComponentListenerBean.java
+++ b/wicket-core/src/test/java/org/apache/wicket/protocol/http/MultipartFormComponentListenerBean.java
@@ -18,9 +18,11 @@ package org.apache.wicket.protocol.http;
 
 import java.io.Serializable;
 
-public class MultipartFormComponentListenerBean implements Serializable {
+public class MultipartFormComponentListenerBean implements Serializable
+{
 	private String textField;
 	private String dropDown;
+	private boolean formVisible = true;
 
 	/**
 	 * @return the textField
@@ -38,6 +40,10 @@ public class MultipartFormComponentListenerBean implements Serializable {
 	}
 
 
+	public boolean isFormVisible() {
+		return formVisible;
+	}
+
 	/**
 	 * @param textField
 	 *                     the textField to set
@@ -55,4 +61,7 @@ public class MultipartFormComponentListenerBean implements Serializable {
 		this.dropDown = dropDown;
 	}
 
+	public void setFormVisible(boolean formVisible) {
+		this.formVisible = formVisible;
+	}
 }
diff --git a/wicket-core/src/test/java/org/apache/wicket/protocol/http/MultipartFormComponentListenerPage.html b/wicket-core/src/test/java/org/apache/wicket/protocol/http/MultipartFormComponentListenerPage.html
index eb741e8..4fbb6b1 100644
--- a/wicket-core/src/test/java/org/apache/wicket/protocol/http/MultipartFormComponentListenerPage.html
+++ b/wicket-core/src/test/java/org/apache/wicket/protocol/http/MultipartFormComponentListenerPage.html
@@ -1,17 +1,18 @@
 <!DOCTYPE html>
 <html xmlns:wicket="http://wicket.apache.org">
 <head>
-<meta charset="utf-8" />
-<title>Apache Wicket 6914</title>
+	<meta charset="utf-8" />
+	<title>Apache Wicket 6914</title>
 </head>
 <body>
-	<form wicket:id="form">
-		<input type="text" wicket:id="textField" /><br/>
-		<select  wicket:id="dropDown"></select><br/>
-		<input wicket:id="fileUpload" type="file" /><br/> 
-		<input type="submit" value="save" wicket:id="submitButton" /><br/><br/><br/>
-	</form>
-	content of textfield or error: <div wicket:id="label"></div>
-	
+<form wicket:id="form">
+	<input type="text" wicket:id="textField" /><br/>
+	<select  wicket:id="dropDown"></select><br/>
+	<input wicket:id="fileUpload" type="file" /><br/>
+	<input type="submit" value="save" wicket:id="submitButton" /><br/><br/><br/>
+</form>
+content of textfield or error: <div wicket:id="label"></div>
+
+<a wicket:id="toggleVisibility">Toggle form visibility</a>
 </body>
 </html>
diff --git a/wicket-core/src/test/java/org/apache/wicket/protocol/http/MultipartFormComponentListenerPage.java b/wicket-core/src/test/java/org/apache/wicket/protocol/http/MultipartFormComponentListenerPage.java
index d0b7842..7621f01 100644
--- a/wicket-core/src/test/java/org/apache/wicket/protocol/http/MultipartFormComponentListenerPage.java
+++ b/wicket-core/src/test/java/org/apache/wicket/protocol/http/MultipartFormComponentListenerPage.java
@@ -18,8 +18,11 @@ package org.apache.wicket.protocol.http;
 
 import java.util.ArrayList;
 
+import org.apache.wicket.Component;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.form.OnChangeAjaxBehavior;
+import org.apache.wicket.ajax.markup.html.AjaxLink;
+import org.apache.wicket.behavior.Behavior;
 import org.apache.wicket.markup.html.WebPage;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.form.Button;
@@ -36,6 +39,12 @@ public class MultipartFormComponentListenerPage extends WebPage {
 	public MultipartFormComponentListenerPage() {
 		CompoundPropertyModel<MultipartFormComponentListenerBean> model = new CompoundPropertyModel<>(new MultipartFormComponentListenerBean());
 		Form<MultipartFormComponentListenerBean> form = new Form<>("form", model);
+		form.add(new Behavior() {
+			@Override
+			public void onConfigure(Component component) {
+				component.setVisible(model.getObject().isFormVisible());
+			}
+		});
 		add(form);
 
 		RequiredTextField<String> textField = new RequiredTextField<>("textField");
@@ -76,5 +85,12 @@ public class MultipartFormComponentListenerPage extends WebPage {
 			}
 		});
 
+		add(new AjaxLink<Void>("toggleVisibility") {
+			@Override
+			public void onClick(AjaxRequestTarget target) {
+				model.getObject().setFormVisible(!model.getObject().isFormVisible());
+				target.add(form);
+			}
+		});
 	}
 }
diff --git a/wicket-core/src/test/java/org/apache/wicket/protocol/http/MultipartFormComponentListenerTest.java b/wicket-core/src/test/java/org/apache/wicket/protocol/http/MultipartFormComponentListenerTest.java
index cb75df7..3dcf29d 100644
--- a/wicket-core/src/test/java/org/apache/wicket/protocol/http/MultipartFormComponentListenerTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/protocol/http/MultipartFormComponentListenerTest.java
@@ -33,16 +33,23 @@ public class MultipartFormComponentListenerTest extends WicketTestCase
         tester.assertRenderedPage(MultipartFormComponentListenerPage.class);
 
         TagTester formTagTester = tester.getTagByWicketId("form");
+        String formMarkupId = formTagTester.getAttribute("id");
+
         assertEquals(Form.ENCTYPE_MULTIPART_FORM_DATA, formTagTester.getAttribute("enctype"));
 
         tester.getRequest().setAttribute("form:dropDown", 1);
         tester.executeAjaxEvent("form:dropDown", "change");
         String ajaxResponse = tester.getLastResponseAsString();
-        assertTrue(ajaxResponse.contains(".form.enctype='" + MultipartFormComponentListener.ENCTYPE_URL_ENCODED + "'})();"));
+        System.err.println("ajaxResponse: " + ajaxResponse);
+        assertTrue(ajaxResponse.contains("Wicket.$('"+formMarkupId+"').enctype='" + MultipartFormComponentListener.ENCTYPE_URL_ENCODED + "'})();"));
 
         tester.getRequest().setAttribute("form:dropDown", 2);
         tester.executeAjaxEvent("form:dropDown", "change");
         ajaxResponse = tester.getLastResponseAsString();
-        assertTrue(ajaxResponse.contains(".form.enctype='" + Form.ENCTYPE_MULTIPART_FORM_DATA + "'})();"));
+        assertTrue(ajaxResponse.contains("Wicket.$('"+formMarkupId+"').enctype='" + Form.ENCTYPE_MULTIPART_FORM_DATA + "'})();"));
+
+        tester.clickLink("toggleVisibility");
+        ajaxResponse = tester.getLastResponseAsString();
+        assertFalse("enctype should not be pushed on hidden elements", ajaxResponse.contains("Wicket.$('"+formMarkupId+"').enctype="));
     }
 }