8000 Selector: Drop support for legacy pseudos, test custom pseudos · jquery/jquery@8c7da22 · GitHub
[go: up one dir, main page]

Skip to content

Commit 8c7da22

Browse files
authored
Selector: Drop support for legacy pseudos, test custom pseudos
This backports custom pseudos tests from Sizzle; they were missed in original test backports. Also, the support for legacy custom pseudos has been dropped. The `jQuery.expr` test cleanup has been wrapped in `try-finally` for cleaner test isolation in case anything goes wrong. Closes gh-5137
1 parent ee6e874 commit 8c7da22

File tree

2 files changed

+76
-21
lines changed

2 files changed

+76
-21
lines changed

src/selector.js

Lines changed: 2 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -804,9 +804,8 @@ Expr = jQuery.expr = {
804804
// https://www.w3.org/TR/selectors/#pseudo-classes
805805
// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
806806
// Remember that setFilters inherits from pseudos
807-
var args,
808-
fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
809-
selectorError( "unsupported pseudo: " + pseudo );
807+
var fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
808+
selectorError( "unsupported pseudo: " + pseudo );
810809

811810
// The user may use createPseudo to indicate that
812811
// arguments are needed to create the filter function
@@ -815,24 +814,6 @@ Expr = jQuery.expr = {
815814
return fn( argument );
816815
}
817816

818-
// But maintain support for old signatures
819-
if ( fn.length > 1 ) {
820-
args = [ pseudo, pseudo, "", argument ];
821-
return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
822-
markFunction( function( seed, matches ) {
823-
var idx,
824-
matched = fn( seed, argument ),
825-
i = matched.length;
826-
while ( i-- ) {
827-
idx = indexOf.call( seed, matched[ i ] );
828-
seed[ idx ] = !( matches[ idx ] = matched[ i ] );
829-
}
830-
} ) :
831-
function( elem ) {
832-
return fn( elem, 0, args );
833-
};
834-
}
835-
836817
return fn;
837818
}
838819
},

test/unit/selector.js

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2142,3 +2142,77 @@ QUnit.test( "jQuery.escapeSelector", function( assert ) {
21422142
assert.equal( jQuery.escapeSelector( "\uDF06" ), "\uDF06", "Doesn't escape lone low surrogate" );
21432143
assert.equal( jQuery.escapeSelector( "\uD834" ), "\uD834", "Doesn't escape lone high surrogate" );
21442144
} );
2145+
2146+
QUnit.test( "custom pseudos", function( assert ) {
2147+
assert.expect( 6 );
2148+
2149+
try {
2150+
jQuery.expr.filters.foundation = jQuery.expr.filters.root;
2151+
assert.deepEqual( jQuery.find( ":foundation" ), [ document.documentElement ], "Copy element filter with new name" );
2152+
} finally {
2153+
delete jQuery.expr.filters.foundation;
2154+
}
2155+
2156+
try {
2157+
jQuery.expr.setFilters.primary = jQuery.expr.setFilters.first;
2158+
assert.t( "Copy set filter with new name", "div#qunit-fixture :primary", [ "firstp" ] );
2159+
} finally {
2160+
delete jQuery.expr.setFilters.primary;
2161+
}
2162+
2163+
try {
2164+
jQuery.expr.filters.aristotlean = jQuery.expr.createPseudo( function() {
2165+
return function( elem ) {
2166+
return !!elem.id;
2167+
};
2168+
} );
2169+
assert.t( "Custom element filter", "#foo :aristotlean", [ "sndp", "en", "yahoo", "sap", "anchor2", "simon" ] );
2170+
} finally {
2171+
delete jQuery.expr.filters.aristotlean;
2172+
}
2173+
2174+
try {
2175+
jQuery.expr.filters.endswith = jQuery.expr.createPseudo( function( text ) {
2176+
return function( elem ) {
2177+
return jQuery.text( elem ).slice( -text.length ) === text;
2178+
};
2179+
} );
2180+
assert.t( "Custom element filter with argument", "a:endswith(ogle)", [ "google" ] );
2181+
} finally {
2182+
delete jQuery.expr.filters.endswith;
2183+
}
2184+
2185+
try {
2186+
jQuery.expr.setFilters.second = jQuery.expr.createPseudo( function() {
2187+
return jQuery.expr.createPseudo( function( seed, matches ) {
2188+
if ( seed[ 1 ] ) {
2189+
matches[ 1 ] = seed[ 1 ];
2190+
seed[ 1 ] = false;
2191+
}
2192+
} );
2193+
} );
2194+
assert.t( "Custom set filter", "#qunit-fixture p:second", [ "ap" ] );
2195+
} finally {
2196+
delete jQuery.expr.filters.second;
2197+
}
2198+
2199+
try {
2200+
jQuery.expr.setFilters.slice = jQuery.expr.createPseudo( function( argument ) {
2201+
var bounds = argument.split( ":" );
2202+
return jQuery.expr.createPseudo( function( seed, matches ) {
2203+
var i = bounds[ 1 ];
2204+
2205+
// Match elements found at the specified indexes
2206+
while ( --i >= bounds[ 0 ] ) {
2207+
if ( seed[ i ] ) {
2208+
matches[ i ] = seed[ i ];
2209+
seed[ i ] = false;
2210+
}
2211+
}
2212+
} );
2213+
} );
2214+
assert.t( "Custom set filter with argument", "#qunit-fixture p:slice(1:3)", [ "ap", "sndp" ] );
2215+
} finally {
2216+
delete jQuery.expr.filters.slice;
2217+
}
2218+
} );

0 commit comments

Comments
 (0)
0