Selector: Update Sizzle from 2.3.4 to 2.3.5

Fixes gh-4424
Fixes gh-4435
Fixes gh-4441
Fixes gh-4453
Closes gh-4641
This commit is contained in:
Michał Gołębiowski-Owczarek 2020-03-16 17:34:27 +01:00 committed by GitHub
parent 7506c9ca62
commit 04bf577e2f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 519 additions and 323 deletions

View File

@ -1,15 +1,14 @@
/*! /*!
* Sizzle CSS Selector Engine v2.3.4 * Sizzle CSS Selector Engine v2.3.5
* https://sizzlejs.com/ * https://sizzlejs.com/
* *
* Copyright JS Foundation and other contributors * Copyright JS Foundation and other contributors
* Released under the MIT license * Released under the MIT license
* https://js.foundation/ * https://js.foundation/
* *
* Date: 2019-04-08 * Date: 2020-03-14
*/ */
( function( window ) { ( function( window ) {
var i, var i,
support, support,
Expr, Expr,
@ -52,9 +51,10 @@ var i,
hasOwn = ( {} ).hasOwnProperty, hasOwn = ( {} ).hasOwnProperty,
arr = [], arr = [],
pop = arr.pop, pop = arr.pop,
push_native = arr.push, pushNative = arr.push,
push = arr.push, push = arr.push,
slice = arr.slice, slice = arr.slice,
// Use a stripped-down indexOf as it's faster than native // Use a stripped-down indexOf as it's faster than native
// https://jsperf.com/thor-indexof-vs-for/5 // https://jsperf.com/thor-indexof-vs-for/5
indexOf = function( list, elem ) { indexOf = function( list, elem ) {
@ -68,40 +68,50 @@ var i,
return -1; return -1;
}, },
booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" +
"ismap|loop|multiple|open|readonly|required|scoped",
// Regular expressions // Regular expressions
// http://www.w3.org/TR/css3-selectors/#whitespace // http://www.w3.org/TR/css3-selectors/#whitespace
whitespace = "[\\x20\\t\\r\\n\\f]", whitespace = "[\\x20\\t\\r\\n\\f]",
// http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram
identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+", identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace +
"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",
// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
// Operator (capture 2) // Operator (capture 2)
"*([*^$|!~]?=)" + whitespace + "*([*^$|!~]?=)" + whitespace +
// "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + // "Attribute values must be CSS identifiers [capture 5]
"*\\]", // or strings [capture 3 or capture 4]"
"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" +
whitespace + "*\\]",
pseudos = ":(" + identifier + ")(?:\\((" + pseudos = ":(" + identifier + ")(?:\\((" +
// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
// 1. quoted (capture 3; capture 4 or capture 5) // 1. quoted (capture 3; capture 4 or capture 5)
"('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
// 2. simple (capture 6) // 2. simple (capture 6)
"((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
// 3. anything else (capture 2) // 3. anything else (capture 2)
".*" + ".*" +
")\\)|)", ")\\)|)",
// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
rwhitespace = new RegExp( whitespace + "+", "g" ), rwhitespace = new RegExp( whitespace + "+", "g" ),
rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" +
whitespace + "+$", "g" ),
rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace +
"*" ),
rdescend = new RegExp( whitespace + "|>" ), rdescend = new RegExp( whitespace + "|>" ),
rpseudo = new RegExp( pseudos ), rpseudo = new RegExp( pseudos ),
@ -113,14 +123,16 @@ var i,
"TAG": new RegExp( "^(" + identifier + "|[*])" ), "TAG": new RegExp( "^(" + identifier + "|[*])" ),
"ATTR": new RegExp( "^" + attributes ), "ATTR": new RegExp( "^" + attributes ),
"PSEUDO": new RegExp( "^" + pseudos ), "PSEUDO": new RegExp( "^" + pseudos ),
"CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" +
"*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" +
"*(\\d+)|))" + whitespace + "*\\)|)", "i" ), whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
"bool": new RegExp( "^(?:" + booleans + ")$", "i" ), "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
// For use in libraries implementing .is() // For use in libraries implementing .is()
// We use this for POS matching in `select` // We use this for POS matching in `select`
"needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + "needsContext": new RegExp( "^" + whitespace +
whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace +
"*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
}, },
rhtml = /HTML$/i, rhtml = /HTML$/i,
@ -136,18 +148,21 @@ var i,
// CSS escapes // CSS escapes
// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ),
funescape = function( _, escaped, escapedWhitespace ) { funescape = function( escape, nonHex ) {
var high = "0x" + escaped - 0x10000; var high = "0x" + escape.slice( 1 ) - 0x10000;
// NaN means non-codepoint
// Support: Firefox<24 return nonHex ?
// Workaround erroneous numeric interpretation of +"0x"
return high !== high || escapedWhitespace ? // Strip the backslash prefix from a non-hex escape sequence
escaped : nonHex :
// Replace a hexadecimal escape sequence with the encoded Unicode code point
// Support: IE <=11+
// For values outside the Basic Multilingual Plane (BMP), manually construct a
// surrogate pair
high < 0 ? high < 0 ?
// BMP codepoint
String.fromCharCode( high + 0x10000 ) : String.fromCharCode( high + 0x10000 ) :
// Supplemental Plane codepoint (surrogate pair)
String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
}, },
@ -163,7 +178,8 @@ var i,
} }
// Control characters and (dependent upon position) numbers get escaped as code points // Control characters and (dependent upon position) numbers get escaped as code points
return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; return ch.slice( 0, -1 ) + "\\" +
ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
} }
// Other potentially-special ASCII characters get backslash-escaped // Other potentially-special ASCII characters get backslash-escaped
@ -191,15 +207,17 @@ try {
( arr = slice.call( preferredDoc.childNodes ) ), ( arr = slice.call( preferredDoc.childNodes ) ),
preferredDoc.childNodes preferredDoc.childNodes
); );
// Support: Android<4.0 // Support: Android<4.0
// Detect silently failing push.apply // Detect silently failing push.apply
// eslint-disable-next-line no-unused-expressions
arr[ preferredDoc.childNodes.length ].nodeType; arr[ preferredDoc.childNodes.length ].nodeType;
} catch ( e ) { } catch ( e ) {
push = { apply: arr.length ? push = { apply: arr.length ?
// Leverage slice if possible // Leverage slice if possible
function( target, els ) { function( target, els ) {
push_native.apply( target, slice.call(els) ); pushNative.apply( target, slice.call( els ) );
} : } :
// Support: IE<9 // Support: IE<9
@ -207,6 +225,7 @@ try {
function( target, els ) { function( target, els ) {
var j = target.length, var j = target.length,
i = 0; i = 0;
// Can't trust NodeList.length // Can't trust NodeList.length
while ( ( target[ j++ ] = els[ i++ ] ) ) {} while ( ( target[ j++ ] = els[ i++ ] ) ) {}
target.length = j - 1; target.length = j - 1;
@ -232,10 +251,7 @@ function Sizzle( selector, context, results, seed ) {
// Try to shortcut find operations (as opposed to filters) in HTML documents // Try to shortcut find operations (as opposed to filters) in HTML documents
if ( !seed ) { if ( !seed ) {
if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
setDocument( context ); setDocument( context );
}
context = context || document; context = context || document;
if ( documentIsHTML ) { if ( documentIsHTML ) {
@ -307,8 +323,19 @@ function Sizzle( selector, context, results, seed ) {
// descendant combinators, which is not what we want. // descendant combinators, which is not what we want.
// In such cases, we work around the behavior by prefixing every selector in the // In such cases, we work around the behavior by prefixing every selector in the
// list with an ID selector referencing the scope context. // list with an ID selector referencing the scope context.
// The technique has to be used as well when a leading combinator is used
// as such selectors are not recognized by querySelectorAll.
// Thanks to Andrew Dupont for this technique. // Thanks to Andrew Dupont for this technique.
if ( nodeType === 1 && rdescend.test( selector ) ) { if ( nodeType === 1 &&
( rdescend.test( selector ) || rcombinators.test( selector ) ) ) {
// Expand context for sibling selectors
newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
context;
// We can use :scope instead of the ID hack if the browser
// supports it & if we're not changing the context.
if ( newContext !== context || !support.scope ) {
// Capture the context ID, setting it first if necessary // Capture the context ID, setting it first if necessary
if ( ( nid = context.getAttribute( "id" ) ) ) { if ( ( nid = context.getAttribute( "id" ) ) ) {
@ -316,18 +343,16 @@ function Sizzle( selector, context, results, seed ) {
} else { } else {
context.setAttribute( "id", ( nid = expando ) ); context.setAttribute( "id", ( nid = expando ) );
} }
}
// Prefix every selector in the list // Prefix every selector in the list
groups = tokenize( selector ); groups = tokenize( selector );
i = groups.length; i = groups.length;
while ( i-- ) { while ( i-- ) {
groups[i] = "#" + nid + " " + toSelector( groups[i] ); groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " +
toSelector( groups[ i ] );
} }
newSelector = groups.join( "," ); newSelector = groups.join( "," );
// Expand context for sibling selectors
newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
context;
} }
try { try {
@ -360,8 +385,10 @@ function createCache() {
var keys = []; var keys = [];
function cache( key, value ) { function cache( key, value ) {
// Use (key + " ") to avoid collision with native prototype properties (see Issue #157) // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
if ( keys.push( key + " " ) > Expr.cacheLength ) { if ( keys.push( key + " " ) > Expr.cacheLength ) {
// Only keep the most recent entries // Only keep the most recent entries
delete cache[ keys.shift() ]; delete cache[ keys.shift() ];
} }
@ -391,10 +418,12 @@ function assert( fn ) {
} catch ( e ) { } catch ( e ) {
return false; return false;
} finally { } finally {
// Remove from its parent by default // Remove from its parent by default
if ( el.parentNode ) { if ( el.parentNode ) {
el.parentNode.removeChild( el ); el.parentNode.removeChild( el );
} }
// release memory in IE // release memory in IE
el = null; el = null;
} }
@ -579,7 +608,11 @@ setDocument = Sizzle.setDocument = function( node ) {
doc = node ? node.ownerDocument || node : preferredDoc; doc = node ? node.ownerDocument || node : preferredDoc;
// Return early if doc is invalid or already selected // Return early if doc is invalid or already selected
if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { // Support: IE 11+, Edge 17 - 18+
// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
// two documents; shallow comparisons work.
// eslint-disable-next-line eqeqeq
if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) {
return document; return document;
} }
@ -588,9 +621,13 @@ setDocument = Sizzle.setDocument = function( node ) {
docElem = document.documentElement; docElem = document.documentElement;
documentIsHTML = !isXML( document ); documentIsHTML = !isXML( document );
// Support: IE 9-11, Edge // Support: IE 9 - 11+, Edge 12 - 18+
// Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
if ( preferredDoc !== document && // Support: IE 11+, Edge 17 - 18+
// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
// two documents; shallow comparisons work.
// eslint-disable-next-line eqeqeq
if ( preferredDoc != document &&
( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) {
// Support: IE 11, Edge // Support: IE 11, Edge
@ -603,6 +640,17 @@ setDocument = Sizzle.setDocument = function( node ) {
} }
} }
// Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only,
// Safari 4 - 5 only, Opera <=11.6 - 12.x only
// IE/Edge & older browsers don't support the :scope pseudo-class.
// Support: Safari 6.0 only
// Safari 6.0 supports :scope but it's an alias of :root there.
support.scope = assert( function( el ) {
docElem.appendChild( el ).appendChild( document.createElement( "div" ) );
return typeof el.querySelectorAll !== "undefined" &&
!el.querySelectorAll( ":scope fieldset div" ).length;
} );
/* Attributes /* Attributes
---------------------------------------------------------------------- */ ---------------------------------------------------------------------- */
@ -706,6 +754,7 @@ setDocument = Sizzle.setDocument = function( node ) {
var elem, var elem,
tmp = [], tmp = [],
i = 0, i = 0,
// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
results = context.getElementsByTagName( tag ); results = context.getElementsByTagName( tag );
@ -745,9 +794,13 @@ setDocument = Sizzle.setDocument = function( node ) {
rbuggyQSA = []; rbuggyQSA = [];
if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) { if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) {
// Build QSA regex // Build QSA regex
// Regex strategy adopted from Diego Perini // Regex strategy adopted from Diego Perini
assert( function( el ) { assert( function( el ) {
var input;
// Select is set to empty string on purpose // Select is set to empty string on purpose
// This is to test IE's treatment of not explicitly // This is to test IE's treatment of not explicitly
// setting a boolean content attribute, // setting a boolean content attribute,
@ -776,6 +829,19 @@ setDocument = Sizzle.setDocument = function( node ) {
rbuggyQSA.push( "~=" ); rbuggyQSA.push( "~=" );
} }
// Support: IE 11+, Edge 15 - 18+
// IE 11/Edge don't find elements on a `[name='']` query in some cases.
// Adding a temporary attribute to the document before the selection works
// around the issue.
// Interestingly, IE 10 & older don't seem to have the issue.
input = document.createElement( "input" );
input.setAttribute( "name", "" );
el.appendChild( input );
if ( !el.querySelectorAll( "[name='']" ).length ) {
rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" +
whitespace + "*(?:''|\"\")" );
}
// Webkit/Opera - :checked should return selected option elements // Webkit/Opera - :checked should return selected option elements
// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
// IE8 throws error here and will not see later tests // IE8 throws error here and will not see later tests
@ -789,6 +855,11 @@ setDocument = Sizzle.setDocument = function( node ) {
if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
rbuggyQSA.push( ".#.+[+~]" ); rbuggyQSA.push( ".#.+[+~]" );
} }
// Support: Firefox <=3.6 - 5 only
// Old Firefox doesn't throw on a badly-escaped identifier.
el.querySelectorAll( "\\\f" );
rbuggyQSA.push( "[\\r\\n\\f]" );
} ); } );
assert( function( el ) { assert( function( el ) {
@ -820,6 +891,7 @@ setDocument = Sizzle.setDocument = function( node ) {
rbuggyQSA.push( ":enabled", ":disabled" ); rbuggyQSA.push( ":enabled", ":disabled" );
} }
// Support: Opera 10 - 11 only
// Opera 10-11 does not throw on post-comma invalid pseudos // Opera 10-11 does not throw on post-comma invalid pseudos
el.querySelectorAll( "*,:x" ); el.querySelectorAll( "*,:x" );
rbuggyQSA.push( ",.*:" ); rbuggyQSA.push( ",.*:" );
@ -833,6 +905,7 @@ setDocument = Sizzle.setDocument = function( node ) {
docElem.msMatchesSelector ) ) ) ) { docElem.msMatchesSelector ) ) ) ) {
assert( function( el ) { assert( function( el ) {
// Check to see if it's possible to do matchesSelector // Check to see if it's possible to do matchesSelector
// on a disconnected node (IE 9) // on a disconnected node (IE 9)
support.disconnectedMatch = matches.call( el, "*" ); support.disconnectedMatch = matches.call( el, "*" );
@ -895,7 +968,11 @@ setDocument = Sizzle.setDocument = function( node ) {
} }
// Calculate position if both inputs belong to the same document // Calculate position if both inputs belong to the same document
compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? // Support: IE 11+, Edge 17 - 18+
// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
// two documents; shallow comparisons work.
// eslint-disable-next-line eqeqeq
compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ?
a.compareDocumentPosition( b ) : a.compareDocumentPosition( b ) :
// Otherwise we know they are disconnected // Otherwise we know they are disconnected
@ -906,10 +983,21 @@ setDocument = Sizzle.setDocument = function( node ) {
( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) {
// Choose the first element that is related to our preferred document // Choose the first element that is related to our preferred document
if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { // Support: IE 11+, Edge 17 - 18+
// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
// two documents; shallow comparisons work.
// eslint-disable-next-line eqeqeq
if ( a == document || a.ownerDocument == preferredDoc &&
contains( preferredDoc, a ) ) {
return -1; return -1;
} }
if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
// Support: IE 11+, Edge 17 - 18+
// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
// two documents; shallow comparisons work.
// eslint-disable-next-line eqeqeq
if ( b == document || b.ownerDocument == preferredDoc &&
contains( preferredDoc, b ) ) {
return 1; return 1;
} }
@ -922,6 +1010,7 @@ setDocument = Sizzle.setDocument = function( node ) {
return compare & 4 ? -1 : 1; return compare & 4 ? -1 : 1;
} : } :
function( a, b ) { function( a, b ) {
// Exit early if the nodes are identical // Exit early if the nodes are identical
if ( a === b ) { if ( a === b ) {
hasDuplicate = true; hasDuplicate = true;
@ -937,8 +1026,14 @@ setDocument = Sizzle.setDocument = function( node ) {
// Parentless nodes are either documents or disconnected // Parentless nodes are either documents or disconnected
if ( !aup || !bup ) { if ( !aup || !bup ) {
return a === document ? -1 :
b === document ? 1 : // Support: IE 11+, Edge 17 - 18+
// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
// two documents; shallow comparisons work.
/* eslint-disable eqeqeq */
return a == document ? -1 :
b == document ? 1 :
/* eslint-enable eqeqeq */
aup ? -1 : aup ? -1 :
bup ? 1 : bup ? 1 :
sortInput ? sortInput ?
@ -966,12 +1061,18 @@ setDocument = Sizzle.setDocument = function( node ) {
} }
return i ? return i ?
// Do a sibling check if the nodes have a common ancestor // Do a sibling check if the nodes have a common ancestor
siblingCheck( ap[ i ], bp[ i ] ) : siblingCheck( ap[ i ], bp[ i ] ) :
// Otherwise nodes in our document sort first // Otherwise nodes in our document sort first
ap[i] === preferredDoc ? -1 : // Support: IE 11+, Edge 17 - 18+
bp[i] === preferredDoc ? 1 : // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
// two documents; shallow comparisons work.
/* eslint-disable eqeqeq */
ap[ i ] == preferredDoc ? -1 :
bp[ i ] == preferredDoc ? 1 :
/* eslint-enable eqeqeq */
0; 0;
}; };
@ -983,10 +1084,7 @@ Sizzle.matches = function( expr, elements ) {
}; };
Sizzle.matchesSelector = function( elem, expr ) { Sizzle.matchesSelector = function( elem, expr ) {
// Set document vars if needed
if ( ( elem.ownerDocument || elem ) !== document ) {
setDocument( elem ); setDocument( elem );
}
if ( support.matchesSelector && documentIsHTML && if ( support.matchesSelector && documentIsHTML &&
!nonnativeSelectorCache[ expr + " " ] && !nonnativeSelectorCache[ expr + " " ] &&
@ -998,6 +1096,7 @@ Sizzle.matchesSelector = function( elem, expr ) {
// IE 9's matchesSelector returns false on disconnected nodes // IE 9's matchesSelector returns false on disconnected nodes
if ( ret || support.disconnectedMatch || if ( ret || support.disconnectedMatch ||
// As well, disconnected nodes are said to be in a document // As well, disconnected nodes are said to be in a document
// fragment in IE 9 // fragment in IE 9
elem.document && elem.document.nodeType !== 11 ) { elem.document && elem.document.nodeType !== 11 ) {
@ -1012,20 +1111,31 @@ Sizzle.matchesSelector = function( elem, expr ) {
}; };
Sizzle.contains = function( context, elem ) { Sizzle.contains = function( context, elem ) {
// Set document vars if needed // Set document vars if needed
if ( ( context.ownerDocument || context ) !== document ) { // Support: IE 11+, Edge 17 - 18+
// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
// two documents; shallow comparisons work.
// eslint-disable-next-line eqeqeq
if ( ( context.ownerDocument || context ) != document ) {
setDocument( context ); setDocument( context );
} }
return contains( context, elem ); return contains( context, elem );
}; };
Sizzle.attr = function( elem, name ) { Sizzle.attr = function( elem, name ) {
// Set document vars if needed // Set document vars if needed
if ( ( elem.ownerDocument || elem ) !== document ) { // Support: IE 11+, Edge 17 - 18+
// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
// two documents; shallow comparisons work.
// eslint-disable-next-line eqeqeq
if ( ( elem.ownerDocument || elem ) != document ) {
setDocument( elem ); setDocument( elem );
} }
var fn = Expr.attrHandle[ name.toLowerCase() ], var fn = Expr.attrHandle[ name.toLowerCase() ],
// Don't get fooled by Object.prototype properties (jQuery #13807) // Don't get fooled by Object.prototype properties (jQuery #13807)
val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
fn( elem, name, !documentIsHTML ) : fn( elem, name, !documentIsHTML ) :
@ -1092,17 +1202,21 @@ getText = Sizzle.getText = function( elem ) {
nodeType = elem.nodeType; nodeType = elem.nodeType;
if ( !nodeType ) { if ( !nodeType ) {
// If no nodeType, this is expected to be an array // If no nodeType, this is expected to be an array
while ( ( node = elem[ i++ ] ) ) { while ( ( node = elem[ i++ ] ) ) {
// Do not traverse comment nodes // Do not traverse comment nodes
ret += getText( node ); ret += getText( node );
} }
} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
// Use textContent for elements // Use textContent for elements
// innerText usage removed for consistency of new lines (jQuery #11153) // innerText usage removed for consistency of new lines (jQuery #11153)
if ( typeof elem.textContent === "string" ) { if ( typeof elem.textContent === "string" ) {
return elem.textContent; return elem.textContent;
} else { } else {
// Traverse its children // Traverse its children
for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
ret += getText( elem ); ret += getText( elem );
@ -1111,6 +1225,7 @@ getText = Sizzle.getText = function( elem ) {
} else if ( nodeType === 3 || nodeType === 4 ) { } else if ( nodeType === 3 || nodeType === 4 ) {
return elem.nodeValue; return elem.nodeValue;
} }
// Do not include comment or processing instruction nodes // Do not include comment or processing instruction nodes
return ret; return ret;
@ -1141,7 +1256,8 @@ Expr = Sizzle.selectors = {
match[ 1 ] = match[ 1 ].replace( runescape, funescape ); match[ 1 ] = match[ 1 ].replace( runescape, funescape );
// Move the given value to match[3] whether quoted or unquoted // Move the given value to match[3] whether quoted or unquoted
match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); match[ 3 ] = ( match[ 3 ] || match[ 4 ] ||
match[ 5 ] || "" ).replace( runescape, funescape );
if ( match[ 2 ] === "~=" ) { if ( match[ 2 ] === "~=" ) {
match[ 3 ] = " " + match[ 3 ] + " "; match[ 3 ] = " " + match[ 3 ] + " ";
@ -1151,6 +1267,7 @@ Expr = Sizzle.selectors = {
}, },
"CHILD": function( match ) { "CHILD": function( match ) {
/* matches from matchExpr["CHILD"] /* matches from matchExpr["CHILD"]
1 type (only|nth|...) 1 type (only|nth|...)
2 what (child|of-type) 2 what (child|of-type)
@ -1164,6 +1281,7 @@ Expr = Sizzle.selectors = {
match[ 1 ] = match[ 1 ].toLowerCase(); match[ 1 ] = match[ 1 ].toLowerCase();
if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { if ( match[ 1 ].slice( 0, 3 ) === "nth" ) {
// nth-* requires argument // nth-* requires argument
if ( !match[ 3 ] ) { if ( !match[ 3 ] ) {
Sizzle.error( match[ 0 ] ); Sizzle.error( match[ 0 ] );
@ -1171,7 +1289,9 @@ Expr = Sizzle.selectors = {
// numeric x and y parameters for Expr.filter.CHILD // numeric x and y parameters for Expr.filter.CHILD
// remember that false/true cast respectively to 0/1 // remember that false/true cast respectively to 0/1
match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); match[ 4 ] = +( match[ 4 ] ?
match[ 5 ] + ( match[ 6 ] || 1 ) :
2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) );
match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" );
// other types prohibit arguments // other types prohibit arguments
@ -1196,8 +1316,10 @@ Expr = Sizzle.selectors = {
// Strip excess characters from unquoted arguments // Strip excess characters from unquoted arguments
} else if ( unquoted && rpseudo.test( unquoted ) && } else if ( unquoted && rpseudo.test( unquoted ) &&
// Get excess from tokenize (recursively) // Get excess from tokenize (recursively)
( excess = tokenize( unquoted, true ) ) && ( excess = tokenize( unquoted, true ) ) &&
// advance to the next closing parenthesis // advance to the next closing parenthesis
( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) {
@ -1216,7 +1338,9 @@ Expr = Sizzle.selectors = {
"TAG": function( nodeNameSelector ) { "TAG": function( nodeNameSelector ) {
var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
return nodeNameSelector === "*" ? return nodeNameSelector === "*" ?
function() { return true; } : function() {
return true;
} :
function( elem ) { function( elem ) {
return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
}; };
@ -1226,9 +1350,15 @@ Expr = Sizzle.selectors = {
var pattern = classCache[ className + " " ]; var pattern = classCache[ className + " " ];
return pattern || return pattern ||
(pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && ( pattern = new RegExp( "(^|" + whitespace +
classCache( className, function( elem ) { ")" + className + "(" + whitespace + "|$)" ) ) && classCache(
return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); className, function( elem ) {
return pattern.test(
typeof elem.className === "string" && elem.className ||
typeof elem.getAttribute !== "undefined" &&
elem.getAttribute( "class" ) ||
""
);
} ); } );
}, },
@ -1245,6 +1375,8 @@ Expr = Sizzle.selectors = {
result += ""; result += "";
/* eslint-disable max-len */
return operator === "=" ? result === check : return operator === "=" ? result === check :
operator === "!=" ? result !== check : operator === "!=" ? result !== check :
operator === "^=" ? check && result.indexOf( check ) === 0 : operator === "^=" ? check && result.indexOf( check ) === 0 :
@ -1253,10 +1385,12 @@ Expr = Sizzle.selectors = {
operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
false; false;
/* eslint-enable max-len */
}; };
}, },
"CHILD": function( type, what, argument, first, last ) { "CHILD": function( type, what, _argument, first, last ) {
var simple = type.slice( 0, 3 ) !== "nth", var simple = type.slice( 0, 3 ) !== "nth",
forward = type.slice( -4 ) !== "last", forward = type.slice( -4 ) !== "last",
ofType = what === "of-type"; ofType = what === "of-type";
@ -1268,7 +1402,7 @@ Expr = Sizzle.selectors = {
return !!elem.parentNode; return !!elem.parentNode;
} : } :
function( elem, context, xml ) { function( elem, _context, xml ) {
var cache, uniqueCache, outerCache, node, nodeIndex, start, var cache, uniqueCache, outerCache, node, nodeIndex, start,
dir = simple !== forward ? "nextSibling" : "previousSibling", dir = simple !== forward ? "nextSibling" : "previousSibling",
parent = elem.parentNode, parent = elem.parentNode,
@ -1290,6 +1424,7 @@ Expr = Sizzle.selectors = {
return false; return false;
} }
} }
// Reverse direction for :only-* (if we haven't yet done so) // Reverse direction for :only-* (if we haven't yet done so)
start = dir = type === "only" && !start && "nextSibling"; start = dir = type === "only" && !start && "nextSibling";
} }
@ -1330,8 +1465,10 @@ Expr = Sizzle.selectors = {
} }
} else { } else {
// Use previously-cached element index if available // Use previously-cached element index if available
if ( useCache ) { if ( useCache ) {
// ...in a gzip-friendly way // ...in a gzip-friendly way
node = elem; node = elem;
outerCache = node[ expando ] || ( node[ expando ] = {} ); outerCache = node[ expando ] || ( node[ expando ] = {} );
@ -1349,6 +1486,7 @@ Expr = Sizzle.selectors = {
// xml :nth-child(...) // xml :nth-child(...)
// or :nth-last-child(...) or :nth(-last)?-of-type(...) // or :nth-last-child(...) or :nth(-last)?-of-type(...)
if ( diff === false ) { if ( diff === false ) {
// Use the same loop as above to seek `elem` from the start // Use the same loop as above to seek `elem` from the start
while ( ( node = ++nodeIndex && node && node[ dir ] || while ( ( node = ++nodeIndex && node && node[ dir ] ||
( diff = nodeIndex = 0 ) || start.pop() ) ) { ( diff = nodeIndex = 0 ) || start.pop() ) ) {
@ -1360,7 +1498,8 @@ Expr = Sizzle.selectors = {
// Cache the index of each encountered element // Cache the index of each encountered element
if ( useCache ) { if ( useCache ) {
outerCache = node[ expando ] || (node[ expando ] = {}); outerCache = node[ expando ] ||
( node[ expando ] = {} );
// Support: IE <9 only // Support: IE <9 only
// Defend against cloned attroperties (jQuery gh-1709) // Defend against cloned attroperties (jQuery gh-1709)
@ -1386,6 +1525,7 @@ Expr = Sizzle.selectors = {
}, },
"PSEUDO": function( pseudo, argument ) { "PSEUDO": function( pseudo, argument ) {
// pseudo-class names are case-insensitive // pseudo-class names are case-insensitive
// http://www.w3.org/TR/selectors/#pseudo-classes // http://www.w3.org/TR/selectors/#pseudo-classes
// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
@ -1424,8 +1564,10 @@ Expr = Sizzle.selectors = {
}, },
pseudos: { pseudos: {
// Potentially complex pseudos // Potentially complex pseudos
"not": markFunction( function( selector ) { "not": markFunction( function( selector ) {
// Trim the selector passed to compile // Trim the selector passed to compile
// to avoid treating leading and trailing // to avoid treating leading and trailing
// spaces as combinators // spaces as combinators
@ -1434,7 +1576,7 @@ Expr = Sizzle.selectors = {
matcher = compile( selector.replace( rtrim, "$1" ) ); matcher = compile( selector.replace( rtrim, "$1" ) );
return matcher[ expando ] ? return matcher[ expando ] ?
markFunction(function( seed, matches, context, xml ) { markFunction( function( seed, matches, _context, xml ) {
var elem, var elem,
unmatched = matcher( seed, null, xml, [] ), unmatched = matcher( seed, null, xml, [] ),
i = seed.length; i = seed.length;
@ -1446,9 +1588,10 @@ Expr = Sizzle.selectors = {
} }
} }
} ) : } ) :
function( elem, context, xml ) { function( elem, _context, xml ) {
input[ 0 ] = elem; input[ 0 ] = elem;
matcher( input, null, xml, results ); matcher( input, null, xml, results );
// Don't keep the element (issue #299) // Don't keep the element (issue #299)
input[ 0 ] = null; input[ 0 ] = null;
return !results.pop(); return !results.pop();
@ -1476,6 +1619,7 @@ Expr = Sizzle.selectors = {
// The identifier C does not have to be a valid language name." // The identifier C does not have to be a valid language name."
// http://www.w3.org/TR/selectors/#lang-pseudo // http://www.w3.org/TR/selectors/#lang-pseudo
"lang": markFunction( function( lang ) { "lang": markFunction( function( lang ) {
// lang value must be a valid identifier // lang value must be a valid identifier
if ( !ridentifier.test( lang || "" ) ) { if ( !ridentifier.test( lang || "" ) ) {
Sizzle.error( "unsupported lang: " + lang ); Sizzle.error( "unsupported lang: " + lang );
@ -1507,7 +1651,9 @@ Expr = Sizzle.selectors = {
}, },
"focus": function( elem ) { "focus": function( elem ) {
return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); return elem === document.activeElement &&
( !document.hasFocus || document.hasFocus() ) &&
!!( elem.type || elem.href || ~elem.tabIndex );
}, },
// Boolean properties // Boolean properties
@ -1515,16 +1661,20 @@ Expr = Sizzle.selectors = {
"disabled": createDisabledPseudo( true ), "disabled": createDisabledPseudo( true ),
"checked": function( elem ) { "checked": function( elem ) {
// In CSS3, :checked should return both checked and selected elements // In CSS3, :checked should return both checked and selected elements
// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
var nodeName = elem.nodeName.toLowerCase(); var nodeName = elem.nodeName.toLowerCase();
return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); return ( nodeName === "input" && !!elem.checked ) ||
( nodeName === "option" && !!elem.selected );
}, },
"selected": function( elem ) { "selected": function( elem ) {
// Accessing this property makes selected-by-default // Accessing this property makes selected-by-default
// options in Safari work properly // options in Safari work properly
if ( elem.parentNode ) { if ( elem.parentNode ) {
// eslint-disable-next-line no-unused-expressions
elem.parentNode.selectedIndex; elem.parentNode.selectedIndex;
} }
@ -1533,6 +1683,7 @@ Expr = Sizzle.selectors = {
// Contents // Contents
"empty": function( elem ) { "empty": function( elem ) {
// http://www.w3.org/TR/selectors/#empty-pseudo // http://www.w3.org/TR/selectors/#empty-pseudo
// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
// but not by others (comment: 8; processing instruction: 7; etc.) // but not by others (comment: 8; processing instruction: 7; etc.)
@ -1570,7 +1721,8 @@ Expr = Sizzle.selectors = {
// Support: IE<8 // Support: IE<8
// New HTML5 attribute values (e.g., "search") appear with elem.type === "text" // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); ( ( attr = elem.getAttribute( "type" ) ) == null ||
attr.toLowerCase() === "text" );
}, },
// Position-in-collection // Position-in-collection
@ -1578,11 +1730,11 @@ Expr = Sizzle.selectors = {
return [ 0 ]; return [ 0 ];
} ), } ),
"last": createPositionalPseudo(function( matchIndexes, length ) { "last": createPositionalPseudo( function( _matchIndexes, length ) {
return [ length - 1 ]; return [ length - 1 ];
} ), } ),
"eq": createPositionalPseudo(function( matchIndexes, length, argument ) { "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) {
return [ argument < 0 ? argument + length : argument ]; return [ argument < 0 ? argument + length : argument ];
} ), } ),
@ -1657,6 +1809,7 @@ tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
// Comma and first run // Comma and first run
if ( !matched || ( match = rcomma.exec( soFar ) ) ) { if ( !matched || ( match = rcomma.exec( soFar ) ) ) {
if ( match ) { if ( match ) {
// Don't consume trailing commas as valid // Don't consume trailing commas as valid
soFar = soFar.slice( match[ 0 ].length ) || soFar; soFar = soFar.slice( match[ 0 ].length ) || soFar;
} }
@ -1670,6 +1823,7 @@ tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
matched = match.shift(); matched = match.shift();
tokens.push( { tokens.push( {
value: matched, value: matched,
// Cast descendant combinators to space // Cast descendant combinators to space
type: match[ 0 ].replace( rtrim, " " ) type: match[ 0 ].replace( rtrim, " " )
} ); } );
@ -1702,6 +1856,7 @@ tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
soFar.length : soFar.length :
soFar ? soFar ?
Sizzle.error( selector ) : Sizzle.error( selector ) :
// Cache the tokens // Cache the tokens
tokenCache( selector, groups ).slice( 0 ); tokenCache( selector, groups ).slice( 0 );
}; };
@ -1724,6 +1879,7 @@ function addCombinator( matcher, combinator, base ) {
doneName = done++; doneName = done++;
return combinator.first ? return combinator.first ?
// Check against closest ancestor/preceding element // Check against closest ancestor/preceding element
function( elem, context, xml ) { function( elem, context, xml ) {
while ( ( elem = elem[ dir ] ) ) { while ( ( elem = elem[ dir ] ) ) {
@ -1755,7 +1911,8 @@ function addCombinator( matcher, combinator, base ) {
// Support: IE <9 only // Support: IE <9 only
// Defend against cloned attroperties (jQuery gh-1709) // Defend against cloned attroperties (jQuery gh-1709)
uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {}); uniqueCache = outerCache[ elem.uniqueID ] ||
( outerCache[ elem.uniqueID ] = {} );
if ( skip && skip === elem.nodeName.toLowerCase() ) { if ( skip && skip === elem.nodeName.toLowerCase() ) {
elem = elem[ dir ] || elem; elem = elem[ dir ] || elem;
@ -1765,6 +1922,7 @@ function addCombinator( matcher, combinator, base ) {
// Assign to newCache so results back-propagate to previous elements // Assign to newCache so results back-propagate to previous elements
return ( newCache[ 2 ] = oldCache[ 2 ] ); return ( newCache[ 2 ] = oldCache[ 2 ] );
} else { } else {
// Reuse newcache so results back-propagate to previous elements // Reuse newcache so results back-propagate to previous elements
uniqueCache[ key ] = newCache; uniqueCache[ key ] = newCache;
@ -1838,7 +1996,11 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS
preexisting = results.length, preexisting = results.length,
// Get initial elements from seed or context // Get initial elements from seed or context
elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), elems = seed || multipleContexts(
selector || "*",
context.nodeType ? [ context ] : context,
[]
),
// Prefilter to get matcher input, preserving a map for seed-results synchronization // Prefilter to get matcher input, preserving a map for seed-results synchronization
matcherIn = preFilter && ( seed || !selector ) ? matcherIn = preFilter && ( seed || !selector ) ?
@ -1846,6 +2008,7 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS
elems, elems,
matcherOut = matcher ? matcherOut = matcher ?
// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
postFinder || ( seed ? preFilter : preexisting || postFilter ) ? postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
@ -1878,11 +2041,13 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS
if ( seed ) { if ( seed ) {
if ( postFinder || preFilter ) { if ( postFinder || preFilter ) {
if ( postFinder ) { if ( postFinder ) {
// Get the final matcherOut by condensing this intermediate into postFinder contexts // Get the final matcherOut by condensing this intermediate into postFinder contexts
temp = []; temp = [];
i = matcherOut.length; i = matcherOut.length;
while ( i-- ) { while ( i-- ) {
if ( ( elem = matcherOut[ i ] ) ) { if ( ( elem = matcherOut[ i ] ) ) {
// Restore matcherIn since elem is not yet a final match // Restore matcherIn since elem is not yet a final match
temp.push( ( matcherIn[ i ] = elem ) ); temp.push( ( matcherIn[ i ] = elem ) );
} }
@ -1936,6 +2101,7 @@ function matcherFromTokens( tokens ) {
( checkContext = context ).nodeType ? ( checkContext = context ).nodeType ?
matchContext( elem, context, xml ) : matchContext( elem, context, xml ) :
matchAnyContext( elem, context, xml ) ); matchAnyContext( elem, context, xml ) );
// Avoid hanging onto element (issue #299) // Avoid hanging onto element (issue #299)
checkContext = null; checkContext = null;
return ret; return ret;
@ -1949,6 +2115,7 @@ function matcherFromTokens( tokens ) {
// Return special upon seeing a positional matcher // Return special upon seeing a positional matcher
if ( matcher[ expando ] ) { if ( matcher[ expando ] ) {
// Find the next relative operator (if any) for proper handling // Find the next relative operator (if any) for proper handling
j = ++i; j = ++i;
for ( ; j < len; j++ ) { for ( ; j < len; j++ ) {
@ -1959,8 +2126,11 @@ function matcherFromTokens( tokens ) {
return setMatcher( return setMatcher(
i > 1 && elementMatcher( matchers ), i > 1 && elementMatcher( matchers ),
i > 1 && toSelector( i > 1 && toSelector(
// If the preceding token was a descendant combinator, insert an implicit any-element `*` // If the preceding token was a descendant combinator, insert an implicit any-element `*`
tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) tokens
.slice( 0, i - 1 )
.concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } )
).replace( rtrim, "$1" ), ).replace( rtrim, "$1" ),
matcher, matcher,
i < j && matcherFromTokens( tokens.slice( i, j ) ), i < j && matcherFromTokens( tokens.slice( i, j ) ),
@ -1985,14 +2155,21 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
unmatched = seed && [], unmatched = seed && [],
setMatched = [], setMatched = [],
contextBackup = outermostContext, contextBackup = outermostContext,
// We must always have either seed elements or outermost context // We must always have either seed elements or outermost context
elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ), elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ),
// Use integer dirruns iff this is the outermost matcher // Use integer dirruns iff this is the outermost matcher
dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ),
len = elems.length; len = elems.length;
if ( outermost ) { if ( outermost ) {
outermostContext = context === document || context || outermost;
// Support: IE 11+, Edge 17 - 18+
// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
// two documents; shallow comparisons work.
// eslint-disable-next-line eqeqeq
outermostContext = context == document || context || outermost;
} }
// Add elements passing elementMatchers directly to results // Add elements passing elementMatchers directly to results
@ -2001,7 +2178,12 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) {
if ( byElement && elem ) { if ( byElement && elem ) {
j = 0; j = 0;
if ( !context && elem.ownerDocument !== document ) {
// Support: IE 11+, Edge 17 - 18+
// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
// two documents; shallow comparisons work.
// eslint-disable-next-line eqeqeq
if ( !context && elem.ownerDocument != document ) {
setDocument( elem ); setDocument( elem );
xml = !documentIsHTML; xml = !documentIsHTML;
} }
@ -2018,6 +2200,7 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
// Track unmatched elements for set filters // Track unmatched elements for set filters
if ( bySet ) { if ( bySet ) {
// They will have gone through all possible matchers // They will have gone through all possible matchers
if ( ( elem = !matcher && elem ) ) { if ( ( elem = !matcher && elem ) ) {
matchedCount--; matchedCount--;
@ -2048,6 +2231,7 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
} }
if ( seed ) { if ( seed ) {
// Reintegrate element matches to eliminate the need for sorting // Reintegrate element matches to eliminate the need for sorting
if ( matchedCount > 0 ) { if ( matchedCount > 0 ) {
while ( i-- ) { while ( i-- ) {
@ -2093,6 +2277,7 @@ compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
cached = compilerCache[ selector + " " ]; cached = compilerCache[ selector + " " ];
if ( !cached ) { if ( !cached ) {
// Generate a function of recursive functions that can be used to check each element // Generate a function of recursive functions that can be used to check each element
if ( !match ) { if ( !match ) {
match = tokenize( selector ); match = tokenize( selector );
@ -2108,7 +2293,10 @@ compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
} }
// Cache the compiled function // Cache the compiled function
cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); cached = compilerCache(
selector,
matcherFromGroupMatchers( elementMatchers, setMatchers )
);
// Save selector and tokenization // Save selector and tokenization
cached.selector = selector; cached.selector = selector;
@ -2141,7 +2329,8 @@ select = Sizzle.select = function( selector, context, results, seed ) {
if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" &&
context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) {
context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; context = ( Expr.find[ "ID" ]( token.matches[ 0 ]
.replace( runescape, funescape ), context ) || [] )[ 0 ];
if ( !context ) { if ( !context ) {
return results; return results;
@ -2163,10 +2352,12 @@ select = Sizzle.select = function( selector, context, results, seed ) {
break; break;
} }
if ( ( find = Expr.find[ type ] ) ) { if ( ( find = Expr.find[ type ] ) ) {
// Search, expanding context for leading sibling combinators // Search, expanding context for leading sibling combinators
if ( ( seed = find( if ( ( seed = find(
token.matches[ 0 ].replace( runescape, funescape ), token.matches[ 0 ].replace( runescape, funescape ),
rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) ||
context
) ) ) { ) ) ) {
// If seed is empty or no tokens remain, we can return early // If seed is empty or no tokens remain, we can return early
@ -2210,6 +2401,7 @@ setDocument();
// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) // Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
// Detached nodes confoundingly follow *each other* // Detached nodes confoundingly follow *each other*
support.sortDetached = assert( function( el ) { support.sortDetached = assert( function( el ) {
// Should return 1, but returns 4 (following) // Should return 1, but returns 4 (following)
return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1;
} ); } );
@ -2235,7 +2427,7 @@ if ( !support.attributes || !assert(function( el ) {
el.firstChild.setAttribute( "value", "" ); el.firstChild.setAttribute( "value", "" );
return el.firstChild.getAttribute( "value" ) === ""; return el.firstChild.getAttribute( "value" ) === "";
} ) ) { } ) ) {
addHandle( "value", function( elem, name, isXML ) { addHandle( "value", function( elem, _name, isXML ) {
if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
return elem.defaultValue; return elem.defaultValue;
} }
@ -2270,13 +2462,17 @@ Sizzle.noConflict = function() {
}; };
if ( typeof define === "function" && define.amd ) { if ( typeof define === "function" && define.amd ) {
define(function() { return Sizzle; }); define( function() {
return Sizzle;
} );
// Sizzle requires that there be a global window in Common-JS like environments // Sizzle requires that there be a global window in Common-JS like environments
} else if ( typeof module !== "undefined" && module.exports ) { } else if ( typeof module !== "undefined" && module.exports ) {
module.exports = Sizzle; module.exports = Sizzle;
} else { } else {
window.Sizzle = Sizzle; window.Sizzle = Sizzle;
} }
// EXPOSE // EXPOSE
} )( window ); } )( window );

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -61,7 +61,7 @@
"raw-body": "2.3.3", "raw-body": "2.3.3",
"requirejs": "2.3.6", "requirejs": "2.3.6",
"sinon": "2.3.7", "sinon": "2.3.7",
"sizzle": "2.3.4", "sizzle": "2.3.5",
"strip-json-comments": "2.0.1", "strip-json-comments": "2.0.1",
"testswarm": "1.1.0", "testswarm": "1.1.0",
"uglify-js": "3.4.7" "uglify-js": "3.4.7"