Repository: wicket Updated Branches: refs/heads/master 766336077 -> cd3b92346
WICKET-5883 Feedback messages not cleared for invisible/disabled form components on submit. (cherry picked from commit b980efc3ad60928d10b5a30e7aac067b2a8b508e) Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/cd3b9234 Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/cd3b9234 Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/cd3b9234 Branch: refs/heads/master Commit: cd3b92346b33b38c451434a1cabb7cf79d7188f0 Parents: 7663360 Author: Martin Tzvetanov Grigorov <[email protected]> Authored: Mon Apr 20 00:21:17 2015 +0300 Committer: Martin Tzvetanov Grigorov <[email protected]> Committed: Mon Apr 20 00:25:43 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/cd3b9234/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/cd3b9234/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 93adebe..aa6ba63 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 @@ -1145,7 +1145,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/cd3b9234/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 b153aba..40210d6 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 @@ -125,6 +125,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.ApplicationSettings; import org.apache.wicket.settings.RequestCycleSettings.RenderStrategy; import org.apache.wicket.util.lang.Args; import org.apache.wicket.util.lang.Classes; @@ -459,13 +460,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); + ApplicationSettings 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/cd3b9234/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>"); + } + } + +}
