From 67de8dbfa43b2ceae6cbb720a816f942f7384d43 Mon Sep 17 00:00:00 2001 From: Manolo Carrasco Date: Wed, 2 Jun 2010 10:19:12 +0000 Subject: [PATCH] fixed an issue when using pseudos selector in Css2Xpath engine --- .../client/impl/SelectorEngineCssToXPath.java | 27 +++++++------------ .../gwt/query/client/GQuerySelectorsTest.java | 9 ++++--- .../client/impl/SelectorEnginesTest.java | 3 +++ .../query/rebind/SelectorGeneratorsTest.java | 3 +++ 4 files changed, 21 insertions(+), 21 deletions(-) diff --git a/gwtquery-core/src/main/java/com/google/gwt/query/client/impl/SelectorEngineCssToXPath.java b/gwtquery-core/src/main/java/com/google/gwt/query/client/impl/SelectorEngineCssToXPath.java index c3c72a74..cd6c506c 100644 --- a/gwtquery-core/src/main/java/com/google/gwt/query/client/impl/SelectorEngineCssToXPath.java +++ b/gwtquery-core/src/main/java/com/google/gwt/query/client/impl/SelectorEngineCssToXPath.java @@ -60,18 +60,6 @@ public class SelectorEngineCssToXPath extends SelectorEngineImpl { } }; - private static ReplaceCallback rc_Attr = new ReplaceCallback() { - public String foundMatch(ArrayList s) { - if (s.get(1) == null || s.get(1).length() == 0) { - s.set(1, "*"); - } - if (s.get(3) == null || s.get(3).length() == 0) { - s.set(3, ""); - } - return s.get(1) + "[@" + s.get(2) + s.get(3) + "]"; - } - }; - private static ReplaceCallback rc_nth_child = new ReplaceCallback() { public String foundMatch(ArrayList s) { if (s.get(1) == null || s.get(1).length() == 0) { @@ -94,8 +82,8 @@ public class SelectorEngineCssToXPath extends SelectorEngineImpl { }; private static Object[] regs = new Object[]{ - // tag[attrib=value] - "([a-zA-Z0-9_\\-\\*\\[\\]])?\\[([^\\]@~\\$\\*\\^\\|\\!]+)(=[^\\]]+)?\\]", rc_Attr, + // add @ for attrib + "\\[([^@\\]~\\$\\*\\^\\|\\!]+)(=[^\\]]+)?\\]", "[@$1$2]", // multiple queries "\\s*,\\s*", "|", // , + ~ > @@ -111,7 +99,7 @@ public class SelectorEngineCssToXPath extends SelectorEngineImpl { "([\\>\\+\\|\\~\\,\\s])([a-zA-Z\\*]+)", "$1//$2", "\\s+//", "//", // :first-child - "([a-zA-Z0-9_\\-\\*]+):first-child", "$1[not(preceding-sibling::*)]", + "([a-zA-Z0-9_\\-\\*]+):first-child", "*[1]/self::$1", // :last-child "([a-zA-Z0-9_\\-\\*]+):last-child", "$1[not(following-sibling::*)]", // :only-child @@ -139,8 +127,13 @@ public class SelectorEngineCssToXPath extends SelectorEngineImpl { "\\.([a-zA-Z0-9_\\-]+)", "[contains(concat(' ',normalize-space(@class),' '),' $1 ')]", // normalize multiple filters "\\]\\[([^\\]]+)", " and ($1)", - // tag:attrib - "([a-zA-Z0-9_\\-\\*]+):([a-zA-Z0-9_\\-]+)", "$1[@$2='$2']" + // tag:pseudo + ":enabled", "[not(@disabled)]", + ":checked", "[@checked='checked']", + ":(disabled)", "[@$1]", + // put '*' when tag is omitted + "^\\[", "*[", + "\\|\\[", "|*[" }; public static SelectorEngineCssToXPath getInstance() { diff --git a/gwtquery-core/src/test/java/com/google/gwt/query/client/GQuerySelectorsTest.java b/gwtquery-core/src/test/java/com/google/gwt/query/client/GQuerySelectorsTest.java index 4b730e7c..d793780b 100644 --- a/gwtquery-core/src/test/java/com/google/gwt/query/client/GQuerySelectorsTest.java +++ b/gwtquery-core/src/test/java/com/google/gwt/query/client/GQuerySelectorsTest.java @@ -208,14 +208,17 @@ public class GQuerySelectorsTest extends GWTTestCase { } public void testIssue12() { - $(e).html("

1

2
"); + $(e).html("

1

2
"); + executeSelectInAllImplementations(":checked", e, 1); + executeSelectInAllImplementations(":disabled", e, 1); + executeSelectInAllImplementations("input:enabled", e, 1); executeSelectInAllImplementations("[myCustomAttr]", e, 2); executeSelectInAllImplementations("*[myCustomAttr]", e, 2); executeSelectInAllImplementations("input[name=wantedName]", e, 1); executeSelectInAllImplementations("input[name='wantedName']", e, 1); executeSelectInAllImplementations("input[name=\"wantedName\"]", e, 1); } - + public void testSelectElementsInsideContext() { $(e).html("

s

"); GQuery q = $("spam", e); @@ -343,8 +346,6 @@ public class GQuerySelectorsTest extends GWTTestCase { assertArrayContains(selEng.select("body div", Document.get()).getLength(), 53, 55); assertArrayContains(selEng.select("h1[id]:contains(Selectors)", e).getLength(), 1); - // :first is not a valid selector, it only works in sizzle - assertArrayContains(selEng.select("*:first", e).getLength(), 1, 0); assertArrayContains(selEng.select("div[class!=madeup]", e).getLength(), 52, 53); assertArrayContains(selEng.select("div, p a", e).getLength(), 136, 137, 138); assertArrayContains(selEng.select("p:contains(selectors)", e).getLength(), 54, 55); diff --git a/gwtquery-core/src/test/java/com/google/gwt/query/client/impl/SelectorEnginesTest.java b/gwtquery-core/src/test/java/com/google/gwt/query/client/impl/SelectorEnginesTest.java index 1f4f3e27..804689c1 100644 --- a/gwtquery-core/src/test/java/com/google/gwt/query/client/impl/SelectorEnginesTest.java +++ b/gwtquery-core/src/test/java/com/google/gwt/query/client/impl/SelectorEnginesTest.java @@ -58,6 +58,9 @@ public class SelectorEnginesTest extends GWTTestCase { assertEquals(".//a[@href and (@lang) and (@class)]", sel.css2Xpath("a[href][lang][class]")); + assertEquals(".//*[@checked='checked']|*[not(@disabled)]|*[@disabled]", + sel.css2Xpath(":checked, :enabled, :disabled")); + } diff --git a/gwtquery-core/src/test/java/com/google/gwt/query/rebind/SelectorGeneratorsTest.java b/gwtquery-core/src/test/java/com/google/gwt/query/rebind/SelectorGeneratorsTest.java index 1ace9d52..36dbf141 100644 --- a/gwtquery-core/src/test/java/com/google/gwt/query/rebind/SelectorGeneratorsTest.java +++ b/gwtquery-core/src/test/java/com/google/gwt/query/rebind/SelectorGeneratorsTest.java @@ -67,6 +67,9 @@ public class SelectorGeneratorsTest extends GWTTestCase { assertEquals(".//a[@href and (@lang) and (@class)]", sel.css2Xpath("a[href][lang][class]")); + assertEquals(".//*[@checked='checked']|*[not(@disabled)]|*[@disabled]", + sel.css2Xpath(":checked, :enabled, :disabled")); + } public void testReplaceAll() { -- 2.39.5