]> source.dussan.org Git - gwtquery.git/commitdiff
Accept xpath selectors and pass them to the native engine, it should work in most...
authorManolo Carrasco <manolo@apache.org>
Sat, 7 May 2011 15:07:51 +0000 (15:07 +0000)
committerManolo Carrasco <manolo@apache.org>
Sat, 7 May 2011 15:07:51 +0000 (15:07 +0000)
gwtquery-core/src/main/java/com/google/gwt/query/client/GQuery.java
gwtquery-core/src/main/java/com/google/gwt/query/client/impl/SelectorEngine.java
gwtquery-core/src/main/java/com/google/gwt/query/client/impl/SelectorEngineCssToXPath.java
gwtquery-core/src/test/java/com/google/gwt/query/client/GQueryCoreTest.java

index 414022bc96815185346c7f80cd8be761b4dba84b..8b5309bdfdcee5e5f067e89888becf4a33c9b7a8 100644 (file)
@@ -18,6 +18,7 @@ package com.google.gwt.query.client;
 import java.util.ArrayList;\r
 import java.util.Arrays;\r
 import java.util.List;\r
+import java.util.Map;\r
 \r
 import com.google.gwt.core.client.GWT;\r
 import com.google.gwt.core.client.JavaScriptObject;\r
@@ -40,7 +41,9 @@ import com.google.gwt.query.client.css.HasCssValue;
 import com.google.gwt.query.client.css.TakesCssValue;\r
 import com.google.gwt.query.client.css.TakesCssValue.CssSetter;\r
 import com.google.gwt.query.client.impl.DocumentStyleImpl;\r
+import com.google.gwt.query.client.impl.HasSelector;\r
 import com.google.gwt.query.client.impl.SelectorEngine;\r
+import com.google.gwt.query.client.impl.SelectorEngineCssToXPath;\r
 import com.google.gwt.query.client.js.JsCache;\r
 import com.google.gwt.query.client.js.JsMap;\r
 import com.google.gwt.query.client.js.JsNamedArray;\r
@@ -117,6 +120,8 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
   protected static JsCache dataCache = null;\r
 \r
   private static SelectorEngine engine;\r
+  \r
+  private static HasSelector xpahtEngine;\r
 \r
   private static final int FUNC_PREPEND = 0, FUNC_APPEND = 1, FUNC_AFTER = 2,\r
       FUNC_BEFORE = 3;\r
@@ -191,12 +196,6 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    * element containing those elements.\r
    */\r
   public static GQuery $(String selectorOrHtml) {\r
-    if (selectorOrHtml == null || selectorOrHtml.trim().length() == 0) {\r
-      return $();\r
-    }\r
-    if (selectorOrHtml.trim().charAt(0) == '<') {\r
-      return innerHtml(selectorOrHtml);\r
-    }\r
     return $(selectorOrHtml, document);\r
   }\r
 \r
