fix for #4512 and minor sizzle updates
[jquery.git] / src / selector.js
index 517ea60..b58507d 100644 (file)
@@ -8,7 +8,8 @@
 
 var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,
        done = 0,
-       toString = Object.prototype.toString;
+       toString = Object.prototype.toString,
+       hasDuplicate = false;
 
 var Sizzle = function(selector, context, results, seed) {
        results = results || [];
@@ -760,6 +761,7 @@ if ( document.documentElement.compareDocumentPosition ) {
        }
 
        root.removeChild( form );
+       root = form = null; // release memory in IE
 })();
 
 (function(){
@@ -800,6 +802,8 @@ if ( document.documentElement.compareDocumentPosition ) {
                        return elem.getAttribute("href", 2);
                };
        }
+
+       div = null; // release memory in IE
 })();
 
 if ( document.querySelectorAll ) (function(){
@@ -829,6 +833,8 @@ if ( document.querySelectorAll ) (function(){
        for ( var prop in oldSizzle ) {
                Sizzle[ prop ] = oldSizzle[ prop ];
        }
+
+       div = null; // release memory in IE
 })();
 
 if ( document.getElementsByClassName && document.documentElement.getElementsByClassName ) (function(){
@@ -851,6 +857,8 @@ if ( document.getElementsByClassName && document.documentElement.getElementsByCl
                        return context.getElementsByClassName(match[1]);
                }
        };
+
+       div = null; // release memory in IE
 })();
 
 function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
@@ -969,11 +977,17 @@ jQuery.expr = Sizzle.selectors;
 jQuery.expr[":"] = jQuery.expr.filters;
 
 Sizzle.selectors.filters.hidden = function(elem){
-       return elem.offsetWidth === 0 && elem.offsetHeight === 0;
+       var width = elem.offsetWidth, height = elem.offsetHeight,
+                force = /^tr$/i.test( elem.tagName ); // ticket #4512
+       return ( width === 0 && height === 0 && !force ) ?
+               true :
+                       ( width !== 0 && height !== 0 && !force ) ?
+                               false :
+                                       !!( jQuery.curCSS(elem, "display") === "none" );
 };
 
 Sizzle.selectors.filters.visible = function(elem){
-       return elem.offsetWidth > 0 || elem.offsetHeight > 0;
+       return !Sizzle.selectors.filters.hidden(elem);
 };
 
 Sizzle.selectors.filters.animated = function(elem){