summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArtur Signell <artur@vaadin.com>2014-04-23 20:45:14 +0300
committerArtur Signell <artur@vaadin.com>2014-04-23 20:45:39 +0300
commit41cb27e85f61f5abb029a98af66217ce400b2196 (patch)
tree609df412869abde48131079d45b2981bcb210744
parent9f30eb285252348c349e9a759ac71098eb74a06a (diff)
parent0d4080ba5e5931fa928675ba6c95540e34b2f281 (diff)
downloadvaadin-framework-41cb27e85f61f5abb029a98af66217ce400b2196.tar.gz
vaadin-framework-41cb27e85f61f5abb029a98af66217ce400b2196.zip
Merge changes from origin/7.1
0d4080b ContainerEventProvider returns style names from container. Fixes #10718 6e91bdf Add test for TransactionalPropertyWrapper memory leaks f0aaf89 Fixed resetting of ComboBox if focused and new items allowed (#13413). e033fcd Always initialize WebBrowser for new sessions (#13571) 168de1f Revert "Drag image for text-area should contain text of text-area (#13557)" 35e2a34 Fix FieldGroup and TransactionalPropertyWrapper memory leaks (#13438) 7e5d44d Introduce a drag threshold for Drag and Drop (#13381) f227f0c Drag image for text-area should contain text of text-area (#13557). Change-Id: Idb01471f8ab0c7118fa884c364e6bc200d13948a
-rw-r--r--client/src/com/vaadin/client/ui/combobox/ComboBoxConnector.java4
-rw-r--r--client/src/com/vaadin/client/ui/dd/VDragAndDropManager.java74
-rw-r--r--server/src/com/vaadin/data/fieldgroup/FieldGroup.java8
-rw-r--r--server/src/com/vaadin/data/util/TransactionalPropertyWrapper.java26
-rw-r--r--server/src/com/vaadin/server/BootstrapHandler.java4
-rw-r--r--server/src/com/vaadin/server/VaadinService.java3
-rw-r--r--server/src/com/vaadin/server/communication/UIInitHandler.java2
-rw-r--r--server/src/com/vaadin/ui/components/calendar/ContainerEventProvider.java4
-rw-r--r--server/tests/src/com/vaadin/data/util/TransactionalPropertyWrapperTest.java116
-rw-r--r--server/tests/src/com/vaadin/tests/server/component/calendar/ContainerDataSource.java32
-rw-r--r--uitest/src/com/vaadin/tests/components/combobox/ComboBoxSetNullWhenNewItemsAllowed.java61
-rw-r--r--uitest/src/com/vaadin/tests/components/combobox/ComboBoxSetNullWhenNewItemsAllowedTest.java55
-rw-r--r--uitest/src/com/vaadin/tests/requesthandlers/UnsupportedBrowserHandlerUserAgents.java76
-rw-r--r--uitest/src/com/vaadin/tests/tb3/PrivateTB3Configuration.java28
14 files changed, 436 insertions, 57 deletions
diff --git a/client/src/com/vaadin/client/ui/combobox/ComboBoxConnector.java b/client/src/com/vaadin/client/ui/combobox/ComboBoxConnector.java
index 8dec26cf90..c9c1d9c50c 100644
--- a/client/src/com/vaadin/client/ui/combobox/ComboBoxConnector.java
+++ b/client/src/com/vaadin/client/ui/combobox/ComboBoxConnector.java
@@ -267,7 +267,9 @@ public class ComboBoxConnector extends AbstractFieldConnector implements
// we have focus in field, prompting can't be set on, instead
// just clear the input if the value has changed from something
// else to null
- if (getWidget().selectedOptionKey != null) {
+ if (getWidget().selectedOptionKey != null
+ || (getWidget().allowNewItem && !getWidget().tb
+ .getValue().isEmpty())) {
getWidget().tb.setValue("");
}
}
diff --git a/client/src/com/vaadin/client/ui/dd/VDragAndDropManager.java b/client/src/com/vaadin/client/ui/dd/VDragAndDropManager.java
index f44fceb398..1b1d7d72d8 100644
--- a/client/src/com/vaadin/client/ui/dd/VDragAndDropManager.java
+++ b/client/src/com/vaadin/client/ui/dd/VDragAndDropManager.java
@@ -31,7 +31,6 @@ import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.Event.NativePreviewEvent;
import com.google.gwt.user.client.Event.NativePreviewHandler;
-import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.Widget;
import com.vaadin.client.ApplicationConnection;
@@ -340,10 +339,7 @@ public class VDragAndDropManager {
.addNativePreviewHandler(defaultDragAndDropEventHandler);
if (dragElement != null
&& dragElement.getParentElement() == null) {
- // deferred attaching drag image is on going, we can
- // hurry with it now
- lazyAttachDragElement.cancel();
- lazyAttachDragElement.run();
+ attachDragElement();
}
}
// just capture something to prevent text selection in IE
@@ -365,6 +361,13 @@ public class VDragAndDropManager {
deferredStartRegistration = Event
.addNativePreviewHandler(new NativePreviewHandler() {
+ private int startX = Util
+ .getTouchOrMouseClientX(currentDrag
+ .getCurrentGwtEvent());
+ private int startY = Util
+ .getTouchOrMouseClientY(currentDrag
+ .getCurrentGwtEvent());
+
@Override
public void onPreviewNativeEvent(
NativePreviewEvent event) {
@@ -417,13 +420,23 @@ public class VDragAndDropManager {
}
case Event.ONMOUSEMOVE:
case Event.ONTOUCHMOVE:
- if (deferredStartRegistration != null) {
- deferredStartRegistration.removeHandler();
- deferredStartRegistration = null;
+ int currentX = Util
+ .getTouchOrMouseClientX(event
+ .getNativeEvent());
+ int currentY = Util
+ .getTouchOrMouseClientY(event
+ .getNativeEvent());
+ if (Math.abs(startX - currentX) > 3
+ || Math.abs(startY - currentY) > 3) {
+ if (deferredStartRegistration != null) {
+ deferredStartRegistration
+ .removeHandler();
+ deferredStartRegistration = null;
+ }
+ currentDrag.setCurrentGwtEvent(event
+ .getNativeEvent());
+ startDrag.execute();
}
- currentDrag.setCurrentGwtEvent(event
- .getNativeEvent());
- startDrag.execute();
break;
default:
// on any other events, clean up the
@@ -712,16 +725,7 @@ public class VDragAndDropManager {
updateDragImagePosition();
if (isStarted) {
- lazyAttachDragElement.run();
- } else {
- /*
- * To make our default dnd handler as compatible as possible, we
- * need to defer the appearance of dragElement. Otherwise events
- * that are derived from sequences of other events might not
- * fire as domchanged will fire between them or mouse up might
- * happen on dragElement.
- */
- lazyAttachDragElement.schedule(300);
+ attachDragElement();
}
}
}
@@ -730,24 +734,20 @@ public class VDragAndDropManager {
return dragElement;
}
- private final Timer lazyAttachDragElement = new Timer() {
-
- @Override
- public void run() {
- if (dragElement != null && dragElement.getParentElement() == null) {
- ApplicationConnection connection = getCurrentDragApplicationConnection();
- Element dragImageParent;
- if (connection == null) {
- VConsole.error("Could not determine ApplicationConnection for current drag operation. The drag image will likely look broken");
- dragImageParent = RootPanel.getBodyElement();
- } else {
- dragImageParent = VOverlay.getOverlayContainer(connection);
- }
- dragImageParent.appendChild(dragElement);
+ public void attachDragElement() {
+ if (dragElement != null && dragElement.getParentElement() == null) {
+ ApplicationConnection connection = getCurrentDragApplicationConnection();
+ Element dragImageParent;
+ if (connection == null) {
+ VConsole.error("Could not determine ApplicationConnection for current drag operation. The drag image will likely look broken");
+ dragImageParent = RootPanel.getBodyElement();
+ } else {
+ dragImageParent = VOverlay.getOverlayContainer(connection);
}
-
+ dragImageParent.appendChild(dragElement);
}
- };
+
+ }
private Command deferredCommand;
diff --git a/server/src/com/vaadin/data/fieldgroup/FieldGroup.java b/server/src/com/vaadin/data/fieldgroup/FieldGroup.java
index 7edcc9719c..6a2d1a125d 100644
--- a/server/src/com/vaadin/data/fieldgroup/FieldGroup.java
+++ b/server/src/com/vaadin/data/fieldgroup/FieldGroup.java
@@ -312,12 +312,18 @@ public class FieldGroup implements Serializable {
"The given field is not part of this FieldBinder");
}
+ TransactionalPropertyWrapper<?> wrapper = null;
Property fieldDataSource = field.getPropertyDataSource();
if (fieldDataSource instanceof TransactionalPropertyWrapper) {
- fieldDataSource = ((TransactionalPropertyWrapper) fieldDataSource)
+ wrapper = (TransactionalPropertyWrapper<?>) fieldDataSource;
+ fieldDataSource = ((TransactionalPropertyWrapper<?>) fieldDataSource)
.getWrappedProperty();
+
}
if (fieldDataSource == getItemProperty(propertyId)) {
+ if (null != wrapper) {
+ wrapper.detachFromProperty();
+ }
field.setPropertyDataSource(null);
}
fieldToPropertyId.remove(field);
diff --git a/server/src/com/vaadin/data/util/TransactionalPropertyWrapper.java b/server/src/com/vaadin/data/util/TransactionalPropertyWrapper.java
index 6b0119c503..3c52ab9afc 100644
--- a/server/src/com/vaadin/data/util/TransactionalPropertyWrapper.java
+++ b/server/src/com/vaadin/data/util/TransactionalPropertyWrapper.java
@@ -48,18 +48,32 @@ public class TransactionalPropertyWrapper<T> extends AbstractProperty<T>
private boolean inTransaction = false;
private boolean valueChangePending;
private T valueBeforeTransaction;
+ private final ValueChangeListener listener = new ValueChangeListener() {
+
+ @Override
+ public void valueChange(ValueChangeEvent event) {
+ fireValueChange();
+ }
+ };
public TransactionalPropertyWrapper(Property<T> wrappedProperty) {
this.wrappedProperty = wrappedProperty;
if (wrappedProperty instanceof ValueChangeNotifier) {
((ValueChangeNotifier) wrappedProperty)
- .addListener(new ValueChangeListener() {
+ .addValueChangeListener(listener);
+ }
+ }
- @Override
- public void valueChange(ValueChangeEvent event) {
- fireValueChange();
- }
- });
+ /**
+ * Removes the ValueChangeListener from wrapped Property that was added by
+ * TransactionalPropertyWrapper.
+ *
+ * @since 7.1.15
+ */
+ public void detachFromProperty() {
+ if (wrappedProperty instanceof ValueChangeNotifier) {
+ ((ValueChangeNotifier) wrappedProperty)
+ .removeValueChangeListener(listener);
}
}
diff --git a/server/src/com/vaadin/server/BootstrapHandler.java b/server/src/com/vaadin/server/BootstrapHandler.java
index bfdbea3086..069cd61253 100644
--- a/server/src/com/vaadin/server/BootstrapHandler.java
+++ b/server/src/com/vaadin/server/BootstrapHandler.java
@@ -156,10 +156,6 @@ public abstract class BootstrapHandler extends SynchronizedRequestHandler {
public boolean synchronizedHandleRequest(VaadinSession session,
VaadinRequest request, VaadinResponse response) throws IOException {
try {
- // Update WebBrowser here only to make WebBrowser information
- // available in init for LegacyApplications
- session.getBrowser().updateRequestDetails(request);
-
List<UIProvider> uiProviders = session.getUIProviders();
UIClassSelectionEvent classSelectionEvent = new UIClassSelectionEvent(
diff --git a/server/src/com/vaadin/server/VaadinService.java b/server/src/com/vaadin/server/VaadinService.java
index b96e284e6e..6860166a11 100644
--- a/server/src/com/vaadin/server/VaadinService.java
+++ b/server/src/com/vaadin/server/VaadinService.java
@@ -750,6 +750,9 @@ public abstract class VaadinService implements Serializable {
session.storeInSession(this, request.getWrappedSession());
+ // Initial WebBrowser data comes from the request
+ session.getBrowser().updateRequestDetails(request);
+
// Initial locale comes from the request
Locale locale = request.getLocale();
session.setLocale(locale);
diff --git a/server/src/com/vaadin/server/communication/UIInitHandler.java b/server/src/com/vaadin/server/communication/UIInitHandler.java
index 76460e153a..898368d53c 100644
--- a/server/src/com/vaadin/server/communication/UIInitHandler.java
+++ b/server/src/com/vaadin/server/communication/UIInitHandler.java
@@ -68,7 +68,7 @@ public abstract class UIInitHandler extends SynchronizedRequestHandler {
try {
assert UI.getCurrent() == null;
- // Set browser information from the request
+ // Update browser information from the request
session.getBrowser().updateRequestDetails(request);
UI uI = getBrowserDetailsUI(request, session);
diff --git a/server/src/com/vaadin/ui/components/calendar/ContainerEventProvider.java b/server/src/com/vaadin/ui/components/calendar/ContainerEventProvider.java
index 37ea255d27..b025de6f9a 100644
--- a/server/src/com/vaadin/ui/components/calendar/ContainerEventProvider.java
+++ b/server/src/com/vaadin/ui/components/calendar/ContainerEventProvider.java
@@ -224,8 +224,8 @@ public class ContainerEventProvider implements CalendarEditableEventProvider,
}
if (styleNameProperty != null
&& item.getItemPropertyIds().contains(styleNameProperty)) {
- basicEvent.setDescription(String.valueOf(item.getItemProperty(
- descriptionProperty).getValue()));
+ basicEvent.setStyleName(String.valueOf(item.getItemProperty(
+ styleNameProperty).getValue()));
}
event = basicEvent;
}
diff --git a/server/tests/src/com/vaadin/data/util/TransactionalPropertyWrapperTest.java b/server/tests/src/com/vaadin/data/util/TransactionalPropertyWrapperTest.java
new file mode 100644
index 0000000000..8e83db5aef
--- /dev/null
+++ b/server/tests/src/com/vaadin/data/util/TransactionalPropertyWrapperTest.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright 2000-2013 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.data.util;
+
+import static org.junit.Assert.assertTrue;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.Test;
+
+import com.vaadin.data.fieldgroup.FieldGroup;
+import com.vaadin.ui.TextField;
+
+/**
+ * Test verifying that TransactionalPropertyWrapper removes it's listener from
+ * wrapped Property
+ *
+ * @since 7.1.15
+ * @author Vaadin Ltd
+ */
+public class TransactionalPropertyWrapperTest {
+
+ @SuppressWarnings("serial")
+ public class TestingProperty<T extends Object> extends
+ ObjectProperty<Object> {
+
+ private List<ValueChangeListener> listeners = new ArrayList<ValueChangeListener>();
+
+ public TestingProperty(Object value) {
+ super(value);
+ }
+
+ @Override
+ public void addValueChangeListener(ValueChangeListener listener) {
+ super.addValueChangeListener(listener);
+ listeners.add(listener);
+ }
+
+ @Override
+ public void removeValueChangeListener(ValueChangeListener listener) {
+ super.removeValueChangeListener(listener);
+ if (listeners.contains(listener)) {
+ listeners.remove(listener);
+ }
+ }
+
+ public boolean hasListeners() {
+ return !listeners.isEmpty();
+ }
+ }
+
+ private final TextField nameField = new TextField("Name");
+ private final TextField ageField = new TextField("Age");
+ private final TextField unboundField = new TextField("No FieldGroup");
+ private final TestingProperty<String> unboundProp = new TestingProperty<String>(
+ "Hello World");
+ private final PropertysetItem item = new PropertysetItem();
+
+ @Test
+ public void fieldGroupBindAndUnbind() {
+ item.addItemProperty("name", new TestingProperty<String>(
+ "Just some text"));
+ item.addItemProperty("age", new TestingProperty<String>("42"));
+
+ final FieldGroup binder = new FieldGroup(item);
+ binder.setBuffered(false);
+
+ for (int i = 0; i < 2; ++i) {
+ binder.bind(nameField, "name");
+ binder.bind(ageField, "age");
+ unboundField.setPropertyDataSource(unboundProp);
+
+ assertTrue("No listeners in Properties", fieldsHaveListeners(true));
+
+ binder.unbind(nameField);
+ binder.unbind(ageField);
+ unboundField.setPropertyDataSource(null);
+
+ assertTrue("Listeners in Properties after unbinding",
+ fieldsHaveListeners(false));
+ }
+ }
+
+ /**
+ * Check that all listeners have same hasListeners() response
+ *
+ * @param expected
+ * expected response
+ * @return true if all are the same as expected. false if not
+ */
+ private boolean fieldsHaveListeners(boolean expected) {
+ for (Object id : item.getItemPropertyIds()) {
+ TestingProperty<?> itemProperty = (TestingProperty<?>) item
+ .getItemProperty(id);
+
+ if (itemProperty.hasListeners() != expected) {
+ return false;
+ }
+ }
+ return unboundProp.hasListeners() == expected;
+ }
+}
diff --git a/server/tests/src/com/vaadin/tests/server/component/calendar/ContainerDataSource.java b/server/tests/src/com/vaadin/tests/server/component/calendar/ContainerDataSource.java
index 2bc95e371c..d5b0d5d9c8 100644
--- a/server/tests/src/com/vaadin/tests/server/component/calendar/ContainerDataSource.java
+++ b/server/tests/src/com/vaadin/tests/server/component/calendar/ContainerDataSource.java
@@ -25,6 +25,7 @@ import org.junit.Test;
import com.vaadin.data.Container.Indexed;
import com.vaadin.data.Container.Sortable;
import com.vaadin.data.Item;
+import com.vaadin.data.Property;
import com.vaadin.data.util.BeanItemContainer;
import com.vaadin.data.util.IndexedContainer;
import com.vaadin.ui.Calendar;
@@ -327,6 +328,37 @@ public class ContainerDataSource extends TestCase {
assertEquals(0, calendar.getEvents(start, end).size());
}
+ @Test
+ public void testStyleNamePropertyRetrieved() {
+ IndexedContainer ic = (IndexedContainer) createTestIndexedContainer();
+ ic.addContainerProperty("testStyleName", String.class, "");
+ for (int i = 0; i < 10; i++) {
+ Item item = ic.getItem(ic.getIdByIndex(i));
+ @SuppressWarnings("unchecked")
+ Property<String> itemProperty = item
+ .getItemProperty("testStyleName");
+ itemProperty.setValue("testStyle");
+ }
+
+ ContainerEventProvider provider = new ContainerEventProvider(ic);
+ provider.setCaptionProperty("testCaption");
+ provider.setDescriptionProperty("testDescription");
+ provider.setStartDateProperty("testStartDate");
+ provider.setEndDateProperty("testEndDate");
+ provider.setStyleNameProperty("testStyleName");
+
+ calendar.setEventProvider(provider);
+ java.util.Calendar cal = java.util.Calendar.getInstance();
+ Date now = cal.getTime();
+ cal.add(java.util.Calendar.DAY_OF_MONTH, 20);
+ Date then = cal.getTime();
+ List<CalendarEvent> events = calendar.getEventProvider().getEvents(now,
+ then);
+ for (CalendarEvent ce : events) {
+ assertEquals("testStyle", ce.getStyleName());
+ }
+ }
+
private static Indexed createTestBeanItemContainer() {
BeanItemContainer<CalendarEvent> eventContainer = new BeanItemContainer<CalendarEvent>(
CalendarEvent.class);
diff --git a/uitest/src/com/vaadin/tests/components/combobox/ComboBoxSetNullWhenNewItemsAllowed.java b/uitest/src/com/vaadin/tests/components/combobox/ComboBoxSetNullWhenNewItemsAllowed.java
new file mode 100644
index 0000000000..c0ac5cc392
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/combobox/ComboBoxSetNullWhenNewItemsAllowed.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2000-2013 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.tests.components.combobox;
+
+import com.vaadin.data.Property;
+import com.vaadin.data.Property.ValueChangeEvent;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.ComboBox;
+import com.vaadin.ui.Label;
+
+public class ComboBoxSetNullWhenNewItemsAllowed extends AbstractTestUI {
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ final ComboBox comboBox = new ComboBox("My ComboBox");
+ comboBox.setImmediate(true);
+ comboBox.setNullSelectionAllowed(false);
+ comboBox.setNewItemsAllowed(true);
+ for (int i = 0; i < 10; i++) {
+ comboBox.addItem("Item " + i);
+ }
+
+ final Label value = new Label("Selected: ");
+
+ comboBox.addValueChangeListener(new Property.ValueChangeListener() {
+ @Override
+ public void valueChange(ValueChangeEvent event) {
+ if (comboBox.getValue() != null) {
+ comboBox.setValue(null);
+ value.setValue("Selected: " + (String) comboBox.getValue());
+ }
+ }
+ });
+ addComponent(comboBox);
+ addComponent(value);
+ }
+
+ @Override
+ protected String getTestDescription() {
+ return "ComboBox should clear its value when setting to null with new items.";
+ }
+
+ @Override
+ protected Integer getTicketNumber() {
+ return 13413;
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/components/combobox/ComboBoxSetNullWhenNewItemsAllowedTest.java b/uitest/src/com/vaadin/tests/components/combobox/ComboBoxSetNullWhenNewItemsAllowedTest.java
new file mode 100644
index 0000000000..1794b9865f
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/combobox/ComboBoxSetNullWhenNewItemsAllowedTest.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2000-2013 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.tests.components.combobox;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openqa.selenium.Keys;
+import org.openqa.selenium.WebElement;
+
+import com.vaadin.testbench.By;
+import com.vaadin.testbench.commands.TestBenchElementCommands;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+/**
+ * ComboBox should clear its value when setting to null with new items.
+ */
+public class ComboBoxSetNullWhenNewItemsAllowedTest extends MultiBrowserTest {
+
+ @Test
+ public void testNewValueIsClearedAppropriately()
+ throws InterruptedException {
+ setDebug(true);
+ openTestURL();
+ Thread.sleep(1000);
+
+ WebElement element = findElement();
+ ((TestBenchElementCommands) element).click(8, 7);
+ element.clear();
+ element.sendKeys("New value");
+ assertEquals("New value", element.getAttribute("value"));
+ element.sendKeys(Keys.RETURN);
+ assertEquals("", element.getAttribute("value"));
+ }
+
+ private WebElement findElement() {
+ return getDriver()
+ .findElement(
+ By.vaadin("runcomvaadintestscomponentscomboboxComboBoxSetNullWhenNewItemsAllowed::/VVerticalLayout[0]/ChildComponentContainer[1]/VVerticalLayout[0]/ChildComponentContainer[0]/VFilterSelect[0]#textbox"));
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/requesthandlers/UnsupportedBrowserHandlerUserAgents.java b/uitest/src/com/vaadin/tests/requesthandlers/UnsupportedBrowserHandlerUserAgents.java
new file mode 100644
index 0000000000..9147d0fe50
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/requesthandlers/UnsupportedBrowserHandlerUserAgents.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2000-2013 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.tests.requesthandlers;
+
+import java.net.HttpURLConnection;
+import java.net.URL;
+
+import org.apache.commons.io.IOUtils;
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.vaadin.tests.tb3.PrivateTB3Configuration;
+
+public class UnsupportedBrowserHandlerUserAgents {
+ /*
+ * This test doesn't use testbench, but it's still in the uitest source
+ * folder since it should be run with the testing server deployed.
+ */
+
+ @Test
+ public void ie7NotSupported() {
+ String response = requestWithUserAgent("Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 5.2; WOW64; .NET CLR 2.0.50727)");
+ Assert.assertTrue("IE7 should not be supported",
+ response.contains("your browser is not supported"));
+ }
+
+ @Test
+ public void ie9Supported() {
+ String response = requestWithUserAgent("Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 7.1; Trident/5.0)");
+ Assert.assertFalse("IE9 should be supported",
+ response.contains("your browser is not supported"));
+ }
+
+ @Test
+ public void unknownSupported() {
+ String response = requestWithUserAgent("Very strange user agent, like wat");
+ Assert.assertFalse("Unkonwn user agent should be supported",
+ response.contains("your browser is not supported"));
+ }
+
+ private String requestWithUserAgent(String userAgent) {
+ try {
+ String url = "http://"
+ + PrivateTB3Configuration.getConfiguredDeploymentHostname()
+ + ":"
+ + PrivateTB3Configuration.getConfiguredDeploymentPort()
+ + "/run/"
+ + com.vaadin.tests.components.ui.UIInitTest.class.getName()
+ + "/";
+
+ HttpURLConnection connection = (HttpURLConnection) new URL(url)
+ .openConnection();
+ connection.setRequestProperty("User-Agent", userAgent);
+
+ String response = IOUtils.toString(connection.getInputStream());
+ connection.disconnect();
+
+ return response;
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/tb3/PrivateTB3Configuration.java b/uitest/src/com/vaadin/tests/tb3/PrivateTB3Configuration.java
index a00ff7ab4d..97150f96ab 100644
--- a/uitest/src/com/vaadin/tests/tb3/PrivateTB3Configuration.java
+++ b/uitest/src/com/vaadin/tests/tb3/PrivateTB3Configuration.java
@@ -25,6 +25,7 @@ import java.net.SocketException;
import java.util.Enumeration;
import java.util.Properties;
+import org.apache.commons.io.IOUtils;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxBinary;
@@ -44,9 +45,8 @@ import com.vaadin.testbench.TestBench;
public abstract class PrivateTB3Configuration extends ScreenshotTB3Test {
private static final String HOSTNAME_PROPERTY = "com.vaadin.testbench.deployment.hostname";
private static final String PORT_PROPERTY = "com.vaadin.testbench.deployment.port";
- private final Properties properties = new Properties();
-
- public PrivateTB3Configuration() {
+ private static final Properties properties = new Properties();
+ static {
File file = new File("work", "eclipse-run-selected-test.properties");
if (file.exists()) {
try {
@@ -57,7 +57,7 @@ public abstract class PrivateTB3Configuration extends ScreenshotTB3Test {
}
}
- private String getProperty(String name) {
+ private static String getProperty(String name) {
String property = properties.getProperty(name);
if (property == null) {
property = System.getProperty(name);
@@ -86,6 +86,15 @@ public abstract class PrivateTB3Configuration extends ScreenshotTB3Test {
if (getClass().getAnnotation(RunLocally.class) != null) {
return "localhost";
}
+ return getConfiguredDeploymentHostname();
+ }
+
+ /**
+ * Gets the hostname that tests are configured to use.
+ *
+ * @return the host name configuration value
+ */
+ public static String getConfiguredDeploymentHostname() {
String hostName = getProperty(HOSTNAME_PROPERTY);
if (hostName == null || "".equals(hostName)) {
@@ -97,6 +106,15 @@ public abstract class PrivateTB3Configuration extends ScreenshotTB3Test {
@Override
protected int getDeploymentPort() {
+ return getConfiguredDeploymentPort();
+ }
+
+ /**
+ * Gets the port that tests are configured to use.
+ *
+ * @return the port configuration value
+ */
+ public static int getConfiguredDeploymentPort() {
String portString = getProperty(PORT_PROPERTY);
int port = 8888;
@@ -115,7 +133,7 @@ public abstract class PrivateTB3Configuration extends ScreenshotTB3Test {
* @throws RuntimeException
* if there was an error or no IP was found
*/
- private String findAutoHostname() {
+ private static String findAutoHostname() {
try {
Enumeration<NetworkInterface> interfaces = NetworkInterface
.getNetworkInterfaces();