]> source.dussan.org Git - jquery.git/commitdiff
Selector: Use shallow document comparisons in uniqueSort
authorMichał Gołębiowski-Owczarek <m.goleb@gmail.com>
Mon, 21 Oct 2019 17:04:48 +0000 (19:04 +0200)
committerGitHub <noreply@github.com>
Mon, 21 Oct 2019 17:04:48 +0000 (19:04 +0200)
IE/Edge sometimes crash when comparing documents between frames using the strict
equality operator (`===` & `!==`). Funnily enough, shallow comparisons
(`==` & `!=`) work without crashing.

The change to shallow comparisons in `src/selector.js` was done in gh-4471 but
relevant changes in `src/selector/uniqueSort.js` were missed. Those changes
have landed in Sizzle in jquery/sizzle#459.

Fixes gh-4441
Closes gh-4512
Ref gh-4471
Ref jquery/sizzle#459

src/selector/uniqueSort.js

index a0454812a1ed4397ea00b7381623f366e6f6b260..ec97de84935edbb1cff01b6d0572fb9ad18aa1bc 100644 (file)
@@ -24,7 +24,11 @@ function sortOrder( a, b ) {
        }
 
        // 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 ) :
 
                // Otherwise we know they are disconnected
@@ -34,11 +38,20 @@ function sortOrder( a, b ) {
        if ( compare & 1 ) {
 
                // Choose the first element that is related to the document
-               if ( a === document || a.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 ( a == document || a.ownerDocument == document &&
                        jQuery.contains( document, a ) ) {
                        return -1;
                }
-               if ( b === document || b.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 ( b == document || b.ownerDocument == document &&
                        jQuery.contains( document, b ) ) {
                        return 1;
                }