]> source.dussan.org Git - gwtquery.git/commitdiff
fixed an issue when using pseudos selector in Css2Xpath engine
authorManolo Carrasco <manolo@apache.org>
Wed, 2 Jun 2010 10:19:12 +0000 (10:19 +0000)
committerManolo Carrasco <manolo@apache.org>
Wed, 2 Jun 2010 10:19:12 +0000 (10:19 +0000)
gwtquery-core/src/main/java/com/google/gwt/query/client/impl/SelectorEngineCssToXPath.java
gwtquery-core/src/test/java/com/google/gwt/query/client/GQuerySelectorsTest.java
gwtquery-core/src/test/java/com/google/gwt/query/client/impl/SelectorEnginesTest.java
gwtquery-core/src/test/java/com/google/gwt/query/rebind/SelectorGeneratorsTest.java

index c3c72a74150d6b01977f259fde8cfd74c12b7443..cd6c506c5c1dbf5518b20b03d85e19a68bc5c365 100644 (file)
@@ -60,18 +60,6 @@ public class SelectorEngineCssToXPath extends SelectorEngineImpl {
     }\r
   };\r
   \r
-  private static ReplaceCallback rc_Attr = new ReplaceCallback() {\r
-    public String foundMatch(ArrayList<String> s) {\r
-      if (s.get(1) == null || s.get(1).length() == 0) {\r
-        s.set(1, "*");\r
-      }\r
-      if (s.get(3) == null || s.get(3).length() == 0) {\r
-        s.set(3, "");\r
-      }\r
-      return s.get(1) + "[@" + s.get(2) + s.get(3) + "]";\r
-    }\r
-  };\r
-  \r
   private static ReplaceCallback rc_nth_child = new ReplaceCallback() {\r
     public String foundMatch(ArrayList<String> s) {\r
       if (s.get(1) == null || s.get(1).length() == 0) {\r
@@ -94,8 +82,8 @@ public class SelectorEngineCssToXPath extends SelectorEngineImpl {
   };\r
 \r
   private static Object[] regs = new Object[]{\r
-    // tag[attrib=value]\r
-    "([a-zA-Z0-9_\\-\\*\\[\\]])?\\[([^\\]@~\\$\\*\\^\\|\\!]+)(=[^\\]]+)?\\]", rc_Attr,\r
+    // add @ for attrib\r
+    "\\[([^@\\]~\\$\\*\\^\\|\\!]+)(=[^\\]]+)?\\]", "[@$1$2]",\r
     // multiple queries\r
     "\\s*,\\s*", "|",\r
     // , + ~ >\r
@@ -111,7 +99,7 @@ public class SelectorEngineCssToXPath extends SelectorEngineImpl {
     "([\\>\\+\\|\\~\\,\\s])([a-zA-Z\\*]+)", "$1//$2",\r
     "\\s+//", "//",\r
     // :first-child\r
-    "([a-zA-Z0-9_\\-\\*]+):first-child", "$1[not(preceding-sibling::*)]",\r
+    "([a-zA-Z0-9_\\-\\*]+):first-child", "*[1]/self::$1",\r
     // :last-child\r
     "([a-zA-Z0-9_\\-\\*]+):last-child", "$1[not(following-sibling::*)]",\r
     // :only-child\r
@@ -139,8 +127,13 @@ public class SelectorEngineCssToXPath extends SelectorEngineImpl {
     "\\.([a-zA-Z0-9_\\-]+)", "[contains(concat(' ',normalize-space(@class),' '),' $1 ')]",\r
     // normalize multiple filters\r
     "\\]\\[([^\\]]+)", " and ($1)",\r
-    // tag:attrib\r
-    "([a-zA-Z0-9_\\-\\*]+):([a-zA-Z0-9_\\-]+)", "$1[@$2='$2']"\r
+    // tag:pseudo\r
+    ":enabled", "[not(@disabled)]",\r
+    ":checked", "[@checked='checked']",\r
+    ":(disabled)", "[@$1]",\r
+    // put '*' when tag is omitted\r
+    "^\\[", "*[",\r
+    "\\|\\[", "|*["\r
     };\r
   \r
   public static SelectorEngineCssToXPath getInstance() {\r
index 4b730e7c22b9a0a5a784a4a03dd88062ee8fc076..d793780beea7f7b744648ef1c9bf357024ff9168 100644 (file)
@@ -208,14 +208,17 @@ public class GQuerySelectorsTest extends GWTTestCase {
   }
 
   public void testIssue12() {
-    $(e).html("<table><tr><td><p myCustomAttr='whatever'><input type='radio' name='wantedName' value='v1'>1</input></p><input type='radio' name='n' value='v2' checked='checked'>2</input></td><td><button myCustomAttr='val'>Click</button></tr><td></table>");
+    $(e).html("<table><tr><td><p myCustomAttr='whatever'><input disabled='disabled' type='radio' name='wantedName' value='v1'>1</input></p><input type='radio' name='n' value='v2' checked='checked'>2</input></td><td><button myCustomAttr='val'>Click</button></tr><td></table>");
+    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("<spam><p>s</p></spam>");
     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);
index 1f4f3e2783a98280a0fcb7a5208157b0c2b70c7f..804689c14b143b0f1176b28838d9830194e0a056 100644 (file)
@@ -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"));    
+    
   }
 
 
index 1ace9d523bfa882a7a1f057026440c638be32fc4..36dbf14173761bb1a9ae0678ed6d20684c032462 100644 (file)
@@ -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() {