diff options
author | Matti Tahvonen <matti@vaadin.com> | 2013-09-27 15:07:48 +0300 |
---|---|---|
committer | Vaadin Code Review <review@vaadin.com> | 2013-10-08 14:41:03 +0000 |
commit | e1c38bf70c9bb563dbe7771c8713a94fd9e99836 (patch) | |
tree | 8014701bdd1c01993d97b974eb11e7f8f7efc9a4 | |
parent | 6779857911a4eeb2bbfe0720629b058facc40f4d (diff) | |
download | vaadin-framework-e1c38bf70c9bb563dbe7771c8713a94fd9e99836.tar.gz vaadin-framework-e1c38bf70c9bb563dbe7771c8713a94fd9e99836.zip |
Avoid obsolete calendar panel renderings to avoid various NPEs.
(#12504,#12667)
Change-Id: Ie0a9a8d9913116520b766062ebabdb771a76d1b6
3 files changed, 121 insertions, 15 deletions
diff --git a/client/src/com/vaadin/client/ui/VCalendarPanel.java b/client/src/com/vaadin/client/ui/VCalendarPanel.java index 1f40298760..58e0448b5f 100644 --- a/client/src/com/vaadin/client/ui/VCalendarPanel.java +++ b/client/src/com/vaadin/client/ui/VCalendarPanel.java @@ -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(); + } } } } diff --git a/client/src/com/vaadin/client/ui/datefield/PopupDateFieldConnector.java b/client/src/com/vaadin/client/ui/datefield/PopupDateFieldConnector.java index 627478ebe5..f018caefa5 100644 --- a/client/src/com/vaadin/client/ui/datefield/PopupDateFieldConnector.java +++ b/client/src/com/vaadin/client/ui/datefield/PopupDateFieldConnector.java @@ -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(); diff --git a/uitest/src/com/vaadin/tests/components/datefield/DateFieldTest.java b/uitest/src/com/vaadin/tests/components/datefield/DateFieldTest.java index d92199a214..2a61e79f32 100644 --- a/uitest/src/com/vaadin/tests/components/datefield/DateFieldTest.java +++ b/uitest/src/com/vaadin/tests/components/datefield/DateFieldTest.java @@ -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(); + + } + + } + } |