Skip to content

Commit

Permalink
Tooltip: Don't crash on empty content
Browse files Browse the repository at this point in the history
Commit 1f2011e removed a `try-catch` around triggering the `remove` handlers
in the `jQuery.cleanData` override. The `try-catch` was meant for old IE but it was
also catching an error coming from the tooltip `remove` handler depending on
being able to find a relevant tooltip. The `_find` method returns `null`, though,
when the tooltip cotent is empty.

Instead of restoring the `try-catch`, handle the `null` case in the `remove` handler.

Fixes gh-1990
Closes gh-1994

Co-authored-by: Claas Augner <github@caugner.de>
Co-authored-by: Michał Gołębiowski-Owczarek <m.goleb@gmail.com>
  • Loading branch information
3 people committed Nov 8, 2021
1 parent 1f0851b commit 85fba3f
Show file tree
Hide file tree
Showing 2 changed files with 74 additions and 1 deletion.
70 changes: 70 additions & 0 deletions tests/unit/tooltip/core.js
Original file line number Diff line number Diff line change
Expand Up @@ -254,4 +254,74 @@ QUnit.test( "remove conflicting attributes from live region", function( assert )
.tooltip( "open" );
} );

// gh-1990
QUnit.test( "don't crash on empty tooltip content", function( assert ) {
var ready = assert.async();
assert.expect( 1 );

var anchor = $( "#tooltipped1" ),
input = anchor.next(),
actions = [];

$( document ).tooltip( {
show: false,
hide: false,
content: function() {
var title = $( this ).attr( "title" );
if ( title === "inputtitle" ) {
return "";
}
return title;
},
open: function( event, ui ) {
actions.push( "open:" + ui.tooltip.text() );
},
close: function( event, ui ) {
actions.push( "close:" + ui.tooltip.text() );
}
} );

function step1() {
anchor.simulate( "mouseover" );
setTimeout( step2 );
}

function step2() {
anchor.simulate( "mouseout" );
setTimeout( step3 );
}

function step3() {
input.simulate( "focus" );
setTimeout( step4 );
}

function step4() {
input.simulate( "blur" );
setTimeout( step5 );
}

function step5() {
anchor.simulate( "mouseover" );
setTimeout( step6 );
}

function step6() {
anchor.simulate( "mouseout" );
setTimeout( step7 );
}

function step7() {
assert.deepEqual( actions, [
"open:anchortitle",
"close:anchortitle",
"open:anchortitle",
"close:anchortitle"
], "Tooltip opens and closes without crashing" );
ready();
}

step1();
} );

} );
5 changes: 4 additions & 1 deletion ui/widgets/tooltip.js
Original file line number Diff line number Diff line change
Expand Up @@ -352,7 +352,10 @@ $.widget( "ui.tooltip", {
// tooltips will handle this in destroy.
if ( target[ 0 ] !== this.element[ 0 ] ) {
events.remove = function() {
this._removeTooltip( this._find( target ).tooltip );
var targetElement = this._find( target );
if ( targetElement ) {
this._removeTooltip( targetElement.tooltip );
}
};
}

Expand Down

0 comments on commit 85fba3f

Please sign in to comment.