diff options
4 files changed, 83 insertions, 1 deletions
diff --git a/client/src/main/java/com/vaadin/client/WidgetUtil.java b/client/src/main/java/com/vaadin/client/WidgetUtil.java index 94439dc945..e6304343aa 100644 --- a/client/src/main/java/com/vaadin/client/WidgetUtil.java +++ b/client/src/main/java/com/vaadin/client/WidgetUtil.java @@ -1867,6 +1867,19 @@ public class WidgetUtil { } /** + * Returns whether the given object is a string. + * + * @param obj + * the object of which the type is examined + * @return {@code true} if the object is a string; {@code false} if not + * @since + */ + public static native boolean isString(Object obj) + /*-{ + return typeof obj === 'string' || obj instanceof String; + }-*/; + + /** * Utility methods for displaying error message on components. * * @since 8.2 diff --git a/client/src/main/java/com/vaadin/client/widgets/Grid.java b/client/src/main/java/com/vaadin/client/widgets/Grid.java index 43f85a9848..4651c534dc 100755 --- a/client/src/main/java/com/vaadin/client/widgets/Grid.java +++ b/client/src/main/java/com/vaadin/client/widgets/Grid.java @@ -7528,7 +7528,12 @@ public class Grid<T> extends ResizeComposite implements HasSelectionHandlers<T>, boolean isElement = Element.is(n); if (isElement) { String className = Element.as(n).getClassName(); - if (className.contains(getStylePrimaryName() + "-spacer")) { + + // Also check whether className is indeed a string. For + // SVGElement it may be of type SVGAnimatedString. + // https://developer.mozilla.org/en-US/docs/Web/API/Element/className#Notes + if (WidgetUtil.isString(className) && className + .contains(getStylePrimaryName() + "-spacer")) { return true; } } diff --git a/uitest/src/main/java/com/vaadin/tests/components/grid/GridSvgInCell.java b/uitest/src/main/java/com/vaadin/tests/components/grid/GridSvgInCell.java new file mode 100644 index 0000000000..fbe59b8a88 --- /dev/null +++ b/uitest/src/main/java/com/vaadin/tests/components/grid/GridSvgInCell.java @@ -0,0 +1,40 @@ +package com.vaadin.tests.components.grid; + +import com.vaadin.annotations.Widgetset; +import com.vaadin.server.VaadinRequest; +import com.vaadin.tests.components.AbstractTestUI; +import com.vaadin.ui.Grid; +import com.vaadin.ui.renderers.HtmlRenderer; + +@Widgetset("com.vaadin.DefaultWidgetSet") +public class GridSvgInCell extends AbstractTestUI { + + private static class DataObject { + private String svg; + + public String getSvg() { + return svg; + } + + public void setSvg(String svg) { + this.svg = svg; + } + } + + @Override + protected void setup(VaadinRequest request) { + Grid<DataObject> grid = new Grid<>(); + grid.addColumn(DataObject::getSvg).setCaption("SVG") + .setRenderer(new HtmlRenderer("")); + + DataObject data = new DataObject(); + data.setSvg( + "<svg width=\"100%\" height=\"20px\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">" + + "<polygon id=\"bar_background_blue\" stroke=\"gray\" fill=\"#D6D6D6\" points=\"0 0,59 0,66 7,59 14,0 14\"></polygon>" + + "<rect id=\"bar_blue\" x=\"1\" y=\"1\" width=\"0px\" height=\"13\" fill=\"#7298C0\"></rect>" + + "</svg>"); + grid.setItems(data); + + addComponent(grid); + } +} diff --git a/uitest/src/test/java/com/vaadin/tests/components/grid/GridSvgInCellTest.java b/uitest/src/test/java/com/vaadin/tests/components/grid/GridSvgInCellTest.java new file mode 100644 index 0000000000..ae7174609e --- /dev/null +++ b/uitest/src/test/java/com/vaadin/tests/components/grid/GridSvgInCellTest.java @@ -0,0 +1,24 @@ +package com.vaadin.tests.components.grid; + +import org.junit.Before; +import org.junit.Test; +import org.openqa.selenium.interactions.Actions; + +import com.vaadin.testbench.elements.GridElement; +import com.vaadin.tests.tb3.SingleBrowserTest; + +public class GridSvgInCellTest extends SingleBrowserTest { + + @Before + public void before() { + setDebug(true); + openTestURL(); + } + + @Test + public void moveMouseOverSvgInCell() { + GridElement grid = $(GridElement.class).first(); + new Actions(driver).moveToElement(grid.getCell(0, 0)).perform(); + assertNoErrorNotifications(); + } +} |