From e144659cba47a9fdd48348e531480537b2036db2 Mon Sep 17 00:00:00 2001 From: Dmitrii Rogozin Date: Mon, 20 Oct 2014 16:25:22 +0300 Subject: [PATCH] Fix VaadinFinderLocator for UIElement (#14010). Change-Id: If25ebdcdd4df438402d1cdc60a63c629e84c73a0 --- .../client/componentlocator/LocatorUtil.java | 29 ++++++++ .../VaadinFinderLocatorStrategy.java | 38 +++------- .../com/vaadin/client/LocatorUtilTest.java | 73 +++++++++++++++++++ .../ui/VaadinFinderLocatorUISearchTest.java | 43 +++++++++++ 4 files changed, 155 insertions(+), 28 deletions(-) create mode 100644 client/tests/src/com/vaadin/client/LocatorUtilTest.java create mode 100644 uitest/src/com/vaadin/tests/components/ui/VaadinFinderLocatorUISearchTest.java diff --git a/client/src/com/vaadin/client/componentlocator/LocatorUtil.java b/client/src/com/vaadin/client/componentlocator/LocatorUtil.java index 1d1c06587b..7de0de3855 100644 --- a/client/src/com/vaadin/client/componentlocator/LocatorUtil.java +++ b/client/src/com/vaadin/client/componentlocator/LocatorUtil.java @@ -15,6 +15,8 @@ */ package com.vaadin.client.componentlocator; +import com.google.gwt.regexp.shared.RegExp; + /** * Common String manipulator utilities used in VaadinFinderLocatorStrategy and * SelectorPredicates. @@ -73,4 +75,31 @@ public class LocatorUtil { protected static int indexOfIgnoringQuoted(String str, char find) { return indexOfIgnoringQuoted(str, find, 0); } + + /** + * Checks if path refers to vaadin UI element com.vaadin.ui.UI. + * + * @param path + * to vaadin element + * @return true if path refers to UI element, false otherwise + */ + public static boolean isUIElement(String path) { + String regex = "^\\/{0,2}(com\\.vaadin\\.ui\\.)?V?UI[\\/\\[]?"; + RegExp regexp = RegExp.compile(regex); + return regexp.test(path); + } + + /** + * Checks if path refers to vaadin Notification element + * com.vaadin.ui.Notification. + * + * @param path + * to vaadin element + * @return true if path refers to Notification element, false otherwise + */ + public static boolean isNotificationElement(String path) { + String regex = "^\\/{0,2}(com\\.vaadin\\.ui\\.)?V?Notification[\\/\\[]?"; + RegExp regexp = RegExp.compile(regex); + return regexp.test(path); + } } diff --git a/client/src/com/vaadin/client/componentlocator/VaadinFinderLocatorStrategy.java b/client/src/com/vaadin/client/componentlocator/VaadinFinderLocatorStrategy.java index a36ea1ac85..7346e489e5 100644 --- a/client/src/com/vaadin/client/componentlocator/VaadinFinderLocatorStrategy.java +++ b/client/src/com/vaadin/client/componentlocator/VaadinFinderLocatorStrategy.java @@ -267,32 +267,6 @@ public class VaadinFinderLocatorStrategy implements LocatorStrategy { return connectorHierarchy; } - private boolean isNotificationExpression(String path) { - String[] starts = { "//", "/" }; - - String[] frags = { "com.vaadin.ui.Notification.class", - "com.vaadin.ui.Notification", "VNotification.class", - "VNotification", "Notification.class", "Notification" }; - - String[] ends = { "/", "[" }; - - for (String s : starts) { - for (String f : frags) { - if (path.equals(s + f)) { - return true; - } - - for (String e : ends) { - if (path.startsWith(s + f + e)) { - return true; - } - } - } - } - - return false; - } - /** * {@inheritDoc} */ @@ -305,7 +279,7 @@ public class VaadinFinderLocatorStrategy implements LocatorStrategy { } List elements = new ArrayList(); - if (isNotificationExpression(path)) { + if (LocatorUtil.isNotificationElement(path)) { for (VNotification n : findNotificationsByPath(path)) { elements.add(n.getElement()); @@ -579,11 +553,19 @@ public class VaadinFinderLocatorStrategy implements LocatorStrategy { ComponentConnector parent, String pathFragment, boolean collectRecursively) { ArrayList potentialMatches = new ArrayList(); + String widgetName = getWidgetName(pathFragment); + // Special case when searching for UIElement. + if (LocatorUtil.isUIElement(pathFragment)) { + if (connectorMatchesPathFragment(parent, widgetName)) { + potentialMatches.add(parent); + } + } if (parent instanceof HasComponentsConnector) { + List children = ((HasComponentsConnector) parent) .getChildComponents(); for (ComponentConnector child : children) { - String widgetName = getWidgetName(pathFragment); + if (connectorMatchesPathFragment(child, widgetName)) { potentialMatches.add(child); } diff --git a/client/tests/src/com/vaadin/client/LocatorUtilTest.java b/client/tests/src/com/vaadin/client/LocatorUtilTest.java new file mode 100644 index 0000000000..15536ac6fc --- /dev/null +++ b/client/tests/src/com/vaadin/client/LocatorUtilTest.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.client; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.vaadin.client.componentlocator.LocatorUtil; + +/* + * Test LocatorUtil.isUIElement() & isNotificaitonElement methods + */ +public class LocatorUtilTest extends TestCase { + + public void testIsUI1() { + boolean isUI = LocatorUtil.isUIElement("com.vaadin.ui.UI"); + Assert.assertTrue(isUI); + } + + public void testIsUI2() { + boolean isUI = LocatorUtil.isUIElement("/com.vaadin.ui.UI"); + Assert.assertTrue(isUI); + } + + public void testIsUI3() { + boolean isUI = LocatorUtil + .isUIElement("//com.vaadin.ui.UI[RandomString"); + Assert.assertTrue(isUI); + } + + public void testIsUI4() { + boolean isUI = LocatorUtil.isUIElement("//com.vaadin.ui.UI[0]"); + Assert.assertTrue(isUI); + } + + public void testIsNotification1() { + boolean isUI = LocatorUtil + .isNotificationElement("com.vaadin.ui.VNotification"); + Assert.assertTrue(isUI); + } + + public void testIsNotification2() { + boolean isUI = LocatorUtil + .isNotificationElement("com.vaadin.ui.Notification"); + Assert.assertTrue(isUI); + } + + public void testIsNotification3() { + boolean isUI = LocatorUtil + .isNotificationElement("/com.vaadin.ui.VNotification["); + Assert.assertTrue(isUI); + } + + public void testIsNotification4() { + boolean isUI = LocatorUtil + .isNotificationElement("//com.vaadin.ui.VNotification[0]"); + Assert.assertTrue(isUI); + } +} diff --git a/uitest/src/com/vaadin/tests/components/ui/VaadinFinderLocatorUISearchTest.java b/uitest/src/com/vaadin/tests/components/ui/VaadinFinderLocatorUISearchTest.java new file mode 100644 index 0000000000..37766dd060 --- /dev/null +++ b/uitest/src/com/vaadin/tests/components/ui/VaadinFinderLocatorUISearchTest.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.ui; + +import org.junit.Assert; +import org.junit.Test; + +import com.vaadin.testbench.elements.UIElement; +import com.vaadin.tests.components.button.ButtonClick; +import com.vaadin.tests.tb3.MultiBrowserTest; + +/** + * + * @since + * @author Vaadin Ltd + */ +public class VaadinFinderLocatorUISearchTest extends MultiBrowserTest { + + @Override + protected Class getUIClass() { + return ButtonClick.class; + } + + @Test + public void getUIElementTest() { + openTestURL(); + UIElement ui = $(UIElement.class).first(); + Assert.assertNotNull("Couldn't find the UI Element on the page", ui); + } +} -- 2.39.5