diff options
author | Michał Gołębiowski-Owczarek <m.goleb@gmail.com> | 2019-10-21 19:04:48 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-10-21 19:04:48 +0200 |
commit | 15750b0af270da07917b70457cf09bda97d3d935 (patch) | |
tree | 3e3371a3a6acdd9b777119e2b9d7351ea687c2aa | |
parent | f09d92100ffff6208211b200ed0cdc39bfd17fc3 (diff) | |
download | jquery-15750b0af270da07917b70457cf09bda97d3d935.tar.gz jquery-15750b0af270da07917b70457cf09bda97d3d935.zip |
Selector: Use shallow document comparisons in uniqueSort
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
-rw-r--r-- | src/selector/uniqueSort.js | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/src/selector/uniqueSort.js b/src/selector/uniqueSort.js index a0454812a..ec97de849 100644 --- a/src/selector/uniqueSort.js +++ b/src/selector/uniqueSort.js @@ -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; } |