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 2015/04/19 23:22:10 UTC

wicket git commit: WICKET-5883 Feedback messages not cleared for invisible/disabled form components on submit.

Repository: wicket
Updated Branches:
  refs/heads/wicket-6.x 7722b13c5 -> b980efc3a


WICKET-5883 Feedback messages not cleared for invisible/disabled form components on submit.


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/b980efc3
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/b980efc3
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/b980efc3

Branch: refs/heads/wicket-6.x
Commit: b980efc3ad60928d10b5a30e7aac067b2a8b508e
Parents: 7722b13
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Mon Apr 20 00:21:17 2015 +0300
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Mon Apr 20 00:21:17 2015 +0300

----------------------------------------------------------------------
 .../wicket/feedback/IFeedbackMessageFilter.java |   6 +-
 .../apache/wicket/markup/html/form/Form.java    |   2 +-
 .../wicket/util/tester/BaseWicketTester.java    |  10 +-
 ...FormValidationDisabledFormComponentTest.java | 154 +++++++++++++++++++
 4 files changed, 164 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/b980efc3/wicket-core/src/main/java/org/apache/wicket/feedback/IFeedbackMessageFilter.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/feedback/IFeedbackMessageFilter.java b/wicket-core/src/main/java/org/apache/wicket/feedback/IFeedbackMessageFilter.java
index 83706e5..fdd3057 100644
--- a/wicket-core/src/main/java/org/apache/wicket/feedback/IFeedbackMessageFilter.java
+++ b/wicket-core/src/main/java/org/apache/wicket/feedback/IFeedbackMessageFilter.java
@@ -28,7 +28,7 @@ public interface IFeedbackMessageFilter extends IClusterable
 	/**
 	 * Filter that returns simply all available messages.
 	 */
