// `qSA` may not throw for unrecognized parts using forgiving parsing:
// https://drafts.csswg.org/selectors/#forgiving-selector
- // like the `:has()` pseudo-class:
- // https://drafts.csswg.org/selectors/#relational
+ // like the `:is()` pseudo-class:
+ // https://drafts.csswg.org/selectors/#matches
// `CSS.supports` is still expected to return `false` then:
// https://drafts.csswg.org/css-conditional-4/#typedef-supports-selector-fn
// https://drafts.csswg.org/css-conditional-4/#dfn-support-selector
if ( support.cssSupportsSelector &&
+ // `CSS.supports( "selector(...)" )` requires the argument to the
+ // `selector` function to be a `<complex-selector>`, not
+ // a `<complex-selector-list>` which our selector may be. Wrapping with
+ // `:is` works around the issue and is supported by all browsers
+ // we support except for IE which will fail the support test anyway.
// eslint-disable-next-line no-undef
- !CSS.supports( "selector(" + newSelector + ")" ) ) {
+ !CSS.supports( "selector(:is(" + newSelector + "))" ) ) {
// Support: IE 9 - 11+
// Throw to get to the same code path as an error directly in qSA.
return document.querySelectorAll( ":scope" );
} );
+ // Support: IE 9 - 11+
+ // IE doesn't support `CSS.supports( "selector(...)" )`; it will throw
+ // in this support test.
+ //
// Support: Chrome 105+, Firefox <106, Safari 15.4+
// Make sure forgiving mode is not used in `CSS.supports( "selector(...)" )`.
//
// `:has()` uses a forgiving selector list as an argument so our regular
// `try-catch` mechanism fails to catch `:has()` with arguments not supported
// natively like `:has(:contains("Foo"))`. Where supported & spec-compliant,
- // we now use `CSS.supports("selector(SELECTOR_TO_BE_TESTED)")` but outside
- // that, let's mark `:has` as buggy to always use jQuery traversal for
- // `:has()`.
+ // we now use `CSS.supports("selector(:is(SELECTOR_TO_BE_TESTED))")`, but
+ // outside that we mark `:has` as buggy.
rbuggyQSA.push( ":has" );
}
} );
QUnit.test( "comma-separated", function( assert ) {
- assert.expect( 4 );
+ assert.expect( 10 );
var fixture = jQuery( "<div><h2><span></span></h2><div><p><span></span></p><p></p></div></div>" );
assert.equal( fixture.find( "h2, div p" ).filter( "h2" ).length, 1, "has to find one <h2>" );
assert.equal( fixture.find( "h2 , div p" ).filter( "p" ).length, 2, "has to find two <p>" );
assert.equal( fixture.find( "h2 , div p" ).filter( "h2" ).length, 1, "has to find one <h2>" );
+ assert.equal( fixture.find( "h2 ,div p" ).filter( "p" ).length, 2, "has to find two <p>" );
+ assert.equal( fixture.find( "h2 ,div p" ).filter( "h2" ).length, 1, "has to find one <h2>" );
+ assert.equal( fixture.find( "h2,div p" ).filter( "p" ).length, 2, "has to find two <p>" );
+ assert.equal( fixture.find( "h2,div p" ).filter( "h2" ).length, 1, "has to find one <h2>" );
+ assert.equal( fixture.find( "h2\t,\rdiv p" ).filter( "p" ).length, 2, "has to find two <p>" );
+ assert.equal( fixture.find( "h2\t,\rdiv p" ).filter( "h2" ).length, 1, "has to find one <h2>" );
+} );
+
+QUnit.test( "comma-separated, only supported natively (gh-5177)", function( assert ) {
+ assert.expect( 5 );
+
+ var fixture = jQuery( "<div><input/><span></span></div>" );
+
+ fixture.appendTo( "#qunit-fixture" );
+
+ assert.equal( fixture.find( "input:valid, span" ).length, 2, "has to find two elements" );
+ assert.equal( fixture.find( "input:valid , span" ).length, 2, "has to find two elements" );
+ assert.equal( fixture.find( "input:valid ,span" ).length, 2, "has to find two elements" );
+ assert.equal( fixture.find( "input:valid,span" ).length, 2, "has to find two elements" );
+ assert.equal( fixture.find( "input:valid\t,\rspan" ).length, 2, "has to find two elements" );
} );
QUnit.test( "child and adjacent", function( assert ) {