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>");
+               }
+       }
+
+}

Reply via email to