-	public static final IFeedbackMessageFilter ALL = new IFeedbackMessageFilter()
+	IFeedbackMessageFilter ALL = new IFeedbackMessageFilter()
 	{
 		private static final long serialVersionUID = 1L;
 
@@ -42,7 +42,7 @@ public interface IFeedbackMessageFilter extends IClusterable
 	/**
 	 * Filter that does not match any message
 	 */
-	public static final IFeedbackMessageFilter NONE = new IFeedbackMessageFilter()
+	IFeedbackMessageFilter NONE = new IFeedbackMessageFilter()
 	{
 		private static final long serialVersionUID = 1L;
 
@@ -59,4 +59,4 @@ public interface IFeedbackMessageFilter extends IClusterable
 	 * @return True if the message should be included, false to exclude it
 	 */
 	boolean accept(FeedbackMessage message);
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/b980efc3/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java
index 789a804..c7fea42 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java
@@ -1141,7 +1141,7 @@ public class Form<T> extends WebMarkupContainer implements IFormSubmitListener,
 			@Override
 			public void component(final Component component, final IVisit<Boolean> visit)
 			{
-				if (component.hasErrorMessage())
+				if (component.isVisibleInHierarchy() && component.isEnabledInHierarchy() && component.hasErrorMessage())
 				{
 					visit.stop(true);
 				}

http://git-wip-us.apache.org/repos/asf/wicket/blob/b980efc3/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java b/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
index 4ea50c2..2849c3c 100644
--- a/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
+++ b/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
@@ -122,6 +122,7 @@ import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.apache.wicket.request.resource.IResource;
 import org.apache.wicket.request.resource.ResourceReference;
 import org.apache.wicket.session.ISessionStore.UnboundListener;
+import org.apache.wicket.settings.IApplicationSettings;
 import org.apache.wicket.settings.IRequestCycleSettings.RenderStrategy;
 import org.apache.wicket.util.lang.Args;
 import org.apache.wicket.util.lang.Classes;
@@ -455,13 +456,14 @@ public class BaseWicketTester
 	 * @param filter
 	 *            filter used to cleanup messages, accepted messages will be removed
 	 */
-	private void cleanupFeedbackMessages(IFeedbackMessageFilter filter)
+	protected void cleanupFeedbackMessages(IFeedbackMessageFilter filter)
 	{
-		application.getApplicationSettings().setFeedbackMessageCleanupFilter(filter);
+		IApplicationSettings applicationSettings = application.getApplicationSettings();
+		IFeedbackMessageFilter old = applicationSettings.getFeedbackMessageCleanupFilter();
+		applicationSettings.setFeedbackMessageCleanupFilter(filter);
 		getLastRenderedPage().detach();
 		getSession().detach();
-		application.getApplicationSettings().setFeedbackMessageCleanupFilter(
-			IFeedbackMessageFilter.NONE);
+		applicationSettings.setFeedbackMessageCleanupFilter(old);
 	}
 
 	/**

http://git-wip-us.apache.org/repos/asf/wicket/blob/b980efc3/wicket-core/src/test/java/org/apache/wicket/markup/html/form/FormValidationDisabledFormComponentTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/FormValidationDisabledFormComponentTest.java b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/FormValidationDisabledFormComponentTest.java
new file mode 100644
index 0000000..325305c
--- /dev/null
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/FormValidationDisabledFormComponentTest.java
@@ -0,0 +1,154 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.markup.html.form;
+
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import org.apache.wicket.MarkupContainer;
+import org.apache.wicket.WicketTestCase;
+import org.apache.wicket.feedback.IFeedbackMessageFilter;
+import org.apache.wicket.markup.IMarkupResourceStreamProvider;
+import org.apache.wicket.markup.html.WebPage;
+import org.apache.wicket.mock.MockApplication;
+import org.apache.wicket.model.Model;
+import org.apache.wicket.protocol.http.WebApplication;
+import org.apache.wicket.util.resource.IResourceStream;
+import org.apache.wicket.util.resource.StringResourceStream;
+import org.apache.wicket.util.tester.FormTester;
+import org.apache.wicket.util.tester.WicketTester;
+import org.junit.Test;
+
+/**
+ * Test case for https://issues.apache.org/jira/browse/WICKET-5883
+ */
+public class FormValidationDisabledFormComponentTest extends WicketTestCase
+{
+	@Override
+	protected WebApplication newApplication()
+	{
+		return new MockApplication()
+		{
+			@Override
+			protected void init()
+			{
+				super.init();
+
+				// make feedback messages not to disappear after page refresh (F5)
+				getApplicationSettings().setFeedbackMessageCleanupFilter(IFeedbackMessageFilter.NONE);
+			}
+		};
+	}
+
+	@Override
+	protected WicketTester newWicketTester(WebApplication app)
+	{
+		return new WicketTester(app)
+		{
+			@Override
+			public void clearFeedbackMessages()
+			{
+				// preserve the configured filter
+				cleanupFeedbackMessages(getApplication().getApplicationSettings().getFeedbackMessageCleanupFilter());
+			}
+		};
+	}
+
+	@Test
+	public void formSubmitsEvenWithInvalidButInvisibleFormComponent()
+	{
+		TestPage page = tester.startPage(TestPage.class);
+		assertFalse(page.onSubmitCalled.get());
+		assertFalse(page.onErrorCalled.get());
+
+		FormTester formTester = tester.newFormTester(page.form.getPageRelativePath());
+		formTester.submit();
+		assertTrue(page.field1.hasErrorMessage());
+		assertFalse(page.onSubmitCalled.get());
+		assertTrue(page.onErrorCalled.get());
+		page.onErrorCalled.set(false);
+
+		page.field1.setVisible(false);
+		formTester = tester.newFormTester(page.form.getPageRelativePath());
+		formTester.submit();
+		assertTrue(page.field1.hasErrorMessage());
+		assertTrue(page.onSubmitCalled.get());
+		assertFalse(page.onErrorCalled.get());
+	}
+
+	@Test
+	public void formSubmitsEvenWithInvalidButDisabledFormComponent()
+	{
+		TestPage page = tester.startPage(TestPage.class);
+		assertFalse(page.onSubmitCalled.get());
+		assertFalse(page.onErrorCalled.get());
+
+		FormTester formTester = tester.newFormTester(page.form.getPageRelativePath());
+		formTester.submit();
+		assertTrue(page.field1.hasErrorMessage());
+		assertFalse(page.onSubmitCalled.get());
+		assertTrue(page.onErrorCalled.get());
+		page.onErrorCalled.set(false);
+
+		page.field1.setEnabled(false);
+		formTester = tester.newFormTester(page.form.getPageRelativePath());
+		formTester.submit();
+		assertTrue(page.field1.hasErrorMessage());
+		assertTrue(page.onSubmitCalled.get());
+		assertFalse(page.onErrorCalled.get());
+	}
+
+	public static class TestPage extends WebPage implements IMarkupResourceStreamProvider
+	{
+		public final AtomicBoolean onSubmitCalled = new AtomicBoolean(false);
+		public final AtomicBoolean onErrorCalled = new AtomicBoolean(false);
+		public final TextField field1;
+		public final Form form;
+
+		public TestPage()
+		{
+			form = new Form("form")
+			{
+				@Override
+				protected void onSubmit()
+				{
+					super.onSubmit();
+					onSubmitCalled.set(true);
+				}
+
+				@Override
+				protected void onError()
+				{
+					super.onError();
+					onErrorCalled.set(true);
+				}
+			};
+			add(form);
+			form.add(field1 = new TextField<String>("field1", Model.of("")));
+			field1.setRequired(true);
+		}
+
+		@Override
+		public IResourceStream getMarkupResourceStream(MarkupContainer container,
+		                                               Class<?> containerClass)
+		{
+			return new StringResourceStream("<html><body>"//
+					+ "<form wicket:id='form'><input wicket:id='field1' type='text'/></form>" //
+					+ "</body></html>");
+		}
+	}
+
+}