summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatti Tahvonen <matti@vaadin.com>2013-09-27 15:07:48 +0300
committerVaadin Code Review <review@vaadin.com>2013-10-08 14:41:03 +0000
commite1c38bf70c9bb563dbe7771c8713a94fd9e99836 (patch)
tree8014701bdd1c01993d97b974eb11e7f8f7efc9a4
parent6779857911a4eeb2bbfe0720629b058facc40f4d (diff)
downloadvaadin-framework-e1c38bf70c9bb563dbe7771c8713a94fd9e99836.tar.gz
vaadin-framework-e1c38bf70c9bb563dbe7771c8713a94fd9e99836.zip
Avoid obsolete calendar panel renderings to avoid various NPEs.
(#12504,#12667) Change-Id: Ie0a9a8d9913116520b766062ebabdb771a76d1b6
-rw-r--r--client/src/com/vaadin/client/ui/VCalendarPanel.java24
-rw-r--r--client/src/com/vaadin/client/ui/datefield/PopupDateFieldConnector.java9
-rw-r--r--uitest/src/com/vaadin/tests/components/datefield/DateFieldTest.java103
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();
+
+ }
+
+ }
+
}