selectorSplitRegExp = new Regexp("[^\\s]+", "g");\r
childOrSiblingRefRegExp = new Regexp("^(>|\\+|~)$");\r
cssSelectorRegExp = new Regexp(\r
- "^(\\w+)?(#[\\w\\u00C0-\\uFFFF\\-\\_]+|(\\*))?((\\.[\\w\\u00C0-\\uFFFF\\-_]+)*)?((\\[\\w+(\\^|\\$|\\*|\\||~)?(=[\\w\\u00C0-\\uFFFF\\s\\-\\_\\.]+)?\\]+)*)?(((:\\w+[\\w\\-]*)(\\((odd|even|\\-?\\d*n?((\\+|\\-)\\d+)?|[\\w\\u00C0-\\uFFFF\\-_]+|((\\w*\\.[\\w\\u00C0-\\uFFFF\\-_]+)*)?|(\\[#?\\w+(\\^|\\$|\\*|\\||~)?=?[\\w\\u00C0-\\uFFFF\\s\\-\\_\\.]+\\]+)|(:\\w+[\\w\\-]*))\\))?)*)?");\r
+ "^(\\w+)?(#[\\w\\u00C0-\\uFFFF\\-\\_]+|(\\*))?((\\.[\\w\\u00C0-\\uFFFF\\-_]+)*)?((\\[\\w+(\\^|\\$|\\*|\\||~)?(=[\"']*[\\w\\u00C0-\\uFFFF\\s\\-\\_\\.]+[\"']*)?\\]+)*)?(((:\\w+[\\w\\-]*)(\\((odd|even|\\-?\\d*n?((\\+|\\-)\\d+)?|[\\w\\u00C0-\\uFFFF\\-_]+|((\\w*\\.[\\w\\u00C0-\\uFFFF\\-_]+)*)?|(\\[#?\\w+(\\^|\\$|\\*|\\||~)?=?[\\w\\u00C0-\\uFFFF\\s\\-\\_\\.]+\\]+)|(:\\w+[\\w\\-]*))\\))?)*)?");\r
}\r
\r
public NodeList<Element> select(String sel, Node ctx) {\r
Regexp[] regExpAttributes = new Regexp[allAttr.size()];\r
String[] regExpAttributesStr = new String[allAttr.size()];\r
Regexp attributeMatchRegExp = new Regexp(\r
- "(\\w+)(\\^|\\$|\\*|\\||~)?=?([\\w\u00C0-\uFFFF\\s\\-_\\.]+)?");\r
+ "(\\w+)(\\^|\\$|\\*|\\||~)?=?[\"']?([\\w\u00C0-\uFFFF\\s\\-_\\.]+)?");\r
for (int q = 0, ql = allAttr.size(); q < ql; q++) {\r
JSArray attributeMatch = attributeMatchRegExp\r
.exec(allAttr.getStr(q));\r
private void init() {\r
if (cssSelectorRegExp == null) {\r
cssSelectorRegExp = new Regexp(\r
- "^(\\w+)?(#[\\w\\u00C0-\\uFFFF\\-\\_]+|(\\*))?((\\.[\\w\\u00C0-\\uFFFF\\-_]+)*)?((\\[\\w+(\\^|\\$|\\*|\\||~)?(=[\\w\\u00C0-\\uFFFF\\s\\-\\_\\.]+)?\\]+)*)?(((:\\w+[\\w\\-]*)(\\((odd|even|\\-?\\d*n?((\\+|\\-)\\d+)?|[\\w\\u00C0-\\uFFFF\\-_]+|((\\w*\\.[\\w\\u00C0-\\uFFFF\\-_]+)*)?|(\\[#?\\w+(\\^|\\$|\\*|\\||~)?=?[\\w\\u00C0-\\uFFFF\\s\\-\\_\\.]+\\]+)|(:\\w+[\\w\\-]*))\\))?)*)?(>|\\+|~)?");\r
+ "^(\\w+)?(#[\\w\\u00C0-\\uFFFF\\-\\_]+|(\\*))?((\\.[\\w\\u00C0-\\uFFFF\\-_]+)*)?((\\[\\w+(\\^|\\$|\\*|\\||~)?(=[\"']*[\\w\\u00C0-\\uFFFF\\s\\-\\_\\.]+[\"']*)?\\]+)*)?(((:\\w+[\\w\\-]*)(\\((odd|even|\\-?\\d*n?((\\+|\\-)\\d+)?|[\\w\\u00C0-\\uFFFF\\-_]+|((\\w*\\.[\\w\\u00C0-\\uFFFF\\-_]+)*)?|(\\[#?\\w+(\\^|\\$|\\*|\\||~)?=?[\\w\\u00C0-\\uFFFF\\s\\-\\_\\.]+\\]+)|(:\\w+[\\w\\-]*))\\))?)*)?(>|\\+|~)?");\r
selectorSplitRegExp = new Regexp("[^\\s]+", "g");\r
combinator = new Regexp("(>|\\+|~)");\r
}\r
\r
private native String replaceAttr(String allAttr) /*-{\r
if(!allAttr) return "";\r
- return allAttr.replace(/(\w+)(\^|\$|\*|\||~)?=?([\w\u00C0-\uFFFF\s\-_\.]+)?/g, \r
+ return allAttr.replace(/["']+/g,'').replace(/(\w+)(\^|\$|\*|\||~)?=?([\w\u00C0-\uFFFF\s\-_\.]+)?/g, \r
function(a,b,c,d) {\r
return @com.google.gwt.query.client.impl.SelectorEngineXPath::attrToXPath(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)(a,b || "",c || "",d || "");\r
});\r
import com.google.gwt.junit.client.GWTTestCase;
import com.google.gwt.query.client.impl.SelectorEngineImpl;
import com.google.gwt.query.client.impl.SelectorEngineJS;
+import com.google.gwt.query.client.impl.SelectorEngineNative;
import com.google.gwt.query.client.impl.SelectorEngineSizzle;
import com.google.gwt.query.client.impl.SelectorEngineXPath;
import com.google.gwt.user.client.ui.HTML;
}
}
- public void testAllSelectors() {
+ public void testCompiledSelectors() {
final AllSelectors sel = GWT.create(AllSelectors.class);
$(e).html(getTestContent());
assertArrayContains(sel.ulTocLiTocLine2().getLength(), 12);
}
+ 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>");
+ executeSelectInAllImplementations("[myCustomAttr]", 2);
+ executeSelectInAllImplementations("*[myCustomAttr]", 2);
+ executeSelectInAllImplementations("input[name=wantedName]", 1);
+ executeSelectInAllImplementations("input[name='wantedName']", 1);
+ executeSelectInAllImplementations("input[name=\"wantedName\"]", 1);
+ }
+
public void testSelectorEngineDomAssistant() {
// This test runs very slow in chrome
SelectorEngineImpl selEng = new SelectorEngineJS();
TestSelectors selectors = GWT.create(TestSelectors.class);
assertEquals(1, selectors.allChecked().size());
}
-
+
public void testSelectorsWithContext() {
$(e).append(
"<div class='branchA'><div class='target'>branchA target</div></div>"
private void assertArrayContains(Object result, Object... array) {
assertArrayContains("", result, array);
}
+
private void assertArrayContains(String message, Object result, Object... array) {
String values = "";
boolean done = false;
message = message + ", value (" + result + ") not found in: " + values;
assertTrue(message, done);
}
+
+ private void executeSelectInAllImplementations(String selector, int result) {
+ SelectorEngineImpl selSizz = new SelectorEngineSizzle();
+ SelectorEngineImpl selJS = new SelectorEngineJS();
+ SelectorEngineImpl selXpath = new SelectorEngineXPath();
+ SelectorEngineImpl selNative = new SelectorEngineNative();
+ assertEquals(result, selSizz.select(selector, e).getLength());
+ assertEquals(result, selJS.select(selector, e).getLength());
+ assertEquals(result, selXpath.select(selector, e).getLength());
+ if (hasNativeSelector()) {
+ assertEquals(result, selNative.select(selector, e).getLength());
+ }
+ }
+
+ private static native boolean hasNativeSelector() /*-{
+ return !!(document.querySelectorAll && /native/.test(String(document.querySelectorAll)));
+ }-*/;
private void executeSelectorEngineTests(SelectorEngineImpl selEng) {
$(e).html(getTestContent());