]> source.dussan.org Git - gwtquery.git/commitdiff
fixes an issue with adding quotes to attribute values in selectors, issue12
authorManolo Carrasco <manolo@apache.org>
Fri, 28 May 2010 09:16:15 +0000 (09:16 +0000)
committerManolo Carrasco <manolo@apache.org>
Fri, 28 May 2010 09:16:15 +0000 (09:16 +0000)
gwtquery-core/src/main/java/com/google/gwt/query/client/impl/SelectorEngineJS.java
gwtquery-core/src/main/java/com/google/gwt/query/client/impl/SelectorEngineXPath.java
gwtquery-core/src/test/java/com/google/gwt/query/client/GQuerySelectorsTest.java

index a0788fbaf3c50eae5c87e78d03b47100c5b03b15..0b07abc5d29dee200e36a03ff095ea091330df2a 100644 (file)
@@ -170,7 +170,7 @@ public class SelectorEngineJS extends SelectorEngineImpl {
     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
@@ -304,7 +304,7 @@ public class SelectorEngineJS extends SelectorEngineImpl {
             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
index 99cf50ef44de11d8c89959c70789a74013eec2d1..45b52f2bbde5d388c4f09a3c426150a243ff47ba 100644 (file)
@@ -155,7 +155,7 @@ public class SelectorEngineXPath extends SelectorEngineImpl {
   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
@@ -239,7 +239,7 @@ public class SelectorEngineXPath extends SelectorEngineImpl {
 \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
index 1c16237cb70081ed767cccd1d115de694aab0883..17182d0c0e6400fce71ebd24fcc2b967cd93d2d6 100644 (file)
@@ -25,6 +25,7 @@ import com.google.gwt.dom.client.NodeList;
 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;
@@ -155,7 +156,7 @@ public class GQuerySelectorsTest extends GWTTestCase {
     }
   }
 
-  public void testAllSelectors() {
+  public void testCompiledSelectors() {
     final AllSelectors sel = GWT.create(AllSelectors.class);
     $(e).html(getTestContent());
 
@@ -204,6 +205,15 @@ public class GQuerySelectorsTest extends GWTTestCase {
     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();
@@ -228,7 +238,7 @@ public class GQuerySelectorsTest extends GWTTestCase {
     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>"
@@ -262,6 +272,7 @@ public class GQuerySelectorsTest extends GWTTestCase {
   private void assertArrayContains(Object result, Object... array) {
     assertArrayContains("", result, array);
   }
+  
   private void assertArrayContains(String message, Object result, Object... array) {
     String values = "";
     boolean done = false;
@@ -274,6 +285,23 @@ public class GQuerySelectorsTest extends GWTTestCase {
     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());