]> source.dussan.org Git - vaadin-framework.git/commitdiff
Avoid obsolete calendar panel renderings to avoid various NPEs.
authorMatti Tahvonen <matti@vaadin.com>
Fri, 27 Sep 2013 12:07:48 +0000 (15:07 +0300)
committerVaadin Code Review <review@vaadin.com>
Tue, 8 Oct 2013 14:41:03 +0000 (14:41 +0000)
(#12504,#12667)

Change-Id: Ie0a9a8d9913116520b766062ebabdb771a76d1b6

client/src/com/vaadin/client/ui/VCalendarPanel.java
client/src/com/vaadin/client/ui/datefield/PopupDateFieldConnector.java
uitest/src/com/vaadin/tests/components/datefield/DateFieldTest.java

index 1f402987603bb143742c2c606452cd978505ac78..58e0448b5fdc5d779a5931d2984d13536d01c4b5 100644 (file)
@@ -2215,11 +2215,13 @@ public class VCalendarPanel extends FocusableFlexTable implements
      *            - the allowed range's start date
      */
     public void setRangeStart(Date rangeStart) {
-        this.rangeStart = rangeStart;
-        if (initialRenderDone) {
-            // Dynamic updates to the range needs to render the calendar to
-            // update the element stylenames
-            renderCalendar();
+        if (this.rangeStart != rangeStart) {
+            this.rangeStart = rangeStart;
+            if (initialRenderDone) {
+                // Dynamic updates to the range needs to render the calendar to
+                // update the element stylenames
+                renderCalendar();
+            }
         }
 
     }
@@ -2232,11 +2234,13 @@ public class VCalendarPanel extends FocusableFlexTable implements
      *            - the allowed range's end date
      */
     public void setRangeEnd(Date rangeEnd) {
-        this.rangeEnd = rangeEnd;
-        if (initialRenderDone) {
-            // Dynamic updates to the range needs to render the calendar to
-            // update the element stylenames
-            renderCalendar();
+        if (this.rangeEnd != rangeEnd) {
+            this.rangeEnd = rangeEnd;
+            if (initialRenderDone) {
+                // Dynamic updates to the range needs to render the calendar to
+                // update the element stylenames
+                renderCalendar();
+            }
         }
     }
 }
index 627478ebe5778f9c62d32a00246f6446a2eba028..f018caefa59c625851760bf7f818347d4e24b2ae 100644 (file)
@@ -77,9 +77,6 @@ public class PopupDateFieldConnector extends TextualDateConnector {
 
         String oldLocale = getWidget().getCurrentLocale();
 
-        boolean lastReadOnlyState = getWidget().isReadonly();
-        boolean lastEnabledState = getWidget().isEnabled();
-
         getWidget().parsable = uidl.getBooleanAttribute("parsable");
 
         super.updateFromUIDL(uidl, client);
@@ -92,7 +89,8 @@ public class PopupDateFieldConnector extends TextualDateConnector {
                 .getCurrentResolution()) {
             getWidget().calendar.setResolution(getWidget()
                     .getCurrentResolution());
-            if (getWidget().calendar.getDate() != null) {
+            if (getWidget().calendar.getDate() != null
+                    && getWidget().getCurrentDate() != null) {
                 getWidget().calendar.setDate((Date) getWidget()
                         .getCurrentDate().clone());
                 // force re-render when changing resolution only
@@ -101,7 +99,7 @@ public class PopupDateFieldConnector extends TextualDateConnector {
         }
 
         // Force re-render of calendar if locale has changed (#12153)
-        if (getWidget().getCurrentLocale() != oldLocale) {
+        if (!getWidget().getCurrentLocale().equals(oldLocale)) {
             getWidget().calendar.renderCalendar();
         }
 
@@ -113,6 +111,7 @@ public class PopupDateFieldConnector extends TextualDateConnector {
                     .setFocusChangeListener(new FocusChangeListener() {
                         @Override
                         public void focusChanged(Date date) {
+
                             getWidget().updateValue(date);
                             getWidget().buildDate();
                             Date date2 = getWidget().calendar.getDate();
index d92199a214bf0d1a3ecc4e183d5325f2f6a4aa2e..2a61e79f327c402b56be1843d6c2943362a2c9df 100644 (file)
@@ -7,8 +7,17 @@ import java.util.Date;
 import java.util.LinkedHashMap;
 import java.util.Locale;
 
+import org.junit.Assert;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.Dimension;
+import org.openqa.selenium.NoSuchElementException;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.interactions.Actions;
+
 import com.vaadin.shared.ui.datefield.Resolution;
 import com.vaadin.tests.components.abstractfield.AbstractFieldTest;
+import com.vaadin.tests.tb3.MultiBrowserTest;
 import com.vaadin.ui.DateField;
 
 public class DateFieldTest<T extends DateField> extends AbstractFieldTest<T> {
@@ -140,4 +149,98 @@ public class DateFieldTest<T extends DateField> extends AbstractFieldTest<T> {
         }
     };
 
+    public static class Tb3DateFieldTests extends MultiBrowserTest {
+
+        @Override
+        protected boolean isDebug() {
+            // run in debug to see js errors
+            return true;
+        }
+
+        @Test
+        public void testMakingRequired() throws InterruptedException {
+            Thread.sleep(1000);
+            menu("Component");
+            menuSub("State");
+            menu("Required");
+            assertNoErrorNotification();
+        }
+
+        private void assertNoErrorNotification() {
+            try {
+                getDriver().findElement(
+                        By.xpath("//div[contains(@class, 'v-Notification') ]"));
+                Assert.fail("Error notification shown!");
+            } catch (NoSuchElementException e) {
+                // As expected
+            }
+        }
+
+        @Test
+        public void testValueAfterOpeningPopupInRequiredField()
+                throws InterruptedException {
+            Thread.sleep(1000);
+            menu("Component");
+            menuSub("State");
+            menu("Required");
+
+            menu("Component");
+            menuSub("Features");
+            menuSub("Resolution");
+            menu("Month");
+
+            menu("Component");
+            menuSub("Listeners");
+            menu("Value change listener");
+
+            String inputtedValue = "2/12";
+            getInput().sendKeys(inputtedValue);
+
+            openPopup();
+            closePopup();
+            String actual = getInput().getAttribute("value");
+            Assert.assertEquals(inputtedValue, actual);
+            assertNoErrorNotification();
+
+        }
+
+        private void openPopup() throws InterruptedException {
+            Dimension size = getInput().getSize();
+            new Actions(getDriver()).moveToElement(getInput(), 0, 0)
+                    .moveByOffset(size.getWidth() + 5, size.getHeight() / 2)
+                    .click();
+            // This fails in Opera for some weird reason
+            // getDriver().findElement(By.className("v-datefield-button")).click();
+        }
+
+        private WebElement getInput() {
+            return getDriver().findElement(By.xpath("//input"));
+        }
+
+        private void closePopup() {
+            getDriver().findElement(By.tagName("body")).click();
+        }
+
+        /**
+         * @since
+         * @param string
+         */
+        private void menuSub(String string) {
+            getDriver().findElement(
+                    By.xpath("//span[text() = '" + string + "']")).click();
+            new Actions(getDriver()).moveByOffset(100, 0).build().perform();
+        }
+
+        /**
+         * @since
+         * @param string
+         */
+        private void menu(String string) {
+            getDriver().findElement(
+                    By.xpath("//span[text() = '" + string + "']")).click();
+
+        }
+
+    }
+
 }