summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohannes Dahlström <johannesd@vaadin.com>2015-07-15 12:59:35 +0300
committerJohannes Dahlström <johannesd@vaadin.com>2015-07-15 12:59:35 +0300
commit20f6053dc199d5dd7dde071dfdd9b37ea8f85e36 (patch)
treecef44905e38c849057f102cd26cd6b89251bc7e2
parent80058d9429940c376c63c086b1cf79848fe1a699 (diff)
parent9734bc5dfa5d919e3214dc17581d3da3ad1a3ebd (diff)
downloadvaadin-framework-20f6053dc199d5dd7dde071dfdd9b37ea8f85e36.tar.gz
vaadin-framework-20f6053dc199d5dd7dde071dfdd9b37ea8f85e36.zip
Merge branch 'master' into grid-unbuffered-editor7.6.0.alpha3
Conflicts: uitest/src/com/vaadin/tests/components/grid/basicfeatures/server/GridEditorTest.java Change-Id: I5ed68bc73d38be4e1f6816108a5246d0c98a258f
-rw-r--r--WebContent/VAADIN/themes/base/grid/grid.scss20
-rw-r--r--WebContent/VAADIN/themes/chameleon/components/components.scss2
-rw-r--r--WebContent/VAADIN/themes/chameleon/components/grid/grid.scss12
-rw-r--r--WebContent/VAADIN/themes/reindeer/grid/grid.scss6
-rw-r--r--WebContent/VAADIN/themes/runo/grid/grid.scss15
-rw-r--r--WebContent/VAADIN/themes/valo/components/_grid.scss3
-rw-r--r--client-compiler/src/com/vaadin/server/widgetsetutils/AcceptCriteriaFactoryGenerator.java6
-rw-r--r--client-compiler/src/com/vaadin/server/widgetsetutils/ConnectorBundleLoaderFactory.java6
-rw-r--r--client-compiler/src/com/vaadin/server/widgetsetutils/metadata/ConnectorBundle.java111
-rw-r--r--client-compiler/src/com/vaadin/server/widgetsetutils/metadata/Property.java16
-rw-r--r--client/src/com/vaadin/client/SuperDevMode.java6
-rw-r--r--client/src/com/vaadin/client/VTooltip.java3
-rw-r--r--client/src/com/vaadin/client/debug/internal/VDebugWindow.java38
-rw-r--r--client/src/com/vaadin/client/widgets/Escalator.java99
-rw-r--r--client/src/com/vaadin/client/widgets/Grid.java44
-rw-r--r--scripts/GenerateBuildReport.py8
-rw-r--r--scripts/GenerateStagingReport.py7
-rw-r--r--server/src/com/vaadin/data/util/converter/StringToBooleanConverter.java83
-rw-r--r--server/src/com/vaadin/server/communication/JSR356WebsocketInitializer.java9
-rw-r--r--server/tests/src/com/vaadin/tests/data/converter/StringToBooleanConverterTest.java34
-rw-r--r--uitest/src/com/vaadin/tests/application/VaadinSessionAttribute.java10
-rw-r--r--uitest/src/com/vaadin/tests/components/OutOfSync.java55
-rw-r--r--uitest/src/com/vaadin/tests/components/OutOfSyncTest.java89
-rw-r--r--uitest/src/com/vaadin/tests/components/abstractembedded/EmbeddedWithNullSourceTest.java46
-rw-r--r--uitest/src/com/vaadin/tests/components/grid/GridEditorFrozenColumnsUI.java43
-rw-r--r--uitest/src/com/vaadin/tests/components/grid/GridEditorFrozenColumnsUITest.java78
-rw-r--r--uitest/src/com/vaadin/tests/components/grid/GridEditorUI.java6
-rw-r--r--uitest/src/com/vaadin/tests/components/grid/GridEditorUITest.java2
-rw-r--r--uitest/src/com/vaadin/tests/components/grid/GridScrollToLineWhileResizing.java73
-rw-r--r--uitest/src/com/vaadin/tests/components/grid/GridScrollToLineWhileResizingTest.java49
-rw-r--r--uitest/src/com/vaadin/tests/components/grid/basicfeatures/client/GridEditorClientTest.java6
-rw-r--r--uitest/src/com/vaadin/tests/components/grid/basicfeatures/server/GridEditorTest.java2
-rw-r--r--uitest/src/com/vaadin/tests/components/grid/basicfeatures/server/GridSidebarThemeTest.java12
-rw-r--r--uitest/src/com/vaadin/tests/components/popupview/PopupViewShortcutActionHandlerTest.java12
-rw-r--r--uitest/src/com/vaadin/tests/debug/PreserveCustomDebugSectionOpen.java33
-rw-r--r--uitest/src/com/vaadin/tests/debug/PreserveCustomDebugSectionOpenTest.java47
-rw-r--r--uitest/src/com/vaadin/tests/fieldgroup/BasicPersonFormTest.java14
-rw-r--r--uitest/src/com/vaadin/tests/tb3/MultiBrowserTest.java4
-rw-r--r--uitest/src/com/vaadin/tests/tooltip/MenuBarTooltip.java34
-rw-r--r--uitest/src/com/vaadin/tests/tooltip/MenuBarTooltipTest.java46
-rw-r--r--uitest/src/com/vaadin/tests/widgetset/TestingWidgetSet.gwt.xml3
-rw-r--r--uitest/src/com/vaadin/tests/widgetset/client/TestingWidgetsetEntryPoint.java83
-rw-r--r--uitest/tb2/com/vaadin/tests/components/OutOfSyncTest.html38
-rw-r--r--uitest/tb2/com/vaadin/tests/components/abstractembedded/EmbeddedWithNullSource.html27
44 files changed, 1068 insertions, 272 deletions
diff --git a/WebContent/VAADIN/themes/base/grid/grid.scss b/WebContent/VAADIN/themes/base/grid/grid.scss
index 1653032703..f587dfef4f 100644
--- a/WebContent/VAADIN/themes/base/grid/grid.scss
+++ b/WebContent/VAADIN/themes/base/grid/grid.scss
@@ -108,6 +108,7 @@ $v-grid-details-border-bottom-stripe: 1px solid darken($v-grid-row-background-co
outline: none;
padding: 0 4px;
text-align: right;
+ line-height: 1;
&::-moz-focus-inner {
border: 0;
@@ -128,10 +129,10 @@ $v-grid-details-border-bottom-stripe: 1px solid darken($v-grid-row-background-co
&.open {
.#{$primaryStyleName}-sidebar-button {
width: 100%;
-
+
&:after {
- content: "\00d7";
- font-size: 16px;
+ content: "\f0c9";
+ font-size: $v-grid-header-font-size;
line-height: 1;
}
}
@@ -142,11 +143,12 @@ $v-grid-details-border-bottom-stripe: 1px solid darken($v-grid-row-background-co
}
.v-ie8 &.open .#{$primaryStyleName}-sidebar-button:after {
+ vertical-align: middle;
+ text-align: center;
display: inline;
}
.#{$primaryStyleName}-sidebar-content {
- border-top: $v-grid-border;
padding: 4px 0;
.gwt-MenuBar {
@@ -199,6 +201,12 @@ $v-grid-details-border-bottom-stripe: 1px solid darken($v-grid-row-background-co
border-left: none;
}
}
+
+ .#{$primaryStyleName}-editor-cells.frozen > div {
+ @include box-shadow(1px 0 2px rgba(0,0,0,.1));
+ border-right: $v-grid-cell-vertical-border;
+ border-left: none;
+ }
.#{$primaryStyleName}-row-stripe > td {
background-color: $v-grid-row-stripe-background-color;
@@ -342,6 +350,10 @@ $v-grid-details-border-bottom-stripe: 1px solid darken($v-grid-row-background-co
.#{$primaryStyleName}-editor-cells {
position: relative;
white-space: nowrap;
+
+ &.frozen {
+ z-index: 2;
+ }
> div {
display: inline-block;
diff --git a/WebContent/VAADIN/themes/chameleon/components/components.scss b/WebContent/VAADIN/themes/chameleon/components/components.scss
index 9c8a56b33d..578ea23bf3 100644
--- a/WebContent/VAADIN/themes/chameleon/components/components.scss
+++ b/WebContent/VAADIN/themes/chameleon/components/components.scss
@@ -1,6 +1,7 @@
@import "accordion/accordion.scss";
@import "button/button.scss";
@import "colorpicker/colorpicker.scss";
+@import "grid/grid.scss";
@import "label/label.scss";
@import "menubar/menubar.scss";
@import "notification/notification.scss";
@@ -24,6 +25,7 @@
@include chameleon-accordion;
@include chameleon-button;
@include chameleon-colorpicker;
+ @include chameleon-grid;
@include chameleon-label;
@include chameleon-menubar;
@include chameleon-notification;
diff --git a/WebContent/VAADIN/themes/chameleon/components/grid/grid.scss b/WebContent/VAADIN/themes/chameleon/components/grid/grid.scss
new file mode 100644
index 0000000000..5007ad6619
--- /dev/null
+++ b/WebContent/VAADIN/themes/chameleon/components/grid/grid.scss
@@ -0,0 +1,12 @@
+@mixin chameleon-grid($primaryStyleName: v-grid) {
+
+ // Sidebar
+ .#{$primaryStyleName}-sidebar.v-contextmenu {
+
+ .v-on:before, .v-off:before {
+ content: none;
+ font-size: 0;
+ margin-right: 0;
+ }
+ }
+}
diff --git a/WebContent/VAADIN/themes/reindeer/grid/grid.scss b/WebContent/VAADIN/themes/reindeer/grid/grid.scss
index 7ae0f402aa..cb5e9d454e 100644
--- a/WebContent/VAADIN/themes/reindeer/grid/grid.scss
+++ b/WebContent/VAADIN/themes/reindeer/grid/grid.scss
@@ -40,6 +40,12 @@
.#{$primaryStyleName}-sidebar-content {
background-color: #f8f8f9;
}
+
+ .v-on:before, .v-off:before {
+ content: none;
+ font-size: 0;
+ margin-right: 0;
+ }
}
// Sort indicators
diff --git a/WebContent/VAADIN/themes/runo/grid/grid.scss b/WebContent/VAADIN/themes/runo/grid/grid.scss
index aca9821c53..1f049c5fb0 100644
--- a/WebContent/VAADIN/themes/runo/grid/grid.scss
+++ b/WebContent/VAADIN/themes/runo/grid/grid.scss
@@ -30,14 +30,7 @@
// Sidebar
.#{$primaryStyleName}-sidebar.v-contextmenu {
- &.open {
- .#{$primaryStyleName}-sidebar-button {
- &:after {
- font-size: 22px;
- }
- }
- }
-
+
.#{$primaryStyleName}-sidebar-content {
background-color: transparent;
@@ -45,6 +38,12 @@
border: none;
}
}
+
+ .v-on:before, .v-off:before {
+ content: none;
+ font-size: 0;
+ margin-right: 0;
+ }
}
// Sort indicators
diff --git a/WebContent/VAADIN/themes/valo/components/_grid.scss b/WebContent/VAADIN/themes/valo/components/_grid.scss
index 27d421b9f2..d00ddf30a4 100644
--- a/WebContent/VAADIN/themes/valo/components/_grid.scss
+++ b/WebContent/VAADIN/themes/valo/components/_grid.scss
@@ -203,9 +203,6 @@ $v-grid-details-border-bottom-stripe: $v-grid-cell-horizontal-border !default;
// Sidebar
.#{$primary-stylename}-sidebar.v-contextmenu {
&.open {
- .#{$primary-stylename}-sidebar-button:after {
- font-size: 20px;
- }
.#{$primary-stylename}-sidebar-content {
margin: 0 0 2px;
diff --git a/client-compiler/src/com/vaadin/server/widgetsetutils/AcceptCriteriaFactoryGenerator.java b/client-compiler/src/com/vaadin/server/widgetsetutils/AcceptCriteriaFactoryGenerator.java
index b7850e6370..2d08329e9a 100644
--- a/client-compiler/src/com/vaadin/server/widgetsetutils/AcceptCriteriaFactoryGenerator.java
+++ b/client-compiler/src/com/vaadin/server/widgetsetutils/AcceptCriteriaFactoryGenerator.java
@@ -16,6 +16,7 @@
package com.vaadin.server.widgetsetutils;
import java.io.PrintWriter;
+import java.util.Arrays;
import java.util.Date;
import com.google.gwt.core.ext.Generator;
@@ -29,6 +30,7 @@ import com.google.gwt.user.rebind.ClassSourceFileComposerFactory;
import com.google.gwt.user.rebind.SourceWriter;
import com.vaadin.client.ui.dd.VAcceptCriterion;
import com.vaadin.client.ui.dd.VAcceptCriterionFactory;
+import com.vaadin.server.widgetsetutils.metadata.ConnectorBundle;
import com.vaadin.shared.ui.dd.AcceptCriterion;
/**
@@ -114,7 +116,9 @@ public class AcceptCriteriaFactoryGenerator extends Generator {
JClassType criteriaType = context.getTypeOracle().findType(
VAcceptCriterion.class.getName());
- for (JClassType clientClass : criteriaType.getSubtypes()) {
+ JClassType[] subtypes = criteriaType.getSubtypes();
+ Arrays.sort(subtypes, ConnectorBundle.jClassComparator);
+ for (JClassType clientClass : subtypes) {
AcceptCriterion annotation = clientClass
.getAnnotation(AcceptCriterion.class);
if (annotation != null) {
diff --git a/client-compiler/src/com/vaadin/server/widgetsetutils/ConnectorBundleLoaderFactory.java b/client-compiler/src/com/vaadin/server/widgetsetutils/ConnectorBundleLoaderFactory.java
index 884852f7c8..2b8ccc87d0 100644
--- a/client-compiler/src/com/vaadin/server/widgetsetutils/ConnectorBundleLoaderFactory.java
+++ b/client-compiler/src/com/vaadin/server/widgetsetutils/ConnectorBundleLoaderFactory.java
@@ -27,6 +27,7 @@ import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
+import java.util.TreeMap;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.RunAsyncCallback;
@@ -1185,10 +1186,11 @@ public class ConnectorBundleLoaderFactory extends Generator {
JClassType[] types = serverConnectorType.getSubtypes();
- Map<String, JClassType> mappings = new HashMap<String, JClassType>();
+ Map<String, JClassType> mappings = new TreeMap<String, JClassType>();
// Keep track of what has happened to avoid logging intermediate state
- Map<JClassType, List<JClassType>> replaced = new HashMap<JClassType, List<JClassType>>();
+ Map<JClassType, List<JClassType>> replaced = new TreeMap<JClassType, List<JClassType>>(
+ ConnectorBundle.jClassComparator);
for (JClassType type : types) {
Connect connectAnnotation = type.getAnnotation(Connect.class);
diff --git a/client-compiler/src/com/vaadin/server/widgetsetutils/metadata/ConnectorBundle.java b/client-compiler/src/com/vaadin/server/widgetsetutils/metadata/ConnectorBundle.java
index fedc86fbf6..b4531eb08e 100644
--- a/client-compiler/src/com/vaadin/server/widgetsetutils/metadata/ConnectorBundle.java
+++ b/client-compiler/src/com/vaadin/server/widgetsetutils/metadata/ConnectorBundle.java
@@ -19,12 +19,16 @@ import java.io.Serializable;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
+import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
+import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.TreeMap;
+import java.util.TreeSet;
import com.google.gwt.core.ext.TreeLogger;
import com.google.gwt.core.ext.TreeLogger.Type;
@@ -37,7 +41,6 @@ import com.google.gwt.core.ext.typeinfo.JParameterizedType;
import com.google.gwt.core.ext.typeinfo.JType;
import com.google.gwt.core.ext.typeinfo.NotFoundException;
import com.google.gwt.core.ext.typeinfo.TypeOracle;
-import com.google.gwt.thirdparty.guava.common.collect.Sets;
import com.vaadin.client.ApplicationConnection;
import com.vaadin.client.ComponentConnector;
import com.vaadin.client.ServerConnector;
@@ -54,6 +57,22 @@ import elemental.json.JsonValue;
public class ConnectorBundle {
private static final String FAIL_IF_NOT_SERIALIZABLE = "vFailIfNotSerializable";
+ public static final Comparator<JClassType> jClassComparator = new Comparator<JClassType>() {
+ @Override
+ public int compare(JClassType o1, JClassType o2) {
+ return o1.getQualifiedSourceName().compareTo(
+ o2.getQualifiedSourceName());
+ }
+ };
+
+ public static final Comparator<JMethod> jMethodComparator = new Comparator<JMethod>() {
+ @Override
+ public int compare(JMethod o1, JMethod o2) {
+ return o1.getReadableDeclaration().compareTo(
+ o2.getReadableDeclaration());
+ }
+ };
+
private final String name;
private final ConnectorBundle previousBundle;
private final Collection<TypeVisitor> visitors;
@@ -61,24 +80,42 @@ public class ConnectorBundle {
private final Set<JType> hasSerializeSupport = new HashSet<JType>();
private final Set<JType> needsSerializeSupport = new HashSet<JType>();
- private final Map<JType, GeneratedSerializer> serializers = new HashMap<JType, GeneratedSerializer>();
- private final Map<JClassType, JType> presentationTypes = new HashMap<JClassType, JType>();
- private final Set<JClassType> needsSuperClass = new HashSet<JClassType>();
- private final Set<JClassType> needsGwtConstructor = new HashSet<JClassType>();
+ private final Map<JType, GeneratedSerializer> serializers = new TreeMap<JType, GeneratedSerializer>(
+ new Comparator<JType>() {
+ @Override
+ public int compare(JType o1, JType o2) {
+ return o1.toString().compareTo(o2.toString());
+ }
+ });
+
+ private final Map<JClassType, Map<JMethod, Set<MethodAttribute>>> methodAttributes = new TreeMap<JClassType, Map<JMethod, Set<MethodAttribute>>>(
+ jClassComparator);
+ private final Set<JClassType> needsSuperClass = new TreeSet<JClassType>(
+ jClassComparator);
+ private final Set<JClassType> needsGwtConstructor = new TreeSet<JClassType>(
+ jClassComparator);
private final Set<JClassType> visitedTypes = new HashSet<JClassType>();
- private final Set<JClassType> needsProxySupport = new HashSet<JClassType>();
- private final Map<JClassType, Set<String>> identifiers = new HashMap<JClassType, Set<String>>();
- private final Map<JClassType, Set<JMethod>> needsReturnType = new HashMap<JClassType, Set<JMethod>>();
- private final Map<JClassType, Set<JMethod>> needsInvoker = new HashMap<JClassType, Set<JMethod>>();
- private final Map<JClassType, Set<JMethod>> needsParamTypes = new HashMap<JClassType, Set<JMethod>>();
- private final Map<JClassType, Set<JMethod>> needsOnStateChange = new HashMap<JClassType, Set<JMethod>>();
-
- private final Map<JClassType, Map<JMethod, Set<MethodAttribute>>> methodAttributes = new HashMap<JClassType, Map<JMethod, Set<MethodAttribute>>>();
-
- private final Set<Property> needsProperty = new HashSet<Property>();
- private final Map<JClassType, Set<Property>> needsDelegateToWidget = new HashMap<JClassType, Set<Property>>();
+ private final Set<JClassType> needsProxySupport = new TreeSet<JClassType>(
+ jClassComparator);
+
+ private final Map<JClassType, JType> presentationTypes = new TreeMap<JClassType, JType>(
+ jClassComparator);
+ private final Map<JClassType, Set<String>> identifiers = new TreeMap<JClassType, Set<String>>(
+ jClassComparator);
+ private final Map<JClassType, Set<JMethod>> needsReturnType = new TreeMap<JClassType, Set<JMethod>>(
+ jClassComparator);
+ private final Map<JClassType, Set<JMethod>> needsInvoker = new TreeMap<JClassType, Set<JMethod>>(
+ jClassComparator);
+ private final Map<JClassType, Set<JMethod>> needsParamTypes = new TreeMap<JClassType, Set<JMethod>>(
+ jClassComparator);
+ private final Map<JClassType, Set<JMethod>> needsOnStateChange = new TreeMap<JClassType, Set<JMethod>>(
+ jClassComparator);
+
+ private final Set<Property> needsProperty = new TreeSet<Property>();
+ private final Map<JClassType, Set<Property>> needsDelegateToWidget = new TreeMap<JClassType, Set<Property>>(
+ jClassComparator);
private ConnectorBundle(String name, ConnectorBundle previousBundle,
Collection<TypeVisitor> visitors,
@@ -369,7 +406,7 @@ public class ConnectorBundle {
}
public Collection<Property> getProperties(JClassType type) {
- HashSet<Property> properties = new HashSet<Property>();
+ Set<Property> properties = new TreeSet<Property>();
properties.addAll(MethodProperty.findProperties(type));
properties.addAll(FieldProperty.findProperties(type));
@@ -463,10 +500,19 @@ public class ConnectorBundle {
}
}
- private <K, V> void addMapping(Map<K, Set<V>> map, K key, V value) {
- Set<V> set = map.get(key);
+ private <K> void addMapping(Map<K, Set<String>> map, K key, String value) {
+ Set<String> set = map.get(key);
+ if (set == null) {
+ set = new TreeSet<String>();
+ map.put(key, set);
+ }
+ set.add(value);
+ }
+
+ private <K> void addMapping(Map<K, Set<JMethod>> map, K key, JMethod value) {
+ Set<JMethod> set = map.get(key);
if (set == null) {
- set = new HashSet<V>();
+ set = new TreeSet<JMethod>(jMethodComparator);
map.put(key, set);
}
set.add(value);
@@ -533,11 +579,26 @@ public class ConnectorBundle {
Map<JMethod, Set<MethodAttribute>> typeData = methodAttributes
.get(type);
if (typeData == null) {
- typeData = new HashMap<JMethod, Set<MethodAttribute>>();
+ typeData = new TreeMap<JMethod, Set<MethodAttribute>>(
+ jMethodComparator);
methodAttributes.put(type, typeData);
}
- addMapping(typeData, method, methodAttribute);
+ Map<JMethod, Set<MethodAttribute>> methods = methodAttributes
+ .get(type);
+ if (methods == null) {
+ methods = new TreeMap<JMethod, Set<MethodAttribute>>(
+ jMethodComparator);
+ methodAttributes.put(type, methods);
+ }
+
+ Set<MethodAttribute> attributes = methods.get(method);
+ if (attributes == null) {
+ attributes = new TreeSet<MethodAttribute>();
+ methods.put(method, attributes);
+ }
+
+ attributes.add(methodAttribute);
}
}
@@ -564,7 +625,7 @@ public class ConnectorBundle {
}
}
- private static Set<Class<?>> frameworkHandledTypes = new HashSet<Class<?>>();
+ private static Set<Class<?>> frameworkHandledTypes = new LinkedHashSet<Class<?>>();
{
frameworkHandledTypes.add(String.class);
frameworkHandledTypes.add(Boolean.class);
@@ -611,7 +672,9 @@ public class ConnectorBundle {
public void setNeedsDelegateToWidget(Property property, JClassType type) {
if (!isNeedsDelegateToWidget(type)) {
- needsDelegateToWidget.put(type, Sets.newHashSet(property));
+ TreeSet<Property> set = new TreeSet<Property>();
+ set.add(property);
+ needsDelegateToWidget.put(type, set);
} else if (!needsDelegateToWidget.get(type).contains(property)) {
needsDelegateToWidget.get(type).add(property);
}
diff --git a/client-compiler/src/com/vaadin/server/widgetsetutils/metadata/Property.java b/client-compiler/src/com/vaadin/server/widgetsetutils/metadata/Property.java
index f07b1c29fd..0c849bead5 100644
--- a/client-compiler/src/com/vaadin/server/widgetsetutils/metadata/Property.java
+++ b/client-compiler/src/com/vaadin/server/widgetsetutils/metadata/Property.java
@@ -24,7 +24,7 @@ import com.google.gwt.core.ext.typeinfo.JPrimitiveType;
import com.google.gwt.core.ext.typeinfo.JType;
import com.google.gwt.user.rebind.SourceWriter;
-public abstract class Property {
+public abstract class Property implements Comparable<Property> {
private final String name;
private final JClassType beanType;
private final JType propertyType;
@@ -107,6 +107,20 @@ public abstract class Property {
+ getName().hashCode();
}
+ @Override
+ public int compareTo(Property o) {
+ int comp = getName().compareTo(o.getName());
+ if (comp == 0) {
+ comp = getBeanType().getQualifiedSourceName().compareTo(
+ o.getBeanType().getQualifiedSourceName());
+ }
+ if (comp == 0) {
+ comp = getClass().getCanonicalName().compareTo(
+ o.getClass().getCanonicalName());
+ }
+ return comp;
+ }
+
public abstract <T extends Annotation> T getAnnotation(
Class<T> annotationClass);
diff --git a/client/src/com/vaadin/client/SuperDevMode.java b/client/src/com/vaadin/client/SuperDevMode.java
index c72cd73939..f664244715 100644
--- a/client/src/com/vaadin/client/SuperDevMode.java
+++ b/client/src/com/vaadin/client/SuperDevMode.java
@@ -189,7 +189,11 @@ public class SuperDevMode {
if (serverUrl == null || "".equals(serverUrl)) {
serverUrl = "http://localhost:9876/";
} else {
- serverUrl = "http://" + serverUrl + "/";
+ if (serverUrl.contains(":")) {
+ serverUrl = "http://" + serverUrl + "/";
+ } else {
+ serverUrl = "http://" + serverUrl + ":9876/";
+ }
}
if (hasSession(SKIP_RECOMPILE)) {
diff --git a/client/src/com/vaadin/client/VTooltip.java b/client/src/com/vaadin/client/VTooltip.java
index 4e59040298..f3d65cd20a 100644
--- a/client/src/com/vaadin/client/VTooltip.java
+++ b/client/src/com/vaadin/client/VTooltip.java
@@ -89,6 +89,9 @@ public class VTooltip extends VOverlay {
LiveValue.ASSERTIVE);
Roles.getTooltipRole().setAriaRelevantProperty(getElement(),
RelevantValue.ADDITIONS);
+
+ // Tooltip needs to be on top of other VOverlay elements.
+ setZIndex(VOverlay.Z_INDEX + 1);
}
/**
diff --git a/client/src/com/vaadin/client/debug/internal/VDebugWindow.java b/client/src/com/vaadin/client/debug/internal/VDebugWindow.java
index b543c23e4d..fbc838f861 100644
--- a/client/src/com/vaadin/client/debug/internal/VDebugWindow.java
+++ b/client/src/com/vaadin/client/debug/internal/VDebugWindow.java
@@ -19,6 +19,8 @@ import java.util.ArrayList;
import java.util.Date;
import com.google.gwt.core.client.Duration;
+import com.google.gwt.core.client.Scheduler;
+import com.google.gwt.core.client.Scheduler.ScheduledCommand;
import com.google.gwt.core.shared.GWT;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.NativeEvent;
@@ -698,22 +700,32 @@ public final class VDebugWindow extends VOverlay {
public void init() {
show();
- readStoredState();
- Window.addResizeHandler(new com.google.gwt.event.logical.shared.ResizeHandler() {
+ /*
+ * Finalize initialization when all entry points have had the chance to
+ * e.g. register new sections.
+ */
+ Scheduler.get().scheduleFinally(new ScheduledCommand() {
+ @Override
+ public void execute() {
+ readStoredState();
- Timer t = new Timer() {
- @Override
- public void run() {
- applyPositionAndSize();
- }
- };
+ Window.addResizeHandler(new com.google.gwt.event.logical.shared.ResizeHandler() {
- @Override
- public void onResize(ResizeEvent event) {
- t.cancel();
- // TODO less
- t.schedule(1000);
+ Timer t = new Timer() {
+ @Override
+ public void run() {
+ applyPositionAndSize();
+ }
+ };
+
+ @Override
+ public void onResize(ResizeEvent event) {
+ t.cancel();
+ // TODO less
+ t.schedule(1000);
+ }
+ });
}
});
}
diff --git a/client/src/com/vaadin/client/widgets/Escalator.java b/client/src/com/vaadin/client/widgets/Escalator.java
index 436b512294..a6247aee12 100644
--- a/client/src/com/vaadin/client/widgets/Escalator.java
+++ b/client/src/com/vaadin/client/widgets/Escalator.java
@@ -6022,10 +6022,14 @@ public class Escalator extends Widget implements RequiresResize,
public void scrollToRow(final int rowIndex,
final ScrollDestination destination, final int padding)
throws IndexOutOfBoundsException, IllegalArgumentException {
- validateScrollDestination(destination, padding);
- verifyValidRowIndex(rowIndex);
-
- scroller.scrollToRow(rowIndex, destination, padding);
+ Scheduler.get().scheduleDeferred(new ScheduledCommand() {
+ @Override
+ public void execute() {
+ validateScrollDestination(destination, padding);
+ verifyValidRowIndex(rowIndex);
+ scroller.scrollToRow(rowIndex, destination, padding);
+ }
+ });
}
private void verifyValidRowIndex(final int rowIndex) {
@@ -6086,55 +6090,62 @@ public class Escalator extends Widget implements RequiresResize,
* {@code destination == null}; or if {@code rowIndex == -1} and
* there is no spacer open at that index.
*/
- public void scrollToRowAndSpacer(int rowIndex,
- ScrollDestination destination, int padding)
+ public void scrollToRowAndSpacer(final int rowIndex,
+ final ScrollDestination destination, final int padding)
throws IllegalArgumentException {
- validateScrollDestination(destination, padding);
- if (rowIndex != -1) {
- verifyValidRowIndex(rowIndex);
- }
+ Scheduler.get().scheduleDeferred(new ScheduledCommand() {
+ @Override
+ public void execute() {
+ validateScrollDestination(destination, padding);
+ if (rowIndex != -1) {
+ verifyValidRowIndex(rowIndex);
+ }
- // row range
- final Range rowRange;
- if (rowIndex != -1) {
- int rowTop = (int) Math.floor(body.getRowTop(rowIndex));
- int rowHeight = (int) Math.ceil(body.getDefaultRowHeight());
- rowRange = Range.withLength(rowTop, rowHeight);
- } else {
- rowRange = Range.withLength(0, 0);
- }
+ // row range
+ final Range rowRange;
+ if (rowIndex != -1) {
+ int rowTop = (int) Math.floor(body.getRowTop(rowIndex));
+ int rowHeight = (int) Math.ceil(body.getDefaultRowHeight());
+ rowRange = Range.withLength(rowTop, rowHeight);
+ } else {
+ rowRange = Range.withLength(0, 0);
+ }
- // get spacer
- final SpacerContainer.SpacerImpl spacer = body.spacerContainer
- .getSpacer(rowIndex);
+ // get spacer
+ final SpacerContainer.SpacerImpl spacer = body.spacerContainer
+ .getSpacer(rowIndex);
- if (rowIndex == -1 && spacer == null) {
- throw new IllegalArgumentException("Cannot scroll to row index "
- + "-1, as there is no spacer open at that index.");
- }
+ if (rowIndex == -1 && spacer == null) {
+ throw new IllegalArgumentException(
+ "Cannot scroll to row index "
+ + "-1, as there is no spacer open at that index.");
+ }
- // make into target range
- final Range targetRange;
- if (spacer != null) {
- final int spacerTop = (int) Math.floor(spacer.getTop());
- final int spacerHeight = (int) Math.ceil(spacer.getHeight());
- Range spacerRange = Range.withLength(spacerTop, spacerHeight);
+ // make into target range
+ final Range targetRange;
+ if (spacer != null) {
+ final int spacerTop = (int) Math.floor(spacer.getTop());
+ final int spacerHeight = (int) Math.ceil(spacer.getHeight());
+ Range spacerRange = Range.withLength(spacerTop,
+ spacerHeight);
- targetRange = rowRange.combineWith(spacerRange);
- } else {
- targetRange = rowRange;
- }
+ targetRange = rowRange.combineWith(spacerRange);
+ } else {
+ targetRange = rowRange;
+ }
- // get params
- int targetStart = targetRange.getStart();
- int targetEnd = targetRange.getEnd();
- double viewportStart = getScrollTop();
- double viewportEnd = viewportStart + body.getHeightOfSection();
+ // get params
+ int targetStart = targetRange.getStart();
+ int targetEnd = targetRange.getEnd();
+ double viewportStart = getScrollTop();
+ double viewportEnd = viewportStart + body.getHeightOfSection();
- double scrollPos = getScrollPos(destination, targetStart, targetEnd,
- viewportStart, viewportEnd, padding);
+ double scrollPos = getScrollPos(destination, targetStart,
+ targetEnd, viewportStart, viewportEnd, padding);
- setScrollTop(scrollPos);
+ setScrollTop(scrollPos);
+ }
+ });
}
private static void validateScrollDestination(
diff --git a/client/src/com/vaadin/client/widgets/Grid.java b/client/src/com/vaadin/client/widgets/Grid.java
index cf05e7e53a..18407dccc9 100644
--- a/client/src/com/vaadin/client/widgets/Grid.java
+++ b/client/src/com/vaadin/client/widgets/Grid.java
@@ -1141,6 +1141,8 @@ public class Grid<T> extends ResizeComposite implements
private DivElement editorOverlay = DivElement.as(DOM.createDiv());
private DivElement cellWrapper = DivElement.as(DOM.createDiv());
+ private DivElement frozenCellWrapper = DivElement.as(DOM.createDiv());
+
private DivElement messageAndButtonsWrapper = DivElement.as(DOM
.createDiv());
@@ -1581,15 +1583,31 @@ public class Grid<T> extends ResizeComposite implements
});
gridElement.appendChild(editorOverlay);
+ editorOverlay.appendChild(frozenCellWrapper);
editorOverlay.appendChild(cellWrapper);
editorOverlay.appendChild(messageAndButtonsWrapper);
+ int frozenColumns = grid.getVisibleFrozenColumnCount();
+ double frozenColumnsWidth = 0;
+ double cellHeight = 0;
+
for (int i = 0; i < tr.getCells().getLength(); i++) {
Element cell = createCell(tr.getCells().getItem(i));
-
- cellWrapper.appendChild(cell);
+ cellHeight = Math.max(cellHeight, WidgetUtil
+ .getRequiredHeightBoundingClientRectDouble(tr
+ .getCells().getItem(i)));
Column<?, T> column = grid.getVisibleColumn(i);
+
+ if (i < frozenColumns) {
+ frozenCellWrapper.appendChild(cell);
+ frozenColumnsWidth += WidgetUtil
+ .getRequiredWidthBoundingClientRectDouble(tr
+ .getCells().getItem(i));
+ } else {
+ cellWrapper.appendChild(cell);
+ }
+
if (column.isEditable()) {
Widget editor = getHandler().getWidget(column);
@@ -1611,6 +1629,10 @@ public class Grid<T> extends ResizeComposite implements
}
}
+ setBounds(frozenCellWrapper, 0, 0, frozenColumnsWidth, 0);
+ setBounds(cellWrapper, frozenColumnsWidth, 0, tr.getOffsetWidth()
+ - frozenColumnsWidth, cellHeight);
+
// Only add these elements once
if (!messageAndButtonsWrapper.isOrHasChild(messageWrapper)) {
messageAndButtonsWrapper.appendChild(messageWrapper);
@@ -1685,6 +1707,7 @@ public class Grid<T> extends ResizeComposite implements
editorOverlay.removeAllChildren();
cellWrapper.removeAllChildren();
+ frozenCellWrapper.removeAllChildren();
editorOverlay.removeFromParent();
scrollHandler.removeHandler();
@@ -1697,6 +1720,7 @@ public class Grid<T> extends ResizeComposite implements
editorOverlay.removeClassName(styleName);
cellWrapper.removeClassName(styleName + "-cells");
+ frozenCellWrapper.removeClassName(styleName + "-cells");
messageAndButtonsWrapper.removeClassName(styleName + "-footer");
messageWrapper.removeClassName(styleName + "-message");
@@ -1709,6 +1733,7 @@ public class Grid<T> extends ResizeComposite implements
editorOverlay.setClassName(styleName);
cellWrapper.setClassName(styleName + "-cells");
+ frozenCellWrapper.setClassName(styleName + "-cells frozen");
messageAndButtonsWrapper.setClassName(styleName + "-footer");
messageWrapper.setClassName(styleName + "-message");
@@ -1759,7 +1784,8 @@ public class Grid<T> extends ResizeComposite implements
private void updateHorizontalScrollPosition() {
double scrollLeft = grid.getScrollLeft();
- cellWrapper.getStyle().setLeft(-scrollLeft, Unit.PX);
+ cellWrapper.getStyle().setLeft(
+ frozenCellWrapper.getOffsetWidth() - scrollLeft, Unit.PX);
}
/**
@@ -3329,7 +3355,6 @@ public class Grid<T> extends ResizeComposite implements
clickOutsideToCloseHandlerRegistration = Event
.addNativePreviewHandler(clickOutsideToCloseHandler);
}
- openCloseButton.setHeight("");
}
/**
@@ -6171,7 +6196,12 @@ public class Grid<T> extends ResizeComposite implements
}
private void updateFrozenColumns() {
- int numberOfColumns = frozenColumnCount;
+ escalator.getColumnConfiguration().setFrozenColumnCount(
+ getVisibleFrozenColumnCount());
+ }
+
+ private int getVisibleFrozenColumnCount() {
+ int numberOfColumns = getFrozenColumnCount();
// for the escalator the hidden columns are not in the frozen column
// count, but for grid they are. thus need to convert the index
@@ -6186,9 +6216,7 @@ public class Grid<T> extends ResizeComposite implements
} else if (selectionColumn != null) {
numberOfColumns++;
}
-
- escalator.getColumnConfiguration()
- .setFrozenColumnCount(numberOfColumns);
+ return numberOfColumns;
}
/**
diff --git a/scripts/GenerateBuildReport.py b/scripts/GenerateBuildReport.py
index 8ee2472133..13438f2233 100644
--- a/scripts/GenerateBuildReport.py
+++ b/scripts/GenerateBuildReport.py
@@ -33,13 +33,7 @@ except subprocess.CalledProcessError as e:
else:
raise e
-content += "<tr><td>Try demos<ul>"
-
-for demo in demos:
- content += "<li><a href='{url}/{demoName}-{version}'>{demoName}</a></li>\n".format(url=args.deployUrl, demoName=demo, version=args.version)
-
-content += """</ul></td></tr>
-<tr><td><a href="{url}">Build result page (See test results, pin and tag build and dependencies)</a></td></tr>
+content += """<tr><td><a href="{url}">Build result page (See test results, pin and tag build and dependencies)</a></td></tr>
</table>
</body>
</html>""".format(url=args.buildResultUrl)
diff --git a/scripts/GenerateStagingReport.py b/scripts/GenerateStagingReport.py
index fdcdc93fdb..7c2aeda9e0 100644
--- a/scripts/GenerateStagingReport.py
+++ b/scripts/GenerateStagingReport.py
@@ -17,7 +17,12 @@ content = """<html>
<table>
"""
-content += "<tr><td>Try archetype demos<ul>"
+content += "<tr><td>Try demos<ul>"
+
+for demo in demos:
+ content += "<li><a href='{url}/{demoName}-{version}'>{demoName}</a></li>\n".format(url=args.deployUrl, demoName=demo, version=args.version)
+
+content += "</ul></td></tr>\n<tr><td>Try archetype demos<ul>"
for archetype in archetypes:
content += "<li><a href='{url}/{context}'>{demo}</a></li>\n".format(url=args.deployUrl, demo=archetype, context=getDeploymentContext(archetype, args.version))
diff --git a/server/src/com/vaadin/data/util/converter/StringToBooleanConverter.java b/server/src/com/vaadin/data/util/converter/StringToBooleanConverter.java
index 0e802da879..dafcf8dac2 100644
--- a/server/src/com/vaadin/data/util/converter/StringToBooleanConverter.java
+++ b/server/src/com/vaadin/data/util/converter/StringToBooleanConverter.java
@@ -19,20 +19,43 @@ package com.vaadin.data.util.converter;
import java.util.Locale;
/**
- * A converter that converts from {@link String} to {@link Boolean} and back.
- * The String representation is given by Boolean.toString().
- * <p>
- * Leading and trailing white spaces are ignored when converting from a String.
- * </p>
- *
+ * A converter that converts from {@link String} to {@link Boolean} and back. The String representation is given by
+ * {@link Boolean#toString()} or provided in constructor {@link #StringToBooleanConverter(String, String)}.
+ * <p> Leading and trailing white spaces are ignored when converting from a String. </p>
+ * <p> For language-dependent representation, subclasses should overwrite {@link #getFalseString(Locale)} and {@link #getTrueString(Locale)}</p>
+ *
* @author Vaadin Ltd
* @since 7.0
*/
public class StringToBooleanConverter implements Converter<String, Boolean> {
+ private final String trueString;
+
+ private final String falseString;
+
+ /**
+ * Creates converter with default string representations - "true" and "false"
+ *
+ */
+ public StringToBooleanConverter() {
+ this(Boolean.TRUE.toString(), Boolean.FALSE.toString());
+ }
+
+ /**
+ * Creates converter with custom string representation.
+ *
+ * @since
+ * @param falseString string representation for <code>false</code>
+ * @param trueString string representation for <code>true</code>
+ */
+ public StringToBooleanConverter(String trueString, String falseString) {
+ this.trueString = trueString;
+ this.falseString = falseString;
+ }
+
/*
* (non-Javadoc)
- *
+ *
* @see
* com.vaadin.data.util.converter.Converter#convertToModel(java.lang.Object,
* java.lang.Class, java.util.Locale)
@@ -59,26 +82,26 @@ public class StringToBooleanConverter implements Converter<String, Boolean> {
}
/**
- * Gets the string representation for true. Default is "true".
- *
+ * Gets the string representation for true. Default is "true", if not set in constructor.
+ *
* @return the string representation for true
*/
protected String getTrueString() {
- return Boolean.TRUE.toString();
+ return trueString;
}
/**
- * Gets the string representation for false. Default is "false".
- *
+ * Gets the string representation for false. Default is "false", if not set in constructor.
+ *
* @return the string representation for false
*/
protected String getFalseString() {
- return Boolean.FALSE.toString();
+ return falseString;
}
/*
* (non-Javadoc)
- *
+ *
* @see
* com.vaadin.data.util.converter.Converter#convertToPresentation(java.lang
* .Object, java.lang.Class, java.util.Locale)
@@ -91,15 +114,39 @@ public class StringToBooleanConverter implements Converter<String, Boolean> {
return null;
}
if (value) {
- return getTrueString();
+ return getTrueString(locale);
} else {
- return getFalseString();
+ return getFalseString(locale);
}
}
+ /**
+ * Gets the locale-depended string representation for false.
+ * Default is locale-independent value provided by {@link #getFalseString()}
+ *
+ * @since
+ * @param locale to be used
+ * @return the string representation for false
+ */
+ protected String getFalseString(Locale locale) {
+ return getFalseString();
+ }
+
+ /**
+ * Gets the locale-depended string representation for true.
+ * Default is locale-independent value provided by {@link #getTrueString()}
+ *
+ * @since
+ * @param locale to be used
+ * @return the string representation for true
+ */
+ protected String getTrueString(Locale locale) {
+ return getTrueString();
+ }
+
/*
* (non-Javadoc)
- *
+ *
* @see com.vaadin.data.util.converter.Converter#getModelType()
*/
@Override
@@ -109,7 +156,7 @@ public class StringToBooleanConverter implements Converter<String, Boolean> {
/*
* (non-Javadoc)
- *
+ *
* @see com.vaadin.data.util.converter.Converter#getPresentationType()
*/
@Override
diff --git a/server/src/com/vaadin/server/communication/JSR356WebsocketInitializer.java b/server/src/com/vaadin/server/communication/JSR356WebsocketInitializer.java
index f36d403dd5..6d2843a4fc 100644
--- a/server/src/com/vaadin/server/communication/JSR356WebsocketInitializer.java
+++ b/server/src/com/vaadin/server/communication/JSR356WebsocketInitializer.java
@@ -181,8 +181,13 @@ public class JSR356WebsocketInitializer implements ServletContextListener {
*/
protected boolean isVaadinServlet(ServletRegistration servletRegistration) {
try {
- Class<?> servletClass = Class.forName(servletRegistration
- .getClassName());
+ String servletClassName = servletRegistration.getClassName();
+ if (servletClassName.equals("com.ibm.ws.wsoc.WsocServlet")) {
+ // Websphere servlet which implements websocket endpoints,
+ // dynamically added
+ return false;
+ }
+ Class<?> servletClass = Class.forName(servletClassName);
return VaadinServlet.class.isAssignableFrom(servletClass);
} catch (Exception e) {
// This will fail in OSGi environments, assume everything is a
diff --git a/server/tests/src/com/vaadin/tests/data/converter/StringToBooleanConverterTest.java b/server/tests/src/com/vaadin/tests/data/converter/StringToBooleanConverterTest.java
index f734d76633..6e81af97a3 100644
--- a/server/tests/src/com/vaadin/tests/data/converter/StringToBooleanConverterTest.java
+++ b/server/tests/src/com/vaadin/tests/data/converter/StringToBooleanConverterTest.java
@@ -4,9 +4,25 @@ import junit.framework.TestCase;
import com.vaadin.data.util.converter.StringToBooleanConverter;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Locale;
+
public class StringToBooleanConverterTest extends TestCase {
StringToBooleanConverter converter = new StringToBooleanConverter();
+ StringToBooleanConverter yesNoConverter = new StringToBooleanConverter("yes","no");
+ StringToBooleanConverter localeConverter = new StringToBooleanConverter() {
+ @Override
+ public String getFalseString(Locale locale) {
+ return SimpleDateFormat.getDateInstance(SimpleDateFormat.LONG,locale).format(new Date(3000000000000L));
+ }
+
+ @Override
+ public String getTrueString(Locale locale) {
+ return SimpleDateFormat.getDateInstance(SimpleDateFormat.LONG,locale).format(new Date(2000000000000L));
+ }
+ };
public void testNullConversion() {
assertEquals(null, converter.convertToModel(null, Boolean.class, null));
@@ -20,4 +36,22 @@ public class StringToBooleanConverterTest extends TestCase {
assertTrue(converter.convertToModel("true", Boolean.class, null));
assertFalse(converter.convertToModel("false", Boolean.class, null));
}
+
+ public void testYesNoValueConversion() {
+ assertTrue(yesNoConverter.convertToModel("yes", Boolean.class, null));
+ assertFalse(yesNoConverter.convertToModel("no", Boolean.class, null));
+
+ assertEquals("yes", yesNoConverter.convertToPresentation(true, String.class, null));
+ assertEquals("no", yesNoConverter.convertToPresentation(false, String.class, null));
+ }
+
+
+ public void testLocale() {
+ assertEquals("May 18, 2033", localeConverter.convertToPresentation(true, String.class, Locale.US));
+ assertEquals("January 24, 2065", localeConverter.convertToPresentation(false, String.class, Locale.US));
+
+ assertEquals("18. Mai 2033", localeConverter.convertToPresentation(true, String.class, Locale.GERMANY));
+ assertEquals("24. Januar 2065", localeConverter.convertToPresentation(false, String.class, Locale.GERMANY));
+ }
+
}
diff --git a/uitest/src/com/vaadin/tests/application/VaadinSessionAttribute.java b/uitest/src/com/vaadin/tests/application/VaadinSessionAttribute.java
index ddef40b2d0..c8fc96f596 100644
--- a/uitest/src/com/vaadin/tests/application/VaadinSessionAttribute.java
+++ b/uitest/src/com/vaadin/tests/application/VaadinSessionAttribute.java
@@ -35,9 +35,13 @@ public class VaadinSessionAttribute extends AbstractTestUI {
new Button.ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
- Notification.show(getSession().getAttribute(ATTR_NAME)
- + " & "
- + getSession().getAttribute(Integer.class));
+ Notification notification = new Notification(
+ getSession().getAttribute(ATTR_NAME)
+ + " & "
+ + getSession().getAttribute(
+ Integer.class));
+ notification.setDelayMsec(Notification.DELAY_FOREVER);
+ notification.show(getPage());
}
}));
}
diff --git a/uitest/src/com/vaadin/tests/components/OutOfSync.java b/uitest/src/com/vaadin/tests/components/OutOfSync.java
new file mode 100644
index 0000000000..8cefffc9d1
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/OutOfSync.java
@@ -0,0 +1,55 @@
+package com.vaadin.tests.components;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.Button.ClickEvent;
+import com.vaadin.ui.Button.ClickListener;
+import com.vaadin.ui.Notification;
+
+public class OutOfSync extends AbstractTestUI {
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ Button b = new Button("Click me after 1s to be out of sync");
+ b.addClickListener(new ClickListener() {
+
+ @Override
+ public void buttonClick(ClickEvent event) {
+ Notification.show("This code will never be reached");
+ }
+ });
+ setContent(b);
+ Thread t = new Thread(new Runnable() {
+
+ @Override
+ public void run() {
+ try {
+ Thread.sleep(500);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ // Remove button but prevent repaint -> causes out of sync
+ // issues
+ getSession().lock();
+ try {
+ setContent(null);
+ getConnectorTracker().markClean(OutOfSync.this);
+ } finally {
+ getSession().unlock();
+ }
+ }
+ });
+ t.start();
+ }
+
+ @Override
+ protected String getTestDescription() {
+ return "Click the button after 1s when it has been removed server side (causing synchronization problems)";
+ }
+
+ @Override
+ protected Integer getTicketNumber() {
+ return 10780;
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/components/OutOfSyncTest.java b/uitest/src/com/vaadin/tests/components/OutOfSyncTest.java
index 0efb519e8d..c6bab3c9b9 100644
--- a/uitest/src/com/vaadin/tests/components/OutOfSyncTest.java
+++ b/uitest/src/com/vaadin/tests/components/OutOfSyncTest.java
@@ -1,55 +1,48 @@
+/*
+ * 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.tests.components;
-import com.vaadin.server.VaadinRequest;
-import com.vaadin.ui.Button;
-import com.vaadin.ui.Button.ClickEvent;
-import com.vaadin.ui.Button.ClickListener;
-import com.vaadin.ui.Notification;
-
-public class OutOfSyncTest extends AbstractTestUI {
-
- @Override
- protected void setup(VaadinRequest request) {
- Button b = new Button("Click me after 1s to be out of sync");
- b.addClickListener(new ClickListener() {
-
- @Override
- public void buttonClick(ClickEvent event) {
- Notification.show("This code will never be reached");
- }
- });
- setContent(b);
- Thread t = new Thread(new Runnable() {
-
- @Override
- public void run() {
- try {
- Thread.sleep(500);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- // Remove button but prevent repaint -> causes out of sync
- // issues
- getSession().lock();
- try {
- setContent(null);
- getConnectorTracker().markClean(OutOfSyncTest.this);
- } finally {
- getSession().unlock();
- }
- }
- });
- t.start();
- }
+import org.junit.Assert;
+import org.junit.Test;
- @Override
- protected String getTestDescription() {
- return "Click the button after 1s when it has been removed server side (causing synchronization problems)";
- }
+import com.vaadin.testbench.elements.ButtonElement;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public class OutOfSyncTest extends MultiBrowserTest {
+
+ @Test
+ public void testClientResync() throws InterruptedException {
+ openTestURL();
+
+ // Wait for server to get rid of the Button
+ sleep(1000);
+
+ // On the first round-trip after the component has been removed, the
+ // server assumes the client will remove the button. How ever (to force
+ // it to be out of sync) the test UI calls markClean() on the Button to
+ // make it not update with the response.
+ $(ButtonElement.class).first().click();
+ Assert.assertTrue(
+ "Button should not have disappeared on the first click.",
+ $(ButtonElement.class).exists());
- @Override
- protected Integer getTicketNumber() {
- return 10780;
+ // Truly out of sync, full resync is forced.
+ $(ButtonElement.class).first().click();
+ Assert.assertFalse("Button should disappear with the second click.",
+ $(ButtonElement.class).exists());
}
}
diff --git a/uitest/src/com/vaadin/tests/components/abstractembedded/EmbeddedWithNullSourceTest.java b/uitest/src/com/vaadin/tests/components/abstractembedded/EmbeddedWithNullSourceTest.java
new file mode 100644
index 0000000000..649ee42986
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/abstractembedded/EmbeddedWithNullSourceTest.java
@@ -0,0 +1,46 @@
+/*
+ * 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.tests.components.abstractembedded;
+
+import java.io.IOException;
+import java.util.List;
+
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.remote.DesiredCapabilities;
+
+import com.vaadin.testbench.parallel.Browser;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public class EmbeddedWithNullSourceTest extends MultiBrowserTest {
+
+ @Override
+ public List<DesiredCapabilities> getBrowsersToTest() {
+ // No Flash on PhantomJS, IE 11 has a timeout issue, looks like a
+ // IEDriver problem, not reproduced running locally.
+ return getBrowserCapabilities(Browser.IE8, Browser.IE9, Browser.IE10,
+ Browser.CHROME, Browser.FIREFOX);
+ }
+
+ @Test
+ public void testEmbeddedWithNullSource() throws IOException {
+ openTestURL();
+
+ waitForElementPresent(By.className("v-image"));
+
+ compareScreen("nullSources");
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/components/grid/GridEditorFrozenColumnsUI.java b/uitest/src/com/vaadin/tests/components/grid/GridEditorFrozenColumnsUI.java
new file mode 100644
index 0000000000..d2414a8c40
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/grid/GridEditorFrozenColumnsUI.java
@@ -0,0 +1,43 @@
+/*
+ * 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.tests.components.grid;
+
+import com.vaadin.tests.util.PersonContainer;
+import com.vaadin.ui.Grid;
+
+public class GridEditorFrozenColumnsUI extends GridEditorUI {
+
+ @Override
+ protected Grid createGrid(PersonContainer container) {
+ Grid grid = super.createGrid(container);
+
+ grid.setFrozenColumnCount(2);
+
+ grid.setWidth("600px");
+
+ return grid;
+ }
+
+ @Override
+ protected Integer getTicketNumber() {
+ return 16727;
+ }
+
+ @Override
+ protected String getTestDescription() {
+ return "Frozen columns should also freeze cells in editor.";
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/components/grid/GridEditorFrozenColumnsUITest.java b/uitest/src/com/vaadin/tests/components/grid/GridEditorFrozenColumnsUITest.java
new file mode 100644
index 0000000000..75d71a3c40
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/grid/GridEditorFrozenColumnsUITest.java
@@ -0,0 +1,78 @@
+/*
+ * 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.tests.components.grid;
+
+import java.io.IOException;
+
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.JavascriptExecutor;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.interactions.Actions;
+
+import com.vaadin.testbench.elements.GridElement;
+import com.vaadin.testbench.elements.GridElement.GridCellElement;
+import com.vaadin.testbench.parallel.TestCategory;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+@TestCategory("grid")
+public class GridEditorFrozenColumnsUITest extends MultiBrowserTest {
+
+ @Test
+ public void testEditorWithFrozenColumns() throws IOException {
+ openTestURL();
+
+ openEditor(10);
+
+ compareScreen("noscroll");
+
+ scrollGridHorizontallyTo(100);
+
+ compareScreen("scrolled");
+ }
+
+ private void openEditor(int rowIndex) {
+ GridElement grid = $(GridElement.class).first();
+
+ GridCellElement cell = grid.getCell(rowIndex, 1);
+
+ new Actions(driver).moveToElement(cell).doubleClick().build().perform();
+ }
+
+ private void scrollGridHorizontallyTo(double px) {
+ executeScript("arguments[0].scrollLeft = " + px,
+ getGridHorizontalScrollbar());
+ }
+
+ private Object executeScript(String script, WebElement element) {
+ final WebDriver driver = getDriver();
+ if (driver instanceof JavascriptExecutor) {
+ final JavascriptExecutor je = (JavascriptExecutor) driver;
+ return je.executeScript(script, element);
+ } else {
+ throw new IllegalStateException("current driver "
+ + getDriver().getClass().getName() + " is not a "
+ + JavascriptExecutor.class.getSimpleName());
+ }
+ }
+
+ private WebElement getGridHorizontalScrollbar() {
+ return getDriver()
+ .findElement(
+ By.xpath("//div[contains(@class, \"v-grid-scroller-horizontal\")]"));
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/components/grid/GridEditorUI.java b/uitest/src/com/vaadin/tests/components/grid/GridEditorUI.java
index 60e241bae3..0a302967e8 100644
--- a/uitest/src/com/vaadin/tests/components/grid/GridEditorUI.java
+++ b/uitest/src/com/vaadin/tests/components/grid/GridEditorUI.java
@@ -28,6 +28,10 @@ public class GridEditorUI extends AbstractTestUI {
protected void setup(VaadinRequest request) {
PersonContainer container = PersonContainer.createWithTestData();
+ addComponent(createGrid(container));
+ }
+
+ protected Grid createGrid(PersonContainer container) {
Grid grid = new Grid(container);
// Don't use address since there's no converter
@@ -43,7 +47,7 @@ public class GridEditorUI extends AbstractTestUI {
grid.getColumn("phoneNumber").getEditorField().setReadOnly(true);
- addComponent(grid);
+ return grid;
}
}
diff --git a/uitest/src/com/vaadin/tests/components/grid/GridEditorUITest.java b/uitest/src/com/vaadin/tests/components/grid/GridEditorUITest.java
index 47dc90e33a..3d0b3bb071 100644
--- a/uitest/src/com/vaadin/tests/components/grid/GridEditorUITest.java
+++ b/uitest/src/com/vaadin/tests/components/grid/GridEditorUITest.java
@@ -45,7 +45,7 @@ public class GridEditorUITest extends MultiBrowserTest {
openEditor(10);
- assertTrue("Edtor should be opened with a password field",
+ assertTrue("Editor should be opened with a password field",
isElementPresent(PasswordFieldElement.class));
assertFalse("Notification was present",
diff --git a/uitest/src/com/vaadin/tests/components/grid/GridScrollToLineWhileResizing.java b/uitest/src/com/vaadin/tests/components/grid/GridScrollToLineWhileResizing.java
new file mode 100644
index 0000000000..194a9a3acc
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/grid/GridScrollToLineWhileResizing.java
@@ -0,0 +1,73 @@
+/*
+ * 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.tests.components.grid;
+
+import com.vaadin.data.Item;
+import com.vaadin.data.util.IndexedContainer;
+import com.vaadin.event.SelectionEvent;
+import com.vaadin.event.SelectionEvent.SelectionListener;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.Grid;
+import com.vaadin.ui.Grid.SelectionMode;
+import com.vaadin.ui.VerticalSplitPanel;
+
+public class GridScrollToLineWhileResizing extends AbstractTestUI {
+
+ @Override
+ protected void setup(VaadinRequest request) {
+
+ final VerticalSplitPanel vsp = new VerticalSplitPanel();
+ vsp.setWidth(500, Unit.PIXELS);
+ vsp.setHeight(500, Unit.PIXELS);
+ vsp.setSplitPosition(100, Unit.PERCENTAGE);
+ addComponent(vsp);
+
+ IndexedContainer indexedContainer = new IndexedContainer();
+ indexedContainer.addContainerProperty("column1", String.class, "");
+
+ for (int i = 0; i < 100; i++) {
+ Item addItem = indexedContainer.addItem(i);
+ addItem.getItemProperty("column1").setValue("cell" + i);
+ }
+
+ final Grid grid = new Grid(indexedContainer);
+ grid.setSizeFull();
+
+ grid.setSelectionMode(SelectionMode.SINGLE);
+ grid.addSelectionListener(new SelectionListener() {
+
+ @Override
+ public void select(SelectionEvent event) {
+ vsp.setSplitPosition(50, Unit.PERCENTAGE);
+ grid.scrollTo(event.getSelected().iterator().next());
+ }
+ });
+
+ vsp.setFirstComponent(grid);
+ }
+
+ @Override
+ protected String getTestDescription() {
+ return "Tests scrollToLine while moving SplitPanel split position to resize the Grid on the same round-trip.";
+ }
+
+ @Override
+ protected Integer getTicketNumber() {
+ return null;
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/components/grid/GridScrollToLineWhileResizingTest.java b/uitest/src/com/vaadin/tests/components/grid/GridScrollToLineWhileResizingTest.java
new file mode 100644
index 0000000000..aee1db7a85
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/components/grid/GridScrollToLineWhileResizingTest.java
@@ -0,0 +1,49 @@
+/*
+ * 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.tests.components.grid;
+
+import static org.junit.Assert.assertTrue;
+
+import java.util.List;
+
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebElement;
+
+import com.vaadin.testbench.elements.GridElement;
+import com.vaadin.testbench.parallel.TestCategory;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+@TestCategory("grid")
+public class GridScrollToLineWhileResizingTest extends MultiBrowserTest {
+
+ @Test
+ public void testScrollToLineWorksWhileMovingSplitProgrammatically() {
+ openTestURL();
+
+ $(GridElement.class).first().getCell(21, 0).click();
+
+ List<WebElement> cells = findElements(By.className("v-grid-cell"));
+ boolean foundCell21 = false;
+ for (WebElement cell : cells) {
+ if ("cell21".equals(cell.getText())) {
+ foundCell21 = true;
+ }
+ }
+
+ assertTrue(foundCell21);
+ }
+} \ No newline at end of file
diff --git a/uitest/src/com/vaadin/tests/components/grid/basicfeatures/client/GridEditorClientTest.java b/uitest/src/com/vaadin/tests/components/grid/basicfeatures/client/GridEditorClientTest.java
index f437589a39..43fe29bc02 100644
--- a/uitest/src/com/vaadin/tests/components/grid/basicfeatures/client/GridEditorClientTest.java
+++ b/uitest/src/com/vaadin/tests/components/grid/basicfeatures/client/GridEditorClientTest.java
@@ -134,10 +134,12 @@ public class GridEditorClientTest extends GridBasicClientFeaturesTest {
@Test
public void testWithSelectionColumn() throws Exception {
selectMenuPath("Component", "State", "Selection mode", "multi");
+ selectMenuPath("Component", "State", "Frozen column count",
+ "-1 columns");
selectMenuPath(EDIT_ROW_5);
- WebElement editorCells = findElement(By
- .className("v-grid-editor-cells"));
+ WebElement editorCells = findElements(
+ By.className("v-grid-editor-cells")).get(1);
List<WebElement> selectorDivs = editorCells.findElements(By
.cssSelector("div"));
diff --git a/uitest/src/com/vaadin/tests/components/grid/basicfeatures/server/GridEditorTest.java b/uitest/src/com/vaadin/tests/components/grid/basicfeatures/server/GridEditorTest.java
index e7eb78c35e..f7592ce922 100644
--- a/uitest/src/com/vaadin/tests/components/grid/basicfeatures/server/GridEditorTest.java
+++ b/uitest/src/com/vaadin/tests/components/grid/basicfeatures/server/GridEditorTest.java
@@ -200,7 +200,7 @@ public abstract class GridEditorTest extends GridBasicFeaturesTest {
assertEquals(
"Not editable cell did not contain correct classname",
"not-editable",
- editor.findElement(By.className("v-grid-editor-cells"))
+ editor.findElements(By.className("v-grid-editor-cells")).get(1)
.findElements(By.xpath("./div")).get(3)
.getAttribute("class"));
diff --git a/uitest/src/com/vaadin/tests/components/grid/basicfeatures/server/GridSidebarThemeTest.java b/uitest/src/com/vaadin/tests/components/grid/basicfeatures/server/GridSidebarThemeTest.java
index 0e5dd32989..238b470feb 100644
--- a/uitest/src/com/vaadin/tests/components/grid/basicfeatures/server/GridSidebarThemeTest.java
+++ b/uitest/src/com/vaadin/tests/components/grid/basicfeatures/server/GridSidebarThemeTest.java
@@ -45,15 +45,15 @@ public class GridSidebarThemeTest extends GridBasicFeaturesTest {
private void runTestSequence(String theme) throws IOException {
openTestURL("theme=" + theme);
- compareScreen(theme + "_SidebarClosed");
+ compareScreen(theme + "-SidebarClosed");
getSidebarOpenButton().click();
- compareScreen(theme + "_SidebarOpen");
+ compareScreen(theme + "-SidebarOpen");
new Actions(getDriver()).moveToElement(getColumnHidingToggle(2), 5, 5)
.perform();
- compareScreen(theme + "_OnMouseOverNotHiddenToggle");
+ compareScreen(theme + "-OnMouseOverNotHiddenToggle");
getColumnHidingToggle(2).click();
getColumnHidingToggle(3).click();
@@ -63,17 +63,17 @@ public class GridSidebarThemeTest extends GridBasicFeaturesTest {
.perform();
;
- compareScreen(theme + "_TogglesTriggered");
+ compareScreen(theme + "-TogglesTriggered");
new Actions(getDriver()).moveToElement(getColumnHidingToggle(2))
.perform();
;
- compareScreen(theme + "_OnMouseOverHiddenToggle");
+ compareScreen(theme + "-OnMouseOverHiddenToggle");
getSidebarOpenButton().click();
- compareScreen(theme + "_SidebarClosed2");
+ compareScreen(theme + "-SidebarClosed2");
}
@Override
diff --git a/uitest/src/com/vaadin/tests/components/popupview/PopupViewShortcutActionHandlerTest.java b/uitest/src/com/vaadin/tests/components/popupview/PopupViewShortcutActionHandlerTest.java
index 3005365c47..6155820990 100644
--- a/uitest/src/com/vaadin/tests/components/popupview/PopupViewShortcutActionHandlerTest.java
+++ b/uitest/src/com/vaadin/tests/components/popupview/PopupViewShortcutActionHandlerTest.java
@@ -15,13 +15,15 @@
*/
package com.vaadin.tests.components.popupview;
-import com.vaadin.tests.tb3.MultiBrowserTest;
import org.junit.Assert;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebElement;
+import com.vaadin.testbench.parallel.BrowserUtil;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
/**
* Check availability of shortcut action listener in the popup view.
*
@@ -29,6 +31,14 @@ import org.openqa.selenium.WebElement;
*/
public class PopupViewShortcutActionHandlerTest extends MultiBrowserTest {
+ @Override
+ protected boolean requireWindowFocusForIE() {
+ if (BrowserUtil.isIE8(getDesiredCapabilities())) {
+ return false;
+ }
+ return true;
+ }
+
@Test
public void testShortcutHandling() {
openTestURL();
diff --git a/uitest/src/com/vaadin/tests/debug/PreserveCustomDebugSectionOpen.java b/uitest/src/com/vaadin/tests/debug/PreserveCustomDebugSectionOpen.java
new file mode 100644
index 0000000000..0ac2e87510
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/debug/PreserveCustomDebugSectionOpen.java
@@ -0,0 +1,33 @@
+/*
+ * 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.tests.debug;
+
+import com.vaadin.annotations.Widgetset;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.tests.widgetset.TestingWidgetSet;
+import com.vaadin.ui.Label;
+
+@Widgetset(TestingWidgetSet.NAME)
+public class PreserveCustomDebugSectionOpen extends AbstractTestUI {
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ addComponent(new Label(
+ "UI for testing that a custom debug window section remains open after refreshging."));
+ }
+
+}
diff --git a/uitest/src/com/vaadin/tests/debug/PreserveCustomDebugSectionOpenTest.java b/uitest/src/com/vaadin/tests/debug/PreserveCustomDebugSectionOpenTest.java
new file mode 100644
index 0000000000..01b73ded92
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/debug/PreserveCustomDebugSectionOpenTest.java
@@ -0,0 +1,47 @@
+/*
+ * 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.tests.debug;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebElement;
+
+import com.vaadin.tests.tb3.SingleBrowserTest;
+
+public class PreserveCustomDebugSectionOpenTest extends SingleBrowserTest {
+ @Test
+ public void testPreserveSection() {
+ setDebug(true);
+ openTestURL();
+
+ findElement(
+ By.cssSelector(".v-debugwindow-tabs button[title=\"Dummy debug window section\"]"))
+ .click();
+
+ WebElement content = findElement(By
+ .cssSelector(".v-debugwindow-content"));
+
+ // Sanity check
+ Assert.assertEquals("Dummy debug window section", content.getText());
+
+ // Open page again, should still have the same section open
+ openTestURL();
+
+ content = findElement(By.cssSelector(".v-debugwindow-content"));
+ Assert.assertEquals("Dummy debug window section", content.getText());
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/fieldgroup/BasicPersonFormTest.java b/uitest/src/com/vaadin/tests/fieldgroup/BasicPersonFormTest.java
index f611325719..2562412480 100644
--- a/uitest/src/com/vaadin/tests/fieldgroup/BasicPersonFormTest.java
+++ b/uitest/src/com/vaadin/tests/fieldgroup/BasicPersonFormTest.java
@@ -20,18 +20,25 @@ import org.junit.Assert;
import com.vaadin.testbench.TestBenchElement;
import com.vaadin.testbench.elements.ButtonElement;
import com.vaadin.testbench.elements.CheckBoxElement;
-import com.vaadin.testbench.elements.NotificationElement;
import com.vaadin.testbench.elements.TableElement;
import com.vaadin.testbench.elements.TableRowElement;
import com.vaadin.testbench.elements.TextAreaElement;
import com.vaadin.testbench.elements.TextFieldElement;
import com.vaadin.tests.data.bean.Sex;
import com.vaadin.tests.tb3.MultiBrowserTest;
+import com.vaadin.tests.tb3.newelements.FixedNotificationElement;
public abstract class BasicPersonFormTest extends MultiBrowserTest {
private static final String BEAN_VALUES = "Person [firstName=John, lastName=Doe, email=john@doe.com, age=64, sex=Male, address=Address [streetAddress=John street, postalCode=11223, city=John's town, country=USA], deceased=false, salary=null, salaryDouble=null, rent=null]";
- private int logCounter = 0;
+ private int logCounter;
+
+ @Override
+ public void setup() throws Exception {
+ super.setup();
+
+ logCounter = 0;
+ }
@Override
protected Class<?> getUIClass() {
@@ -75,7 +82,7 @@ public abstract class BasicPersonFormTest extends MultiBrowserTest {
}
protected void closeNotification() {
- $(NotificationElement.class).first().close();
+ $(FixedNotificationElement.class).first().close();
}
protected CheckBoxElement getPostCommitFailsCheckBox() {
@@ -169,5 +176,4 @@ public abstract class BasicPersonFormTest extends MultiBrowserTest {
assertSelectedSex(Sex.MALE);
assertDeceasedValue("NAAAAAH");
}
-
}
diff --git a/uitest/src/com/vaadin/tests/tb3/MultiBrowserTest.java b/uitest/src/com/vaadin/tests/tb3/MultiBrowserTest.java
index a678009d85..c53209d1dc 100644
--- a/uitest/src/com/vaadin/tests/tb3/MultiBrowserTest.java
+++ b/uitest/src/com/vaadin/tests/tb3/MultiBrowserTest.java
@@ -89,6 +89,8 @@ public abstract class MultiBrowserTest extends PrivateTB3Configuration {
@Override
public void setDesiredCapabilities(DesiredCapabilities desiredCapabilities) {
+ super.setDesiredCapabilities(desiredCapabilities);
+
if (BrowserUtil.isIE(desiredCapabilities)) {
if (requireWindowFocusForIE()) {
desiredCapabilities.setCapability(
@@ -108,8 +110,6 @@ public abstract class MultiBrowserTest extends PrivateTB3Configuration {
"name",
String.format("%s.%s", getClass().getCanonicalName(),
testName.getMethodName()));
-
- super.setDesiredCapabilities(desiredCapabilities);
}
@Override
diff --git a/uitest/src/com/vaadin/tests/tooltip/MenuBarTooltip.java b/uitest/src/com/vaadin/tests/tooltip/MenuBarTooltip.java
new file mode 100644
index 0000000000..ff470336f5
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/tooltip/MenuBarTooltip.java
@@ -0,0 +1,34 @@
+package com.vaadin.tests.tooltip;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.MenuBar;
+
+public class MenuBarTooltip extends AbstractTestUI {
+
+ @Override
+ protected void setup(VaadinRequest request) {
+ MenuBar menubar = new MenuBar();
+
+ MenuBar.MenuItem menuitem = menubar.addItem("Menu item", null, null);
+ menuitem.setDescription("Menu item description");
+
+ MenuBar.MenuItem submenuitem1 = menuitem.addItem("Submenu item 1", null, null);
+ submenuitem1.setDescription("Submenu item 1 description");
+
+ MenuBar.MenuItem submenuitem2 = menuitem.addItem("Submenu item 2", null, null);
+ submenuitem2.setDescription("Submenu item 2 description");
+
+ addComponent(menubar);
+ }
+
+ @Override
+ protected Integer getTicketNumber() {
+ return 14854;
+ }
+
+ @Override
+ protected String getTestDescription() {
+ return "MenuItem tooltip should have a larger z-index than MenuBar/MenuItem.";
+ }
+}
diff --git a/uitest/src/com/vaadin/tests/tooltip/MenuBarTooltipTest.java b/uitest/src/com/vaadin/tests/tooltip/MenuBarTooltipTest.java
new file mode 100644
index 0000000000..9b2f7d13d6
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/tooltip/MenuBarTooltipTest.java
@@ -0,0 +1,46 @@
+package com.vaadin.tests.tooltip;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.greaterThan;
+
+import org.junit.Test;
+import org.openqa.selenium.By;
+
+import com.vaadin.testbench.elements.MenuBarElement;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+import com.vaadin.ui.themes.ChameleonTheme;
+import com.vaadin.ui.themes.Reindeer;
+import com.vaadin.ui.themes.Runo;
+import com.vaadin.ui.themes.ValoTheme;
+
+public class MenuBarTooltipTest extends MultiBrowserTest {
+
+ @Test
+ public void toolTipShouldBeOnTopOfMenuItem() {
+ String[] themes = new String[] {
+ ValoTheme.THEME_NAME,
+ Reindeer.THEME_NAME,
+ Runo.THEME_NAME,
+ ChameleonTheme.THEME_NAME
+ };
+
+ for(String theme : themes) {
+ assertZIndices(theme);
+ }
+ }
+
+ public void assertZIndices(String theme) {
+ openTestURL("theme=" + theme);
+
+ $(MenuBarElement.class).first().clickItem("Menu item");
+
+ assertThat(String.format("Invalid z-index for theme %s.", theme),
+ getZIndex("v-tooltip"), greaterThan(getZIndex("v-menubar-popup")));
+ }
+
+ private int getZIndex(String className) {
+ return Integer.parseInt(
+ findElement(By.className(className)).getCssValue("z-index"));
+ }
+
+} \ No newline at end of file
diff --git a/uitest/src/com/vaadin/tests/widgetset/TestingWidgetSet.gwt.xml b/uitest/src/com/vaadin/tests/widgetset/TestingWidgetSet.gwt.xml
index 8a02d91d2c..3878e85193 100644
--- a/uitest/src/com/vaadin/tests/widgetset/TestingWidgetSet.gwt.xml
+++ b/uitest/src/com/vaadin/tests/widgetset/TestingWidgetSet.gwt.xml
@@ -23,5 +23,6 @@
<generate-with class="com.vaadin.tests.widgetset.rebind.TestWidgetRegistryGenerator">
<when-type-is class="com.vaadin.tests.widgetset.client.TestWidgetConnector.TestWidgetRegistry" />
</generate-with>
-
+
+ <entry-point class="com.vaadin.tests.widgetset.client.TestingWidgetsetEntryPoint" />
</module>
diff --git a/uitest/src/com/vaadin/tests/widgetset/client/TestingWidgetsetEntryPoint.java b/uitest/src/com/vaadin/tests/widgetset/client/TestingWidgetsetEntryPoint.java
new file mode 100644
index 0000000000..7268d02993
--- /dev/null
+++ b/uitest/src/com/vaadin/tests/widgetset/client/TestingWidgetsetEntryPoint.java
@@ -0,0 +1,83 @@
+/*
+ * 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.tests.widgetset.client;
+
+import com.google.gwt.core.client.EntryPoint;
+import com.google.gwt.user.client.Window.Location;
+import com.google.gwt.user.client.ui.Label;
+import com.google.gwt.user.client.ui.Widget;
+import com.vaadin.client.ApplicationConnection;
+import com.vaadin.client.ValueMap;
+import com.vaadin.client.debug.internal.DebugButton;
+import com.vaadin.client.debug.internal.Icon;
+import com.vaadin.client.debug.internal.Section;
+import com.vaadin.client.debug.internal.VDebugWindow;
+
+public class TestingWidgetsetEntryPoint implements EntryPoint {
+
+ @Override
+ public void onModuleLoad() {
+ if (Location.getPath().contains("PreserveCustomDebugSectionOpen")) {
+ addDummyDebugWindowSection();
+ }
+ }
+
+ private void addDummyDebugWindowSection() {
+ VDebugWindow.get().addSection(new Section() {
+ private final DebugButton tabButton = new DebugButton(Icon.ERROR,
+ "Dummy debug window section");
+ private final Label controls = new Label("");
+ private final Label contents = new Label(
+ "Dummy debug window section");
+
+ @Override
+ public DebugButton getTabButton() {
+ return tabButton;
+ }
+
+ @Override
+ public Widget getControls() {
+ return controls;
+ }
+
+ @Override
+ public Widget getContent() {
+ return contents;
+ }
+
+ @Override
+ public void show() {
+ // nop
+ }
+
+ @Override
+ public void hide() {
+ // nop
+ }
+
+ @Override
+ public void meta(ApplicationConnection ac, ValueMap meta) {
+ // nop
+ }
+
+ @Override
+ public void uidl(ApplicationConnection ac, ValueMap uidl) {
+ // nop
+ }
+ });
+ }
+
+}
diff --git a/uitest/tb2/com/vaadin/tests/components/OutOfSyncTest.html b/uitest/tb2/com/vaadin/tests/components/OutOfSyncTest.html
deleted file mode 100644
index 4828069e2a..0000000000
--- a/uitest/tb2/com/vaadin/tests/components/OutOfSyncTest.html
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head profile="http://selenium-ide.openqa.org/profiles/test-case">
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-<link rel="selenium.base" href="http://localhost:8888/" />
-<title>New Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">New Test</td></tr>
-</thead><tbody>
-<tr>
- <td>open</td>
- <td>/run/OutOfSyncTest?restartApplication</td>
- <td></td>
-</tr>
-<tr>
- <td>pause</td>
- <td>1000</td>
- <td></td>
-</tr>
-<tr>
- <td>click</td>
- <td>vaadin=runOutOfSyncTest::/VButton[0]/domChild[0]/domChild[0]</td>
- <td></td>
-</tr>
-<!--Out of sync occured -> the button should be removed-->
-<tr>
- <td>assertElementNotPresent</td>
- <td>vaadin=runOutOfSyncTest::/VButton[0]</td>
- <td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/uitest/tb2/com/vaadin/tests/components/abstractembedded/EmbeddedWithNullSource.html b/uitest/tb2/com/vaadin/tests/components/abstractembedded/EmbeddedWithNullSource.html
deleted file mode 100644
index 37186bd901..0000000000
--- a/uitest/tb2/com/vaadin/tests/components/abstractembedded/EmbeddedWithNullSource.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head profile="http://selenium-ide.openqa.org/profiles/test-case">
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-<link rel="selenium.base" href="" />
-<title>EmbeddedWithNullSource</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">EmbeddedWithNullSource</td></tr>
-</thead><tbody>
-<tr>
- <td>open</td>
- <td>/run/EmbeddedWithNullSource?restartApplication</td>
- <td></td>
-</tr>
-<tr>
- <td>screenCapture</td>
- <td></td>
- <td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>