From f56f1784961a63f4118e43b1441ffc2f32ef5d41 Mon Sep 17 00:00:00 2001 From: timmywil Date: Thu, 13 Oct 2011 11:10:38 -0400 Subject: [PATCH] Avoid cache collisions with other Sizzles. Fixes #8539. --- sizzle.js | 30 +++++++++++++++++------------- test/unit/selector.js | 2 +- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/sizzle.js b/sizzle.js index 251ed124..184869df 100644 --- a/sizzle.js +++ b/sizzle.js @@ -7,6 +7,7 @@ (function(){ var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, + expando = "sizcache" + (Math.random() + '').replace('.', ''), done = 0, toString = Object.prototype.toString, hasDuplicate = false, @@ -772,7 +773,10 @@ var Expr = Sizzle.selectors = { }, CHILD: function( elem, match ) { - var type = match[1], + var first, last, + doneName, parent, cache, + count, diff, + type = match[1], node = elem; switch ( type ) { @@ -800,18 +804,18 @@ var Expr = Sizzle.selectors = { return true; case "nth": - var first = match[2], - last = match[3]; + first = match[2]; + last = match[3]; if ( first === 1 && last === 0 ) { return true; } - var doneName = match[0], - parent = elem.parentNode; + doneName = match[0]; + parent = elem.parentNode; - if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) { - var count = 0; + if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) { + count = 0; for ( node = parent.firstChild; node; node = node.nextSibling ) { if ( node.nodeType === 1 ) { @@ -819,10 +823,10 @@ var Expr = Sizzle.selectors = { } } - parent.sizcache = doneName; + parent[ expando ] = doneName; } - var diff = elem.nodeIndex - last; + diff = elem.nodeIndex - last; if ( first === 0 ) { return diff === 0; @@ -1320,13 +1324,13 @@ function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { elem = elem[dir]; while ( elem ) { - if ( elem.sizcache === doneName ) { + if ( elem[ expando ] === doneName ) { match = checkSet[elem.sizset]; break; } if ( elem.nodeType === 1 && !isXML ){ - elem.sizcache = doneName; + elem[ expando ] = doneName; elem.sizset = i; } @@ -1353,14 +1357,14 @@ function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { elem = elem[dir]; while ( elem ) { - if ( elem.sizcache === doneName ) { + if ( elem[ expando ] === doneName ) { match = checkSet[elem.sizset]; break; } if ( elem.nodeType === 1 ) { if ( !isXML ) { - elem.sizcache = doneName; + elem[ expando ] = doneName; elem.sizset = i; } diff --git a/test/unit/selector.js b/test/unit/selector.js index 3e287a7a..fbe5d914 100644 --- a/test/unit/selector.js +++ b/test/unit/selector.js @@ -197,7 +197,7 @@ test("name", function() { t( "Name selector non-input", "[name=div]", ["fadein"] ); t( "Name selector non-input", "*[name=iframe]", ["iframe"] ); - t( "Name selector for grouped input", "input[name='types[]']", ["types_all", "types_anime", "types_movie"] ) + t( "Name selector for grouped input", "input[name='types[]']", ["types_all", "types_anime", "types_movie"] ); same( jQuery("#form").find("input[name=action]").get(), q("text1"), "Name selector within the context of another element" ); same( jQuery("#form").find("input[name='foo[bar]']").get(), q("hidden2"), "Name selector for grouped form element within the context of another element" );