}\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
};\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
"([\\>\\+\\|\\~\\,\\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
"\\.([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
}
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);
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);
assertEquals(".//a[@href and (@lang) and (@class)]",
sel.css2Xpath("a[href][lang][class]"));
+ assertEquals(".//*[@checked='checked']|*[not(@disabled)]|*[@disabled]",
+ sel.css2Xpath(":checked, :enabled, :disabled"));
+
}
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() {