From d2947d5e163002e6a92f4b08c268becb0b19f197 Mon Sep 17 00:00:00 2001 From: Derk-Jan Hartman Date: Thu, 7 Aug 2014 09:37:43 +0100 Subject: [PATCH] jquery.tablesorter: Only look at th's for headers If there would be td cells inside the thead, then these would be counted too for longest header row. This was not possible in wikitext, but was possible in MediaWiki tables. And $.unique sets fields to undefined instead of deleting them, which causes a nasty tough to spot counting mistake (which was even known due to a testcase having a comment confirming that the count was off) Bug: 53527 Change-Id: Ie551cd62275dd80560643131d68435166732d367 --- resources/src/jquery/jquery.tablesorter.js | 4 +-- .../jquery/jquery.tablesorter.test.js | 27 ++++++++++++++++--- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/resources/src/jquery/jquery.tablesorter.js b/resources/src/jquery/jquery.tablesorter.js index 5b1e2a7f30..ae2853640d 100644 --- a/resources/src/jquery/jquery.tablesorter.js +++ b/resources/src/jquery/jquery.tablesorter.js @@ -331,14 +331,14 @@ } ); // We want to find the row that has the most columns (ignoring colspan) $.each( exploded, function ( index, cellArray ) { - headerCount = $.unique( $( cellArray ) ).length; + headerCount = $( uniqueElements( cellArray ) ).filter( 'th' ).length; if ( headerCount >= maxSeen ) { maxSeen = headerCount; longestTR = index; } } ); // We cannot use $.unique() here because it sorts into dom order, which is undesirable - $tableHeaders = $( uniqueElements( exploded[longestTR] ) ); + $tableHeaders = $( uniqueElements( exploded[longestTR] ) ).filter( 'th' ); } // as each header can span over multiple columns (using colspan=N), diff --git a/tests/qunit/suites/resources/jquery/jquery.tablesorter.test.js b/tests/qunit/suites/resources/jquery/jquery.tablesorter.test.js index 2fd3ce9811..92dad9ffcf 100644 --- a/tests/qunit/suites/resources/jquery/jquery.tablesorter.test.js +++ b/tests/qunit/suites/resources/jquery/jquery.tablesorter.test.js @@ -1161,12 +1161,33 @@ ); $table.tablesorter(); assert.equal( $table.find( '#A2' ).prop( 'headerIndex' ), - 0, + undefined, 'A2 should not be a sort header' ); assert.equal( $table.find( '#C1' ).prop( 'headerIndex' ), - 1, - 'C1 should be a sort header, but will sort the wrong column' + 2, + 'C1 should be a sort header' + ); + } ); + + // bug 53527 + QUnit.test( 'td cells in thead should not be taken into account for longest row calculation', 2, function ( assert ) { + var $table = $( + '' + + '' + + '' + + '' + + '' + + '
A1B1C1
A2B2C2
' + ); + $table.tablesorter(); + assert.equal( $table.find( '#C2' ).prop( 'headerIndex' ), + 2, + 'C2 should be a sort header' + ); + assert.equal( $table.find( '#C1' ).prop( 'headerIndex' ), + undefined, + 'C1 should not be a sort header' ); } ); -- 2.20.1