From: Manolo Carrasco Date: Fri, 28 May 2010 09:16:15 +0000 (+0000) Subject: fixes an issue with adding quotes to attribute values in selectors, issue12 X-Git-Tag: release-1.3.2~715 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=0fc5a1a4ea16d2e954b052784f72902e4fb1fc33;p=gwtquery.git fixes an issue with adding quotes to attribute values in selectors, issue12 --- diff --git a/gwtquery-core/src/main/java/com/google/gwt/query/client/impl/SelectorEngineJS.java b/gwtquery-core/src/main/java/com/google/gwt/query/client/impl/SelectorEngineJS.java index a0788fba..0b07abc5 100644 --- a/gwtquery-core/src/main/java/com/google/gwt/query/client/impl/SelectorEngineJS.java +++ b/gwtquery-core/src/main/java/com/google/gwt/query/client/impl/SelectorEngineJS.java @@ -170,7 +170,7 @@ public class SelectorEngineJS extends SelectorEngineImpl { selectorSplitRegExp = new Regexp("[^\\s]+", "g"); childOrSiblingRefRegExp = new Regexp("^(>|\\+|~)$"); cssSelectorRegExp = new Regexp( - "^(\\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\\-]*))\\))?)*)?"); + "^(\\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\\-]*))\\))?)*)?"); } public NodeList select(String sel, Node ctx) { @@ -304,7 +304,7 @@ public class SelectorEngineJS extends SelectorEngineImpl { Regexp[] regExpAttributes = new Regexp[allAttr.size()]; String[] regExpAttributesStr = new String[allAttr.size()]; Regexp attributeMatchRegExp = new Regexp( - "(\\w+)(\\^|\\$|\\*|\\||~)?=?([\\w\u00C0-\uFFFF\\s\\-_\\.]+)?"); + "(\\w+)(\\^|\\$|\\*|\\||~)?=?[\"']?([\\w\u00C0-\uFFFF\\s\\-_\\.]+)?"); for (int q = 0, ql = allAttr.size(); q < ql; q++) { JSArray attributeMatch = attributeMatchRegExp .exec(allAttr.getStr(q)); diff --git a/gwtquery-core/src/main/java/com/google/gwt/query/client/impl/SelectorEngineXPath.java b/gwtquery-core/src/main/java/com/google/gwt/query/client/impl/SelectorEngineXPath.java index 99cf50ef..45b52f2b 100644 --- a/gwtquery-core/src/main/java/com/google/gwt/query/client/impl/SelectorEngineXPath.java +++ b/gwtquery-core/src/main/java/com/google/gwt/query/client/impl/SelectorEngineXPath.java @@ -155,7 +155,7 @@ public class SelectorEngineXPath extends SelectorEngineImpl { private void init() { if (cssSelectorRegExp == null) { cssSelectorRegExp = new Regexp( - "^(\\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\\-]*))\\))?)*)?(>|\\+|~)?"); + "^(\\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\\-]*))\\))?)*)?(>|\\+|~)?"); selectorSplitRegExp = new Regexp("[^\\s]+", "g"); combinator = new Regexp("(>|\\+|~)"); } @@ -239,7 +239,7 @@ public class SelectorEngineXPath extends SelectorEngineImpl { private native String replaceAttr(String allAttr) /*-{ if(!allAttr) return ""; - return allAttr.replace(/(\w+)(\^|\$|\*|\||~)?=?([\w\u00C0-\uFFFF\s\-_\.]+)?/g, + return allAttr.replace(/["']+/g,'').replace(/(\w+)(\^|\$|\*|\||~)?=?([\w\u00C0-\uFFFF\s\-_\.]+)?/g, function(a,b,c,d) { 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 || ""); }); diff --git a/gwtquery-core/src/test/java/com/google/gwt/query/client/GQuerySelectorsTest.java b/gwtquery-core/src/test/java/com/google/gwt/query/client/GQuerySelectorsTest.java index 1c16237c..17182d0c 100644 --- a/gwtquery-core/src/test/java/com/google/gwt/query/client/GQuerySelectorsTest.java +++ b/gwtquery-core/src/test/java/com/google/gwt/query/client/GQuerySelectorsTest.java @@ -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("

1

2
"); + 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( "
branchA target
" @@ -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());