* Runtime selector engine implementation for browsers with native
* querySelectorAll support.
*/
-public class SelectorEngineNative extends SelectorEngineImpl {
-
+public class SelectorEngineNative extends SelectorEngineCssToXPath {
+
+ public static String NATIVE_EXCEPTIONS_REGEXP = ".*(:contains|!=).*";
+
public NodeList<Element> select(String selector, Node ctx) {
- return SelectorEngine.querySelectorAll(selector, ctx);
+ if (selector.matches(NATIVE_EXCEPTIONS_REGEXP)) {
+ return super.select(selector, ctx);
+ } else {
+ return SelectorEngine.querySelectorAll(selector, ctx);
+ }
}
}
import com.google.gwt.core.ext.UnableToCompleteException;\r
import com.google.gwt.core.ext.typeinfo.JMethod;\r
import com.google.gwt.query.client.Selector;\r
+import com.google.gwt.query.client.impl.SelectorEngineNative;\r
import com.google.gwt.user.rebind.SourceWriter;\r
\r
/**\r
* Compile time selector generator which delegates to native browser methods.\r
*/\r
-public class SelectorGeneratorNative extends SelectorGeneratorBase {\r
-\r
- protected String getImplSuffix() {\r
- return "Native" + super.getImplSuffix();\r
- }\r
+public class SelectorGeneratorNative extends SelectorGeneratorCssToXPath {\r
\r
@Override\r
- protected boolean hasGetElementsByClassName() {\r
- return true;\r
- }\r
-\r
protected void generateMethodBody(SourceWriter sw, JMethod method,\r
TreeLogger treeLogger, boolean hasContext)\r
throws UnableToCompleteException {\r
String selector = method.getAnnotation(Selector.class).value();\r
- if (!hasContext) {\r
- sw.println("return "\r
- + wrap(method, "querySelectorAll(\"" + selector + "\")") + ";");\r
+ if (selector.matches(SelectorEngineNative.NATIVE_EXCEPTIONS_REGEXP)) {\r
+ super.generateMethodBody(sw, method, treeLogger, hasContext);\r
} else {\r
sw.println("return "\r
+ wrap(method, "querySelectorAll(\"" + selector + "\", root)") + ";");\r
}\r
}\r
+\r
+ @Override\r
+ protected String getImplSuffix() {\r
+ return "Native" + super.getImplSuffix();\r
+ }\r
+\r
+ @Override\r
+ protected boolean hasGetElementsByClassName() {\r
+ return true;\r
+ }\r
}
\ No newline at end of file
executeSelectorEngineTests(selEng);
}
+ public void testSelectorEngineNative() {
+ SelectorEngineImpl selEng = new SelectorEngineNative();
+ if (hasNativeSelector()) {
+ executeSelectorEngineTests(selEng);
+ }
+ }
+
public void testSelectorEngineXpath() {
SelectorEngineImpl selEng = new SelectorEngineXPath();
executeSelectorEngineTests(selEng);
SelectorEngineImpl selNative = new SelectorEngineNative();
assertArrayContains(selector, selSizz.select(selector, elem).getLength(), array);
assertArrayContains(selector, selJS.select(selector, elem).getLength(), array);
+ if (hasNativeSelector()) {
+ assertArrayContains(selector, selNative.select(selector, elem).getLength(), array);
+ }
assertArrayContains(selector, selXpath.select(selector, elem).getLength(), array);
assertArrayContains(selector, selC2X.select(selector, elem).getLength(), array);
- if (hasNativeSelector()) {
- assertArrayContains(selector, selNative.select(selector, elem), array);
- }
+
}
private static native boolean hasNativeSelector() /*-{
assertArrayContains(selEng.select("a[href][lang][class]", e).getLength(), 1);
assertArrayContains(selEng.select("*:checked", e).getLength(), 1);
assertArrayContains(selEng.select("div .example", e).getLength(), 43);
- assertArrayContains(selEng.select("div > div", e).getLength(), 51);
+ assertArrayContains(selEng.select("div > div", e).getLength(), 51, 52);
assertArrayContains(selEng.select("div:not(.example)", e).getLength(), 9, 10);
assertArrayContains(selEng.select("div p", e).getLength(), 324);
assertArrayContains(selEng.select("div p a", e).getLength(), 85, 84);