]> source.dussan.org Git - gwtquery.git/commitdiff
native engine uses xpath selector for css selectors not supported by the native css...
authorManolo Carrasco <manolo@apache.org>
Wed, 2 Jun 2010 14:12:36 +0000 (14:12 +0000)
committerManolo Carrasco <manolo@apache.org>
Wed, 2 Jun 2010 14:12:36 +0000 (14:12 +0000)
gwtquery-core/src/main/java/com/google/gwt/query/client/SelectorEngine.java
gwtquery-core/src/main/java/com/google/gwt/query/client/impl/SelectorEngineNative.java
gwtquery-core/src/main/java/com/google/gwt/query/rebind/SelectorGeneratorNative.java
gwtquery-core/src/test/java/com/google/gwt/query/client/GQuerySelectorsTest.java

index acf2437f579719c12efae33c0b7495cb0115456f..367cd88792ee740c6b2183bc82609e7c9d5e09ef 100644 (file)
@@ -49,10 +49,6 @@ public class SelectorEngine {
        return s1 || s2;\r
     }-*/;\r
 \r
-  public static native NodeList<Element> querySelectorAll(String selector) /*-{\r
-      return $doc.querySelectorAll(selector);\r
-  }-*/;\r
-\r
   public static native NodeList<Element> querySelectorAll(String selector,\r
       Node ctx) /*-{\r
       return ctx.querySelectorAll(selector);\r
index 236a6b33885d6705a0140f299ef8afed99aa73ef..477e42870146624df9dca3ce20530349e0daed63 100644 (file)
@@ -24,9 +24,15 @@ import com.google.gwt.query.client.SelectorEngine;
  * 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);
+    }
   }
 }
index 4955cbb9656cae47cb16d189c31a6cc34a2513f6..7efaee11a4bcfd4fc110a691ab29b5503d154854 100644 (file)
@@ -19,32 +19,34 @@ import com.google.gwt.core.ext.TreeLogger;
 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
index d793780beea7f7b744648ef1c9bf357024ff9168..33bc316b8c9814a42f9ffc925445d960e40e47bc 100644 (file)
@@ -237,6 +237,13 @@ public class GQuerySelectorsTest extends GWTTestCase {
     executeSelectorEngineTests(selEng);
   }
 
+  public void testSelectorEngineNative() {
+    SelectorEngineImpl selEng = new SelectorEngineNative();
+    if (hasNativeSelector()) {
+      executeSelectorEngineTests(selEng);
+    }
+  }
+
   public void testSelectorEngineXpath() {
     SelectorEngineImpl selEng = new SelectorEngineXPath();
     executeSelectorEngineTests(selEng);
@@ -328,11 +335,12 @@ public class GQuerySelectorsTest extends GWTTestCase {
     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() /*-{
@@ -352,7 +360,7 @@ public class GQuerySelectorsTest extends GWTTestCase {
     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);