Skip to content

Commit

Permalink
Core: Don't rely on splice being present on input
Browse files Browse the repository at this point in the history
Without this fix calling `jQuery.uniqueSort` on an array-like can result in:

TypeError: results.splice is not a function
    at Function.jQuery.uniqueSort (https://code.jquery.com/jquery-git.js:664:12)
    at jQuery.fn.init.find (https://code.jquery.com/jquery-git.js:2394:27)
    at gocusihafe.js:3:4

Closes gh-4986
  • Loading branch information
bubbatls committed Jan 24, 2022
1 parent eb9ceb2 commit 9c6f64c
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 6 deletions.
3 changes: 2 additions & 1 deletion src/selector/uniqueSort.js
@@ -1,6 +1,7 @@
import jQuery from "../core.js";
import document from "../var/document.js";
import sort from "../var/sort.js";
import splice from "../var/splice.js";

var hasDuplicate;

Expand Down Expand Up @@ -80,7 +81,7 @@ jQuery.uniqueSort = function( results ) {
}
}
while ( j-- ) {
results.splice( duplicates[ j ], 1 );
splice.call( results, duplicates[ j ], 1 );
}
}

Expand Down
3 changes: 3 additions & 0 deletions src/var/splice.js
@@ -0,0 +1,3 @@
import arr from "./arr.js";

export default arr.splice;
12 changes: 7 additions & 5 deletions test/unit/selector.js
Expand Up @@ -1895,9 +1895,7 @@ QUnit.test( "jQuery.uniqueSort", function( assert ) {
}
}
Arrayish.prototype = {
slice: [].slice,
sort: [].sort,
splice: [].splice
sliceForTestOnly: [].slice
};

var i, tests,
Expand Down Expand Up @@ -1959,8 +1957,12 @@ QUnit.test( "jQuery.uniqueSort", function( assert ) {

jQuery.each( tests, function( label, test ) {
var length = test.length || test.input.length;
assert.deepEqual( jQuery.uniqueSort( test.input ).slice( 0, length ), test.expected, label + " (array)" );
assert.deepEqual( jQuery.uniqueSort( new Arrayish( test.input ) ).slice( 0, length ), test.expected, label + " (quasi-array)" );
// We duplicate `test.input` because otherwise it is modified by `uniqueSort`
// and the second test becomes worthless.
assert.deepEqual( jQuery.uniqueSort( test.input.slice( 0 ) ).slice( 0, length ),
test.expected, label + " (array)" );
assert.deepEqual( jQuery.uniqueSort( new Arrayish( test.input ) ).sliceForTestOnly( 0, length ),
test.expected, label + " (quasi-array)" );
} );
} );

Expand Down

0 comments on commit 9c6f64c

Please sign in to comment.