From 237b916b0d609c27082f952b0c4aa266fe637ca5 Mon Sep 17 00:00:00 2001 From: Ed Sanders Date: Thu, 27 Jun 2019 16:34:36 +0100 Subject: [PATCH] TableSorter: Avoid Sizzle selectors Change-Id: I7637395afcc7bee3a81f959569ee32ab5b83040c --- .../jquery.tablesorter/jquery.tablesorter.js | 4 +- .../jquery/jquery.tablesorter.test.js | 152 +++++++++--------- 2 files changed, 81 insertions(+), 75 deletions(-) diff --git a/resources/src/jquery.tablesorter/jquery.tablesorter.js b/resources/src/jquery.tablesorter/jquery.tablesorter.js index c1b83fde61..4a506eef92 100644 --- a/resources/src/jquery.tablesorter/jquery.tablesorter.js +++ b/resources/src/jquery.tablesorter/jquery.tablesorter.js @@ -283,7 +283,7 @@ } $thead.append( this ); } ); - $table.find( ' > tbody:first' ).before( $thead ); + $table.find( ' > tbody' ).first().before( $thead ); } if ( !$table.get( 0 ).tFoot ) { $tfoot = $( '' ); @@ -322,7 +322,7 @@ headerIndex, exploded, $tableHeaders = $( [] ), - $tableRows = $( 'thead:eq(0) > tr', table ); + $tableRows = $( table ).find( 'thead' ).eq( 0 ).find( '> tr' ); if ( $tableRows.length <= 1 ) { $tableHeaders = $tableRows.children( 'th' ); diff --git a/tests/qunit/suites/resources/jquery/jquery.tablesorter.test.js b/tests/qunit/suites/resources/jquery/jquery.tablesorter.test.js index bd6ee166a0..fc0eecc1f9 100644 --- a/tests/qunit/suites/resources/jquery/jquery.tablesorter.test.js +++ b/tests/qunit/suites/resources/jquery/jquery.tablesorter.test.js @@ -369,7 +369,7 @@ planetsAscName, function ( $table ) { $table.tablesorter(); - $table.find( '.headerSort:eq(0)' ).trigger( 'click' ); + $table.find( '.headerSort' ).eq( 0 ).trigger( 'click' ); } ); tableTest( @@ -379,7 +379,7 @@ planetsAscName, function ( $table ) { $table.tablesorter(); - $table.find( '.headerSort:eq(0)' ).trigger( 'click' ); + $table.find( '.headerSort' ).eq( 0 ).trigger( 'click' ); } ); tableTest( @@ -389,9 +389,9 @@ planetsAscName, function ( $table ) { $table.tablesorter(); - $table.find( '.headerSort:eq(0)' ).trigger( 'click' ); - $table.find( '.headerSort:eq(1)' ).trigger( 'click' ); - $table.find( '.headerSort:eq(0)' ).trigger( 'click' ); + $table.find( '.headerSort' ).eq( 0 ).trigger( 'click' ); + $table.find( '.headerSort' ).eq( 1 ).trigger( 'click' ); + $table.find( '.headerSort' ).eq( 0 ).trigger( 'click' ); } ); tableTest( @@ -401,7 +401,7 @@ reversed( planetsAscName ), function ( $table ) { $table.tablesorter(); - $table.find( '.headerSort:eq(0)' ).trigger( 'click' ).trigger( 'click' ); + $table.find( '.headerSort' ).eq( 0 ).trigger( 'click' ).trigger( 'click' ); } ); tableTest( @@ -411,7 +411,7 @@ planetsAscRadius, function ( $table ) { $table.tablesorter(); - $table.find( '.headerSort:eq(1)' ).trigger( 'click' ); + $table.find( '.headerSort' ).eq( 1 ).trigger( 'click' ); } ); tableTest( @@ -421,7 +421,7 @@ reversed( planetsAscRadius ), function ( $table ) { $table.tablesorter(); - $table.find( '.headerSort:eq(1)' ).trigger( 'click' ).trigger( 'click' ); + $table.find( '.headerSort' ).eq( 1 ).trigger( 'click' ).trigger( 'click' ); } ); tableTest( @@ -483,7 +483,7 @@ $table.tablesorter( { sortList: [ { 0: 'asc' }, { 1: 'asc' } ] } ); - $table.find( '.headerSort:eq(0)' ).trigger( 'click' ); + $table.find( '.headerSort' ).eq( 0 ).trigger( 'click' ); } ); tableTest( @@ -496,12 +496,12 @@ $table.tablesorter( { sortList: [ { 0: 'desc' }, { 1: 'desc' } ] } ); - $table.find( '.headerSort:eq(0)' ).trigger( 'click' ); + $table.find( '.headerSort' ).eq( 0 ).trigger( 'click' ); // Pretend to click while pressing the multi-sort key event = $.Event( 'click' ); event[ $table.data( 'tablesorter' ).config.sortMultiSortKey ] = true; - $table.find( '.headerSort:eq(1)' ).trigger( event ); + $table.find( '.headerSort' ).eq( 1 ).trigger( event ); } ); QUnit.test( 'Reset sorting making table appear unsorted', function ( assert ) { @@ -541,11 +541,12 @@ [ aaa1, aab5, abc3, bbc2, caa4 ], function ( $table ) { // Make colspanned header for test - $table.find( 'tr:eq(0) th:eq(1), tr:eq(0) th:eq(2)' ).remove(); - $table.find( 'tr:eq(0) th:eq(0)' ).attr( 'colspan', '3' ); + $table.find( 'tr th' ).eq( 1 ).remove(); + $table.find( 'tr th' ).eq( 1 ).remove(); + $table.find( 'tr th' ).eq( 0 ).attr( 'colspan', '3' ); $table.tablesorter(); - $table.find( '.headerSort:eq(0)' ).trigger( 'click' ); + $table.find( '.headerSort' ).eq( 0 ).trigger( 'click' ); } ); tableTest( 'Sorting with colspanned headers: sort spanned column twice', @@ -554,12 +555,13 @@ [ caa4, bbc2, abc3, aab5, aaa1 ], function ( $table ) { // Make colspanned header for test - $table.find( 'tr:eq(0) th:eq(1), tr:eq(0) th:eq(2)' ).remove(); - $table.find( 'tr:eq(0) th:eq(0)' ).attr( 'colspan', '3' ); + $table.find( 'tr th' ).eq( 1 ).remove(); + $table.find( 'tr th' ).eq( 1 ).remove(); + $table.find( 'tr' ).eq( 0 ).find( 'th' ).eq( 0 ).attr( 'colspan', '3' ); $table.tablesorter(); - $table.find( '.headerSort:eq(0)' ).trigger( 'click' ); - $table.find( '.headerSort:eq(0)' ).trigger( 'click' ); + $table.find( '.headerSort' ).eq( 0 ).trigger( 'click' ); + $table.find( '.headerSort' ).eq( 0 ).trigger( 'click' ); } ); tableTest( 'Sorting with colspanned headers: subsequent column', @@ -568,11 +570,12 @@ [ aaa1, bbc2, abc3, caa4, aab5 ], function ( $table ) { // Make colspanned header for test - $table.find( 'tr:eq(0) th:eq(1), tr:eq(0) th:eq(2)' ).remove(); - $table.find( 'tr:eq(0) th:eq(0)' ).attr( 'colspan', '3' ); + $table.find( 'tr th' ).eq( 1 ).remove(); + $table.find( 'tr th' ).eq( 1 ).remove(); + $table.find( 'tr th' ).eq( 0 ).attr( 'colspan', '3' ); $table.tablesorter(); - $table.find( '.headerSort:eq(1)' ).trigger( 'click' ); + $table.find( '.headerSort' ).eq( 1 ).trigger( 'click' ); } ); tableTest( 'Sorting with colspanned headers: sort subsequent column twice', @@ -581,22 +584,23 @@ [ aab5, caa4, abc3, bbc2, aaa1 ], function ( $table ) { // Make colspanned header for test - $table.find( 'tr:eq(0) th:eq(1), tr:eq(0) th:eq(2)' ).remove(); - $table.find( 'tr:eq(0) th:eq(0)' ).attr( 'colspan', '3' ); + $table.find( 'tr th' ).eq( 1 ).remove(); + $table.find( 'tr th' ).eq( 1 ).remove(); + $table.find( 'tr th' ).eq( 0 ).attr( 'colspan', '3' ); $table.tablesorter(); - $table.find( '.headerSort:eq(1)' ).trigger( 'click' ); - $table.find( '.headerSort:eq(1)' ).trigger( 'click' ); + $table.find( '.headerSort' ).eq( 1 ).trigger( 'click' ); + $table.find( '.headerSort' ).eq( 1 ).trigger( 'click' ); } ); QUnit.test( 'Basic planet table: one unsortable column', function ( assert ) { var $table = tableCreate( header, planets ), $cell; - $table.find( 'tr:eq(0) > th:eq(0)' ).addClass( 'unsortable' ); + $table.find( 'tr > th' ).eq( 0 ).addClass( 'unsortable' ); $table.tablesorter(); - $table.find( 'tr:eq(0) > th:eq(0)' ).trigger( 'click' ); + $table.find( 'tr > th' ).eq( 0 ).trigger( 'click' ); assert.deepEqual( tableExtract( $table ), @@ -604,8 +608,8 @@ 'table not sorted' ); - $cell = $table.find( 'tr:eq(0) > th:eq(0)' ); - $table.find( 'tr:eq(0) > th:eq(1)' ).trigger( 'click' ); + $cell = $table.find( 'tr > th' ).eq( 0 ); + $table.find( 'tr > th' ).eq( 1 ).trigger( 'click' ); assert.strictEqual( $cell.hasClass( 'headerSortUp' ) || $cell.hasClass( 'headerSortDown' ), @@ -646,7 +650,7 @@ mw.config.set( 'wgPageContentLanguage', 'de' ); $table.tablesorter(); - $table.find( '.headerSort:eq(0)' ).trigger( 'click' ); + $table.find( '.headerSort' ).eq( 0 ).trigger( 'click' ); } ); @@ -673,7 +677,7 @@ mw.config.set( 'wgDefaultDateFormat', 'mdy' ); $table.tablesorter(); - $table.find( '.headerSort:eq(0)' ).trigger( 'click' ); + $table.find( '.headerSort' ).eq( 0 ).trigger( 'click' ); } ); @@ -684,7 +688,7 @@ ipv4Sorted, function ( $table ) { $table.tablesorter(); - $table.find( '.headerSort:eq(0)' ).trigger( 'click' ); + $table.find( '.headerSort' ).eq( 0 ).trigger( 'click' ); } ); tableTest( @@ -694,7 +698,7 @@ reversed( ipv4Sorted ), function ( $table ) { $table.tablesorter(); - $table.find( '.headerSort:eq(0)' ).trigger( 'click' ).trigger( 'click' ); + $table.find( '.headerSort' ).eq( 0 ).trigger( 'click' ).trigger( 'click' ); } ); @@ -712,7 +716,7 @@ } ); $table.tablesorter(); - $table.find( '.headerSort:eq(0)' ).trigger( 'click' ); + $table.find( '.headerSort' ).eq( 0 ).trigger( 'click' ); } ); @@ -728,7 +732,7 @@ } ); $table.tablesorter(); - $table.find( '.headerSort:eq(0)' ).trigger( 'click' ); + $table.find( '.headerSort' ).eq( 0 ).trigger( 'click' ); } ); @@ -737,15 +741,16 @@ // Modify the table to have a multiple-row-spanning cell: // - Remove 2nd cell of 4th row, and, 2nd cell or 5th row. - $table.find( 'tr:eq(3) td:eq(1), tr:eq(4) td:eq(1)' ).remove(); + $table.find( 'tr' ).eq( 3 ).find( 'td' ).eq( 1 ).remove(); + $table.find( 'tr' ).eq( 4 ).find( 'td' ).eq( 1 ).remove(); // - Set rowspan for 2nd cell of 3rd row to 3. // This covers the removed cell in the 4th and 5th row. - $table.find( 'tr:eq(2) td:eq(1)' ).attr( 'rowspan', '3' ); + $table.find( 'tr' ).eq( 2 ).find( 'td' ).eq( 1 ).attr( 'rowspan', '3' ); $table.tablesorter(); assert.strictEqual( - $table.find( 'tr:eq(2) td:eq(1)' ).prop( 'rowSpan' ), + $table.find( 'tr' ).eq( 2 ).find( 'td' ).eq( 1 ).prop( 'rowSpan' ), 3, 'Rowspan not exploded' ); @@ -769,13 +774,14 @@ function ( $table ) { // Modify the table to have a multiple-row-spanning cell: // - Remove 2nd cell of 4th row, and, 2nd cell or 5th row. - $table.find( 'tr:eq(3) td:eq(1), tr:eq(4) td:eq(1)' ).remove(); + $table.find( 'tr' ).eq( 3 ).find( 'td' ).eq( 1 ).remove(); + $table.find( 'tr' ).eq( 4 ).find( 'td' ).eq( 1 ).remove(); // - Set rowspan for 2nd cell of 3rd row to 3. // This covers the removed cell in the 4th and 5th row. - $table.find( 'tr:eq(2) td:eq(1)' ).attr( 'rowspan', '3' ); + $table.find( 'tr' ).eq( 2 ).find( 'td' ).eq( 1 ).attr( 'rowspan', '3' ); $table.tablesorter(); - $table.find( '.headerSort:eq(0)' ).trigger( 'click' ); + $table.find( '.headerSort' ).eq( 0 ).trigger( 'click' ); } ); tableTest( @@ -786,10 +792,11 @@ function ( $table ) { // Modify the table to have a multiple-row-spanning cell: // - Remove 2nd cell of 4th row, and, 2nd cell or 5th row. - $table.find( 'tr:eq(3) td:eq(1), tr:eq(4) td:eq(1)' ).remove(); + $table.find( 'tr' ).eq( 3 ).find( 'td' ).eq( 1 ).remove(); + $table.find( 'tr' ).eq( 4 ).find( 'td' ).eq( 1 ).remove(); // - Set rowspan for 2nd cell of 3rd row to 3. // This covers the removed cell in the 4th and 5th row. - $table.find( 'tr:eq(2) td:eq(1)' ).attr( 'rowspan', '3' ); + $table.find( 'tr' ).eq( 2 ).find( 'td' ).eq( 1 ).attr( 'rowspan', '3' ); $table.tablesorter( { sortList: [ { 0: 'asc' } @@ -804,13 +811,14 @@ function ( $table ) { // Modify the table to have a multiple-row-spanning cell: // - Remove 1st cell of 4th row, and, 1st cell or 5th row. - $table.find( 'tr:eq(3) td:eq(0), tr:eq(4) td:eq(0)' ).remove(); + $table.find( 'tr' ).eq( 3 ).find( 'td' ).eq( 0 ).remove(); + $table.find( 'tr' ).eq( 4 ).find( 'td' ).eq( 0 ).remove(); // - Set rowspan for 1st cell of 3rd row to 3. // This covers the removed cell in the 4th and 5th row. - $table.find( 'tr:eq(2) td:eq(0)' ).attr( 'rowspan', '3' ); + $table.find( 'tr' ).eq( 2 ).find( 'td' ).eq( 0 ).attr( 'rowspan', '3' ); $table.tablesorter(); - $table.find( '.headerSort:eq(0)' ).trigger( 'click' ); + $table.find( '.headerSort' ).eq( 0 ).trigger( 'click' ); } ); @@ -823,7 +831,7 @@ mw.config.set( 'wgDefaultDateFormat', 'mdy' ); $table.tablesorter(); - $table.find( '.headerSort:eq(0)' ).trigger( 'click' ); + $table.find( '.headerSort' ).eq( 0 ).trigger( 'click' ); } ); @@ -834,7 +842,7 @@ currencySorted, function ( $table ) { $table.tablesorter(); - $table.find( '.headerSort:eq(0)' ).trigger( 'click' ); + $table.find( '.headerSort' ).eq( 0 ).trigger( 'click' ); } ); @@ -848,9 +856,9 @@ planets, planetsAscNameLegacy, function ( $table ) { - $table.find( 'tr:last' ).addClass( 'sortbottom' ); + $table.find( 'tr' ).last().addClass( 'sortbottom' ); $table.tablesorter(); - $table.find( '.headerSort:eq(0)' ).trigger( 'click' ); + $table.find( '.headerSort' ).eq( 0 ).trigger( 'click' ); } ); @@ -865,7 +873,7 @@ '' ); $table.tablesorter(); - $table.find( '.headerSort:eq(0)' ).trigger( 'click' ); + $table.find( '.headerSort' ).eq( 0 ).trigger( 'click' ); assert.strictEqual( $table.data( 'tablesorter' ).config.parsers[ 0 ].id, @@ -910,7 +918,7 @@ 'Dolphin' + '' ); - $table.tablesorter().find( '.headerSort:eq(0)' ).trigger( 'click' ); + $table.tablesorter().find( '.headerSort' ).eq( 0 ).trigger( 'click' ); data = []; $table.find( 'tbody > tr' ).each( function ( i, tr ) { @@ -957,7 +965,7 @@ 'H' + '' ); - $table.tablesorter().find( '.headerSort:eq(0)' ).trigger( 'click' ); + $table.tablesorter().find( '.headerSort' ).eq( 0 ).trigger( 'click' ); data = []; $table.find( 'tbody > tr' ).each( function ( i, tr ) { @@ -1009,9 +1017,7 @@ '' ); // initialize table sorter and sort once - $table - .tablesorter() - .find( '.headerSort:eq(0)' ).trigger( 'click' ); + $table.tablesorter().find( '.headerSort' ).eq( 0 ).trigger( 'click' ); // Change the sortValue data properties (T40152) // - change data @@ -1022,8 +1028,8 @@ $table.find( 'td:contains(G)' ).removeData( 'sortValue' ); // Now sort again (twice, so it is back at Ascending) - $table.find( '.headerSort:eq(0)' ).trigger( 'click' ); - $table.find( '.headerSort:eq(0)' ).trigger( 'click' ); + $table.find( '.headerSort' ).eq( 0 ).trigger( 'click' ); + $table.find( '.headerSort' ).eq( 0 ).trigger( 'click' ); data = []; $table.find( 'tbody > tr' ).each( function ( i, tr ) { @@ -1064,7 +1070,7 @@ [ 'Numbers' ], numbers, numbersAsc, function ( $table ) { $table.tablesorter(); - $table.find( '.headerSort:eq(0)' ).trigger( 'click' ); + $table.find( '.headerSort' ).eq( 0 ).trigger( 'click' ); } ); @@ -1072,7 +1078,7 @@ [ 'Numbers' ], numbers, reversed( numbersAsc ), function ( $table ) { $table.tablesorter(); - $table.find( '.headerSort:eq(0)' ).trigger( 'click' ).trigger( 'click' ); + $table.find( '.headerSort' ).eq( 0 ).trigger( 'click' ).trigger( 'click' ); } ); // TODO add numbers sorting tests for T10115 with a different language @@ -1091,7 +1097,7 @@ $table.tablesorter(); assert.strictEqual( - $table.find( '> thead:eq(0) > tr > th.headerSort' ).length, + $table.find( '> thead > tr > th.headerSort' ).length, 1, 'Child tables inside a headercell should not interfere with sortable headers (T34888)' ); @@ -1111,7 +1117,7 @@ mw.config.set( 'wgDefaultDateFormat', 'mdy' ); $table.tablesorter(); - $table.find( '.headerSort:eq(0)' ).trigger( 'click' ); + $table.find( '.headerSort' ).eq( 0 ).trigger( 'click' ); } ); @@ -1124,7 +1130,7 @@ mw.config.set( 'wgDefaultDateFormat', 'dmy' ); $table.tablesorter(); - $table.find( '.headerSort:eq(0)' ).trigger( 'click' ); + $table.find( '.headerSort' ).eq( 0 ).trigger( 'click' ); } ); @@ -1137,7 +1143,7 @@ mw.config.set( 'wgDefaultDateFormat', 'dmy' ); $table.tablesorter(); - $table.find( '.headerSort:eq(0)' ).trigger( 'click' ); + $table.find( '.headerSort' ).eq( 0 ).trigger( 'click' ); } ); @@ -1149,7 +1155,7 @@ '1' + '' ); - $table.tablesorter().find( '.headerSort:eq(0)' ).trigger( 'click' ); + $table.tablesorter().find( '.headerSort' ).eq( 0 ).trigger( 'click' ); assert.strictEqual( $table.find( 'td' ).first().text(), @@ -1170,7 +1176,7 @@ 'AC' + '' ); - $table.tablesorter().find( '.headerSort:eq(0)' ).trigger( 'click' ); + $table.tablesorter().find( '.headerSort' ).eq( 0 ).trigger( 'click' ); assert.strictEqual( $table.find( 'td' ).text(), @@ -1189,7 +1195,7 @@ '4' + '' ); - $table.tablesorter().find( '.headerSort:eq(0)' ).trigger( 'click' ); + $table.tablesorter().find( '.headerSort' ).eq( 0 ).trigger( 'click' ); assert.strictEqual( $table.find( 'td' ).text(), @@ -1323,7 +1329,7 @@ '' ); $table.tablesorter(); - assert.strictEqual( $table.find( 'tr:eq(1) th:eq(1)' ).data( 'headerIndex' ), + assert.strictEqual( $table.find( 'tr' ).eq( 1 ).find( 'th' ).eq( 1 ).data( 'headerIndex' ), 2, 'Incorrect index of sort header' ); @@ -1440,9 +1446,9 @@ '' ); $table.tablesorter(); - $table.find( '.headerSort:eq(0)' ).trigger( 'click' ); + $table.find( '.headerSort' ).eq( 0 ).trigger( 'click' ); // now the first row have 2 columns - $table.find( '.headerSort:eq(1)' ).trigger( 'click' ); + $table.find( '.headerSort' ).eq( 1 ).trigger( 'click' ); parsers = $table.data( 'tablesorter' ).config.parsers; @@ -1459,7 +1465,7 @@ ); assert.strictEqual( - parsers[ 1 ].format( $table.find( 'tbody > tr > td:eq(1)' ).text() ), + parsers[ 1 ].format( $table.find( 'tbody > tr > td' ).eq( 1 ).text() ), -Infinity, 'empty cell is sorted as number -Infinity' ); @@ -1478,7 +1484,7 @@ '' ); $table.tablesorter(); - $table.find( '.headerSort:eq(0)' ).trigger( 'click' ); + $table.find( '.headerSort' ).eq( 0 ).trigger( 'click' ); assert.deepEqual( tableExtract( $table ), @@ -1509,7 +1515,7 @@ '' ); $table.tablesorter(); - $table.find( '.headerSort:eq(0)' ).trigger( 'click' ); + $table.find( '.headerSort' ).eq( 0 ).trigger( 'click' ); assert.deepEqual( tableExtract( $table ), -- 2.20.1