@@ -218,11 +217,12 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    * created.\r
    */\r
   public static GQuery $(String selectorOrHtml, Node ctx) {\r
-    if (selectorOrHtml == null || selectorOrHtml.trim().length() == 0) {\r
+    String selector = null;\r
+    if (selectorOrHtml == null || (selector = selectorOrHtml.trim()).length() == 0) {\r
       return $();\r
     }\r
-    if (selectorOrHtml.trim().charAt(0) == '<') {\r
-      return $(cleanHtmlString(selectorOrHtml, getOwnerDocument(ctx)));\r
+    if (selector.startsWith("<")) {\r
+      return innerHtml(selectorOrHtml, getOwnerDocument(ctx));\r
     }\r
     return new GQuery().select(selectorOrHtml, ctx);\r
   }\r
@@ -433,8 +433,8 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
     return e.getClassName().matches("(^|.*\\s)" + clz + "(\\s.*|$)");\r
   }\r
 \r
-  private static GQuery innerHtml(String html) {\r
-    return $(cleanHtmlString(html, document));\r
+  private static GQuery innerHtml(String html, Document doc) {\r
+    return $(cleanHtmlString(html, doc));\r
   }\r
 \r
   private static native String[] jsArrayToString0(JsArrayString array) /*-{\r
@@ -454,14 +454,20 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
     if (engine == null) {\r
       engine = new SelectorEngine();\r
     }\r
-    NodeList<Element> n = engine.select(selector, context);\r
+    HasSelector impl = engine;\r
+    if (selector.startsWith("./") || selector.startsWith("/")) {\r
+      if (xpahtEngine == null) {\r
+        impl = xpahtEngine =  engine.impl instanceof SelectorEngineCssToXPath ? \r
+            engine.impl : new SelectorEngineCssToXPath();\r
+      }\r
+    }\r
+    NodeList<Element> n = impl.select(selector, context);\r
     JsNodeArray res = copyNodeList(n);\r
 \r
     currentSelector = selector;\r
     currentContext = context != null ? context : document;\r
 \r
     return setArray(res);\r
-\r
   }\r
 \r
   private static native Element window() /*-{\r
index ddf66974a5bebec0c0b936a22fe8d933de06b55f..4f6a7e48ae311d7463f9a4183f6451bdaec7bfb4 100644 (file)
@@ -25,7 +25,7 @@ import com.google.gwt.query.client.js.JsNodeArray;
 /**\r
  * Core Selector engine functions, and native JS utility functions.\r
  */\r
-public class SelectorEngine {\r
+public class SelectorEngine implements HasSelector {\r
 \r
   public static native NodeList<Element> getElementsByClassName(String clazz,\r
       Node ctx) /*-{\r
@@ -72,7 +72,7 @@ public class SelectorEngine {
       return r;\r
   }-*/;\r
 \r
-  protected SelectorEngineImpl impl;\r
+  public final SelectorEngineImpl impl;\r
 \r
   protected Node root = Document.get();\r
   \r
index fc80085c1e70905ad44e8d20aa421d1cb4d5e331..32e4965b033788be155da2cb629fe37dca31476d 100644 (file)
@@ -212,7 +212,14 @@ public class SelectorEngineCssToXPath extends SelectorEngineImpl {
       xsel =  sel.startsWith("./") || sel.startsWith("/") ? sel : css2Xpath(sel);\r
       cache.put(sel, xsel);\r
     }\r
-    SelectorEngine.xpathEvaluate(xsel, ctx, elm);\r
+    try {\r
+      SelectorEngine.xpathEvaluate(xsel, ctx, elm);\r
+    } catch (Exception e) {\r
+      if (sel.startsWith("./") || sel.startsWith("/")) {\r
+        System.err.println("ERROR: xpathEvaluate: " + sel + " xpath: " + xsel + \r
+            "\nIf the syntax of your css selector is correct, report the error to gquery team.\n\n" + e.getMessage());\r
+      }\r
+    }\r
     return JsUtils.unique(elm.<JsArray<Element>> cast()).cast();\r
   }\r
   \r
index f1d7790d907ef30da8f2319c1b2d5303152f0563..4d49e44dcd33a7b5d1157894db1997d0e29eef91 100644 (file)
@@ -20,6 +20,7 @@ import static com.google.gwt.query.client.GQuery.$$;
 import static com.google.gwt.query.client.GQuery.document;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
@@ -35,6 +36,7 @@ import com.google.gwt.event.dom.client.ClickHandler;
 import com.google.gwt.junit.client.GWTTestCase;
 import com.google.gwt.query.client.css.CSS;
 import com.google.gwt.query.client.css.RGBColor;
+import com.google.gwt.query.client.impl.SelectorEngineCssToXPath;
 import com.google.gwt.query.client.impl.SelectorEngineImpl;
 import com.google.gwt.query.client.impl.SelectorEngineSizzle;
 import com.google.gwt.query.client.js.JsNamedArray;
@@ -1520,5 +1522,14 @@ public class GQueryCoreTest extends GWTTestCase {
 
     label.removeFromParent();
   }
+  
+  public void testXpathSelector() {
+    $(e).html("<table border=1 id=idtest width=440><tr><td width=50%>A Text</td><td width=50%>B</td></tr></table>");
+    SelectorEngineCssToXPath s = new SelectorEngineCssToXPath();
+    for (String selector : Arrays.asList("td[width]", "table > td", "*[width!=440]")) {
+      String xselector = s.css2Xpath(selector);
+      assertEquals($(selector).toString(), $(xselector).toString());
+    }
+  }
 
 }