]> source.dussan.org Git - vaadin-framework.git/commitdiff
Sanitize connectors for PopupDateField and DateField. (#17090)
authorSauli Tähkäpää <sauli@vaadin.com>
Mon, 16 Mar 2015 21:53:56 +0000 (23:53 +0200)
committerSauli Tähkäpää <sauli@vaadin.com>
Mon, 16 Mar 2015 22:21:04 +0000 (00:21 +0200)
Change-Id: I667796430eeaa0ddd8142b0c229fe133cd30cd49

client/src/com/vaadin/client/ui/AbstractComponentConnector.java
client/src/com/vaadin/client/ui/datefield/DateFieldConnector.java [new file with mode: 0644]
client/src/com/vaadin/client/ui/datefield/PopupDateFieldConnector.java
uitest/src/com/vaadin/tests/components/datefield/PopupDateFieldConnector.java [new file with mode: 0644]
uitest/src/com/vaadin/tests/components/datefield/PopupDateFieldConnectorTest.java [new file with mode: 0644]

index 46ad2894882f27a39cd7485ba13f92c50a54c5b1..24a04384766506cbad910490431df547a39d0add 100644 (file)
@@ -35,7 +35,6 @@ import com.vaadin.client.communication.StateChangeEvent;
 import com.vaadin.client.metadata.NoDataException;
 import com.vaadin.client.metadata.Type;
 import com.vaadin.client.metadata.TypeData;
-import com.vaadin.client.ui.datefield.PopupDateFieldConnector;
 import com.vaadin.client.ui.ui.UIConnector;
 import com.vaadin.shared.AbstractComponentState;
 import com.vaadin.shared.ComponentConstants;
@@ -404,7 +403,7 @@ public abstract class AbstractComponentConnector extends AbstractConnector
      * updated in another widget in addition to the one returned by the
      * <code>Connector</code>'s {@link #getWidget()}, or if the prefix should be
      * different. For example see
-     * {@link PopupDateFieldConnector#setWidgetStyleNameWithPrefix(String, String, boolean)}
+     * {@link com.vaadin.client.ui.datefield.DateFieldConnector#setWidgetStyleNameWithPrefix(String, String, boolean)}
      * </p>
      * 
      * @param styleName
diff --git a/client/src/com/vaadin/client/ui/datefield/DateFieldConnector.java b/client/src/com/vaadin/client/ui/datefield/DateFieldConnector.java
new file mode 100644 (file)
index 0000000..042b8db
--- /dev/null
@@ -0,0 +1,219 @@
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ * 
+ * Licensed 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 com.vaadin.client.ui.datefield;
+
+import java.util.Date;
+
+import com.google.gwt.event.logical.shared.CloseEvent;
+import com.google.gwt.event.logical.shared.CloseHandler;
+import com.google.gwt.user.client.ui.PopupPanel;
+import com.vaadin.client.ApplicationConnection;
+import com.vaadin.client.DateTimeService;
+import com.vaadin.client.UIDL;
+import com.vaadin.client.communication.StateChangeEvent;
+import com.vaadin.client.ui.VCalendarPanel.FocusChangeListener;
+import com.vaadin.client.ui.VCalendarPanel.TimeChangeListener;
+import com.vaadin.client.ui.VPopupCalendar;
+import com.vaadin.shared.ui.Connect;
+import com.vaadin.shared.ui.datefield.PopupDateFieldState;
+import com.vaadin.shared.ui.datefield.Resolution;
+import com.vaadin.ui.DateField;
+import com.vaadin.ui.PopupDateField;
+
+@Connect(DateField.class)
+public class DateFieldConnector extends TextualDateConnector {
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see com.vaadin.client.ui.AbstractConnector#init()
+     */
+    @Override
+    protected void init() {
+        getWidget().popup.addCloseHandler(new CloseHandler<PopupPanel>() {
+
+            @Override
+            public void onClose(CloseEvent<PopupPanel> event) {
+                /*
+                 * FIXME This is a hack so we do not have to rewrite half of the
+                 * datefield so values are not sent while selecting a date
+                 * (#6252).
+                 * 
+                 * The datefield will now only set the date UIDL variables while
+                 * the user is selecting year/month/date/time and not send them
+                 * directly. Only when the user closes the popup (by clicking on
+                 * a day/enter/clicking outside of popup) then the new value is
+                 * communicated to the server.
+                 */
+                if (getWidget().isImmediate()) {
+                    getConnection().sendPendingVariableChanges();
+                }
+            }
+        });
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see com.vaadin.client.ui.VTextualDate#updateFromUIDL(com.vaadin
+     * .client.UIDL, com.vaadin.client.ApplicationConnection)
+     */
+    @Override
+    @SuppressWarnings("deprecation")
+    public void updateFromUIDL(UIDL uidl, ApplicationConnection client) {
+
+        String oldLocale = getWidget().getCurrentLocale();
+
+        getWidget().parsable = uidl.getBooleanAttribute("parsable");
+
+        super.updateFromUIDL(uidl, client);
+
+        getWidget().calendar.setDateTimeService(getWidget()
+                .getDateTimeService());
+        getWidget().calendar.setShowISOWeekNumbers(getWidget()
+                .isShowISOWeekNumbers());
+        if (getWidget().calendar.getResolution() != getWidget()
+                .getCurrentResolution()) {
+            boolean hasSelectedDate = false;
+            getWidget().calendar.setResolution(getWidget()
+                    .getCurrentResolution());
+            if (getWidget().calendar.getDate() != null
+                    && getWidget().getCurrentDate() != null) {
+                hasSelectedDate = true;
+                getWidget().calendar.setDate((Date) getWidget()
+                        .getCurrentDate().clone());
+            }
+            // force re-render when changing resolution only
+            getWidget().calendar.renderCalendar(hasSelectedDate);
+        }
+
+        // Force re-render of calendar if locale has changed (#12153)
+        if (!getWidget().getCurrentLocale().equals(oldLocale)) {
+            getWidget().calendar.renderCalendar();
+        }
+
+        if (getWidget().getCurrentResolution().getCalendarField() <= Resolution.MONTH
+                .getCalendarField()) {
+            getWidget().calendar
+                    .setFocusChangeListener(new FocusChangeListener() {
+                        @Override
+                        public void focusChanged(Date date) {
+
+                            getWidget().updateValue(date);
+                            getWidget().buildDate();
+                            Date date2 = getWidget().calendar.getDate();
+                            date2.setYear(date.getYear());
+                            date2.setMonth(date.getMonth());
+                        }
+                    });
+        } else {
+            getWidget().calendar.setFocusChangeListener(null);
+        }
+
+        if (getWidget().getCurrentResolution().getCalendarField() > Resolution.DAY
+                .getCalendarField()) {
+            getWidget().calendar
+                    .setTimeChangeListener(new TimeChangeListener() {
+                        @Override
+                        public void changed(int hour, int min, int sec, int msec) {
+                            Date d = getWidget().getDate();
+                            if (d == null) {
+                                // date currently null, use the value from
+                                // calendarPanel
+                                // (~ client time at the init of the widget)
+                                d = (Date) getWidget().calendar.getDate()
+                                        .clone();
+                            }
+                            d.setHours(hour);
+                            d.setMinutes(min);
+                            d.setSeconds(sec);
+                            DateTimeService.setMilliseconds(d, msec);
+
+                            // Always update time changes to the server
+                            getWidget().updateValue(d);
+
+                            // Update text field
+                            getWidget().buildDate();
+                        }
+                    });
+        }
+
+        if (getWidget().isReadonly()) {
+            getWidget().calendarToggle.addStyleName(VPopupCalendar.CLASSNAME
+                    + "-button-readonly");
+        } else {
+            getWidget().calendarToggle.removeStyleName(VPopupCalendar.CLASSNAME
+                    + "-button-readonly");
+        }
+
+        getWidget().setDescriptionForAssistiveDevices(
+                getState().descriptionForAssistiveDevices);
+
+        getWidget().setTextFieldTabIndex();
+    }
+
+    @Override
+    public VPopupCalendar getWidget() {
+        return (VPopupCalendar) super.getWidget();
+    }
+
+    @Override
+    public PopupDateFieldState getState() {
+        return (PopupDateFieldState) super.getState();
+    }
+
+    @Override
+    public void onStateChanged(StateChangeEvent stateChangeEvent) {
+        super.onStateChanged(stateChangeEvent);
+        getWidget().setTextFieldEnabled(getState().textFieldEnabled);
+        getWidget().setRangeStart(nullSafeDateClone(getState().rangeStart));
+        getWidget().setRangeEnd(nullSafeDateClone(getState().rangeEnd));
+    }
+
+    private Date nullSafeDateClone(Date date) {
+        if (date == null) {
+            return null;
+        } else {
+            return (Date) date.clone();
+        }
+    }
+
+    @Override
+    protected void setWidgetStyleName(String styleName, boolean add) {
+        super.setWidgetStyleName(styleName, add);
+
+        // update the style change to popup calendar widget
+        getWidget().popup.setStyleName(styleName, add);
+    }
+
+    @Override
+    protected void setWidgetStyleNameWithPrefix(String prefix,
+            String styleName, boolean add) {
+        super.setWidgetStyleNameWithPrefix(prefix, styleName, add);
+
+        // update the style change to popup calendar widget with the correct
+        // prefix
+        if (!styleName.startsWith("-")) {
+            getWidget().popup.setStyleName(getWidget().getStylePrimaryName()
+                    + "-popup-" + styleName, add);
+        } else {
+            getWidget().popup.setStyleName(getWidget().getStylePrimaryName()
+                    + "-popup" + styleName, add);
+        }
+    }
+
+}
index 7bcaaba04e9e69311e8d8acec0b800ae43ae3c50..31232177d3a080453a9dcef3e85ccd4798c13aad 100644 (file)
@@ -1,12 +1,12 @@
 /*
  * Copyright 2000-2014 Vaadin Ltd.
- * 
+ *
  * Licensed 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
 
 package com.vaadin.client.ui.datefield;
 
-import java.util.Date;
-
-import com.google.gwt.event.logical.shared.CloseEvent;
-import com.google.gwt.event.logical.shared.CloseHandler;
-import com.google.gwt.user.client.ui.PopupPanel;
-import com.vaadin.client.ApplicationConnection;
-import com.vaadin.client.DateTimeService;
-import com.vaadin.client.UIDL;
-import com.vaadin.client.communication.StateChangeEvent;
-import com.vaadin.client.ui.VCalendarPanel.FocusChangeListener;
-import com.vaadin.client.ui.VCalendarPanel.TimeChangeListener;
-import com.vaadin.client.ui.VPopupCalendar;
 import com.vaadin.shared.ui.Connect;
-import com.vaadin.shared.ui.datefield.PopupDateFieldState;
-import com.vaadin.shared.ui.datefield.Resolution;
-import com.vaadin.ui.DateField;
-
-@Connect(DateField.class)
-public class PopupDateFieldConnector extends TextualDateConnector {
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see com.vaadin.client.ui.AbstractConnector#init()
-     */
-    @Override
-    protected void init() {
-        getWidget().popup.addCloseHandler(new CloseHandler<PopupPanel>() {
-
-            @Override
-            public void onClose(CloseEvent<PopupPanel> event) {
-                /*
-                 * FIXME This is a hack so we do not have to rewrite half of the
-                 * datefield so values are not sent while selecting a date
-                 * (#6252).
-                 * 
-                 * The datefield will now only set the date UIDL variables while
-                 * the user is selecting year/month/date/time and not send them
-                 * directly. Only when the user closes the popup (by clicking on
-                 * a day/enter/clicking outside of popup) then the new value is
-                 * communicated to the server.
-                 */
-                if (getWidget().isImmediate()) {
-                    getConnection().sendPendingVariableChanges();
-                }
-            }
-        });
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see com.vaadin.client.ui.VTextualDate#updateFromUIDL(com.vaadin
-     * .client.UIDL, com.vaadin.client.ApplicationConnection)
-     */
-    @Override
-    @SuppressWarnings("deprecation")
-    public void updateFromUIDL(UIDL uidl, ApplicationConnection client) {
-
-        String oldLocale = getWidget().getCurrentLocale();
-
-        getWidget().parsable = uidl.getBooleanAttribute("parsable");
-
-        super.updateFromUIDL(uidl, client);
-
-        getWidget().calendar.setDateTimeService(getWidget()
-                .getDateTimeService());
-        getWidget().calendar.setShowISOWeekNumbers(getWidget()
-                .isShowISOWeekNumbers());
-        if (getWidget().calendar.getResolution() != getWidget()
-                .getCurrentResolution()) {
-            boolean hasSelectedDate = false;
-            getWidget().calendar.setResolution(getWidget()
-                    .getCurrentResolution());
-            if (getWidget().calendar.getDate() != null
-                    && getWidget().getCurrentDate() != null) {
-                hasSelectedDate = true;
-                getWidget().calendar.setDate((Date) getWidget()
-                        .getCurrentDate().clone());
-            }
-            // force re-render when changing resolution only
-            getWidget().calendar.renderCalendar(hasSelectedDate);
-        }
-
-        // Force re-render of calendar if locale has changed (#12153)
-        if (!getWidget().getCurrentLocale().equals(oldLocale)) {
-            getWidget().calendar.renderCalendar();
-        }
-
-        if (getWidget().getCurrentResolution().getCalendarField() <= Resolution.MONTH
-                .getCalendarField()) {
-            getWidget().calendar
-                    .setFocusChangeListener(new FocusChangeListener() {
-                        @Override
-                        public void focusChanged(Date date) {
-
-                            getWidget().updateValue(date);
-                            getWidget().buildDate();
-                            Date date2 = getWidget().calendar.getDate();
-                            date2.setYear(date.getYear());
-                            date2.setMonth(date.getMonth());
-                        }
-                    });
-        } else {
-            getWidget().calendar.setFocusChangeListener(null);
-        }
-
-        if (getWidget().getCurrentResolution().getCalendarField() > Resolution.DAY
-                .getCalendarField()) {
-            getWidget().calendar
-                    .setTimeChangeListener(new TimeChangeListener() {
-                        @Override
-                        public void changed(int hour, int min, int sec, int msec) {
-                            Date d = getWidget().getDate();
-                            if (d == null) {
-                                // date currently null, use the value from
-                                // calendarPanel
-                                // (~ client time at the init of the widget)
-                                d = (Date) getWidget().calendar.getDate()
-                                        .clone();
-                            }
-                            d.setHours(hour);
-                            d.setMinutes(min);
-                            d.setSeconds(sec);
-                            DateTimeService.setMilliseconds(d, msec);
-
-                            // Always update time changes to the server
-                            getWidget().updateValue(d);
-
-                            // Update text field
-                            getWidget().buildDate();
-                        }
-                    });
-        }
-
-        if (getWidget().isReadonly()) {
-            getWidget().calendarToggle.addStyleName(VPopupCalendar.CLASSNAME
-                    + "-button-readonly");
-        } else {
-            getWidget().calendarToggle.removeStyleName(VPopupCalendar.CLASSNAME
-                    + "-button-readonly");
-        }
-
-        getWidget().setDescriptionForAssistiveDevices(
-                getState().descriptionForAssistiveDevices);
-
-        getWidget().setTextFieldTabIndex();
-    }
-
-    @Override
-    public VPopupCalendar getWidget() {
-        return (VPopupCalendar) super.getWidget();
-    }
-
-    @Override
-    public PopupDateFieldState getState() {
-        return (PopupDateFieldState) super.getState();
-    }
-
-    @Override
-    public void onStateChanged(StateChangeEvent stateChangeEvent) {
-        super.onStateChanged(stateChangeEvent);
-        getWidget().setTextFieldEnabled(getState().textFieldEnabled);
-        getWidget().setRangeStart(nullSafeDateClone(getState().rangeStart));
-        getWidget().setRangeEnd(nullSafeDateClone(getState().rangeEnd));
-    }
-
-    private Date nullSafeDateClone(Date date) {
-        if (date == null) {
-            return null;
-        } else {
-            return (Date) date.clone();
-        }
-    }
-
-    @Override
-    protected void setWidgetStyleName(String styleName, boolean add) {
-        super.setWidgetStyleName(styleName, add);
-
-        // update the style change to popup calendar widget
-        getWidget().popup.setStyleName(styleName, add);
-    }
-
-    @Override
-    protected void setWidgetStyleNameWithPrefix(String prefix,
-            String styleName, boolean add) {
-        super.setWidgetStyleNameWithPrefix(prefix, styleName, add);
+import com.vaadin.ui.PopupDateField;
 
-        // update the style change to popup calendar widget with the correct
-        // prefix
-        if (!styleName.startsWith("-")) {
-            getWidget().popup.setStyleName(getWidget().getStylePrimaryName()
-                    + "-popup-" + styleName, add);
-        } else {
-            getWidget().popup.setStyleName(getWidget().getStylePrimaryName()
-                    + "-popup" + styleName, add);
-        }
-    }
+@Connect(PopupDateField.class)
+public class PopupDateFieldConnector extends DateFieldConnector {
 
 }
diff --git a/uitest/src/com/vaadin/tests/components/datefield/PopupDateFieldConnector.java b/uitest/src/com/vaadin/tests/components/datefield/PopupDateFieldConnector.java
new file mode 100644 (file)
index 0000000..5cdc8f1
--- /dev/null
@@ -0,0 +1,24 @@
+package com.vaadin.tests.components.datefield;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.DateField;
+import com.vaadin.ui.PopupDateField;
+
+public class PopupDateFieldConnector extends AbstractTestUI {
+    @Override
+    protected void setup(VaadinRequest request) {
+        addComponent(new PopupDateField());
+        addComponent(new DateField());
+    }
+
+    @Override
+    protected Integer getTicketNumber() {
+        return 17090;
+    }
+
+    @Override
+    protected String getTestDescription() {
+        return "PopupDateFieldElement should be accessible using TB4 PopupDateFieldElement.";
+    }
+}
diff --git a/uitest/src/com/vaadin/tests/components/datefield/PopupDateFieldConnectorTest.java b/uitest/src/com/vaadin/tests/components/datefield/PopupDateFieldConnectorTest.java
new file mode 100644 (file)
index 0000000..5334327
--- /dev/null
@@ -0,0 +1,21 @@
+package com.vaadin.tests.components.datefield;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.core.Is.is;
+
+import org.junit.Test;
+
+import com.vaadin.testbench.elements.DateFieldElement;
+import com.vaadin.testbench.elements.PopupDateFieldElement;
+import com.vaadin.tests.tb3.SingleBrowserTest;
+
+public class PopupDateFieldConnectorTest extends SingleBrowserTest {
+
+    @Test
+    public void popupDateFieldElementIsLocated() {
+        openTestURL();
+
+        assertThat($(PopupDateFieldElement.class).all().size(), is(1));
+        assertThat($(DateFieldElement.class).all().size(), is(2));
+    }
+}
\ No newline at end of file