]> source.dussan.org Git - jquery-ui.git/commitdiff
Tooltip: On close and destroy only set title if empty or undefined
authorDaniel DeGroff <djdegroff@gmail.com>
Tue, 3 Dec 2013 04:03:55 +0000 (22:03 -0600)
committerJörn Zaefferer <joern.zaefferer@gmail.com>
Mon, 6 Jan 2014 15:10:02 +0000 (16:10 +0100)
Ticket #8925 states that changes to the title attribute while the
tooltip is open are lost on tooltip close.

In the close and destroy functions, the title attribute is always
written if a value was stored in the element on open. It is possible
the attribute has changed and restoring the initial value may overwrite
the current value.

If the value is empty or undefined as set in open, do not set the title
attribute.

This fix has the limitation that if the user removed the title
attribute or set the value to an empty string the original title value
would be restored on close and destroy.

Fixes #8925

tests/unit/tooltip/tooltip_methods.js
ui/jquery.ui.tooltip.js

index a557ff943a217ede5147e0110e2425edc99fea27..ead360bf31454266957d83ae4423a54adfd1cbfa 100644 (file)
@@ -96,4 +96,39 @@ test( "widget", function() {
        strictEqual( widgetElement[ 0 ], element[ 0 ], "same element" );
 });
 
+test( "preserve changes to title attributes on close and destroy", function() {
+       expect( 6 );
+       var element = $( "#tooltipped1" ),
+               changed = "changed title text",
+               original = "original title text",
+               tests = [];
+
+       // 1. Changes to title attribute are preserved on close()
+       tests[ 0 ] = { title: changed, expected: changed, method: "close" };
+       // 2. Changes to title attribute are preserved on destroy()
+       tests[ 1 ] = { title: changed, expected: changed , method: "destroy" };
+       // 3. Changes to title attribute are NOT preserved when set to empty string on close()
+       tests[ 2 ] = { title: "", expected: original, method: "close" };
+       // 4. Changes to title attribute are NOT preserved when set to empty string on destroy()
+       tests[ 3 ] = { title: "", expected: original, method: "destroy" };
+       // 5. Changes to title attribute NOT preserved when attribute has been removed on close()
+       tests[ 4 ] = { expected: original, method: "close" };
+       // 6. Changes to title attribute NOT preserved when attribute has been removed on destroy()
+       tests[ 5 ] = { expected: original, method: "destroy" };
+
+       $.each( tests, function( index, test ) {
+               
+               element.attr( "title", original ).tooltip()
+                       .tooltip( "open", $.Event( "mouseover", { target: element[ 0 ] } ) );
+               if ( test.title ) {
+                       element.attr( "title", test.title );
+               } else {
+                       element.removeAttr( "title" );
+               }
+               element.tooltip( test.method );
+               equal( $( "#tooltipped1" ).attr( "title" ), test.expected );
+               
+       } );
+});
+
 }( jQuery ) );
index 1ebe1a958039b935cb40fe78a339f29f618fd8cf..6854032f4b3ab7482282bff519c87e4933ed7f48 100644 (file)
@@ -339,7 +339,8 @@ $.widget( "ui.tooltip", {
                clearInterval( this.delayedShow );
 
                // only set title if we had one before (see comment in _open())
-               if ( target.data( "ui-tooltip-title" ) ) {
+               // If the title attribute has changed since open(), don't restore
+               if ( target.data( "ui-tooltip-title" ) && !target.attr( "title" ) ) {
                        target.attr( "title", target.data( "ui-tooltip-title" ) );
                }
 
@@ -412,7 +413,10 @@ $.widget( "ui.tooltip", {
 
                        // Restore the title
                        if ( element.data( "ui-tooltip-title" ) ) {
-                               element.attr( "title", element.data( "ui-tooltip-title" ) );
+                               // If the title attribute has changed since open(), don't restore
+                               if ( !element.attr( "title" ) ) {
+                                       element.attr( "title", element.data( "ui-tooltip-title" ) );
+                               }
                                element.removeData( "ui-tooltip-title" );
                        }
                });