aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tests/unit/widget/widget.html4
-rw-r--r--tests/unit/widget/widget_core.js67
-rw-r--r--ui/jquery.ui.widget.js36
3 files changed, 93 insertions, 14 deletions
diff --git a/tests/unit/widget/widget.html b/tests/unit/widget/widget.html
index 712f14409..9f7a0f040 100644
--- a/tests/unit/widget/widget.html
+++ b/tests/unit/widget/widget.html
@@ -29,7 +29,9 @@
<div id="main" style="position: absolute; top: -10000px; left: -10000px;">
<div id="widget-wrapper">
- <div id="widget"></div>
+ <div id="widget">
+ <div>...</div>
+ </div>
</div>
</div>
diff --git a/tests/unit/widget/widget_core.js b/tests/unit/widget/widget_core.js
index 2d5502838..604222106 100644
--- a/tests/unit/widget/widget_core.js
+++ b/tests/unit/widget/widget_core.js
@@ -409,4 +409,71 @@ test( "._trigger() - provide event and ui", function() {
.testWidget( "testEvent" );
});
+test( "auto-destroy - .remove()", function() {
+ expect( 1 );
+ $.widget( "ui.testWidget", {
+ _create: function() {},
+ destroy: function() {
+ ok( true, "destroyed from .remove()" );
+ }
+ });
+ $( "#widget" ).testWidget().remove();
+});
+
+test( "auto-destroy - .remove() on parent", function() {
+ expect( 1 );
+ $.widget( "ui.testWidget", {
+ _create: function() {},
+ destroy: function() {
+ ok( true, "destroyed from .remove() on parent" );
+ }
+ });
+ $( "#widget" ).testWidget().parent().remove();
+});
+
+test( "auto-destroy - .remove() on child", function() {
+ $.widget( "ui.testWidget", {
+ _create: function() {},
+ destroy: function() {
+ ok( false, "destroyed from .remove() on child" );
+ }
+ });
+ $( "#widget" ).testWidget().children().remove();
+ // http://github.com/jquery/qunit/pull/34
+ $.ui.testWidget.prototype.destroy = $.noop;
+});
+
+test( "auto-destroy - .empty()", function() {
+ $.widget( "ui.testWidget", {
+ _create: function() {},
+ destroy: function() {
+ ok( false, "destroyed from .empty()" );
+ }
+ });
+ $( "#widget" ).testWidget().empty();
+ // http://github.com/jquery/qunit/pull/34
+ $.ui.testWidget.prototype.destroy = $.noop;
+});
+
+test( "auto-destroy - .empty() on parent", function() {
+ expect( 1 );
+ $.widget( "ui.testWidget", {
+ _create: function() {},
+ destroy: function() {
+ ok( true, "destroyed from .empty() on parent" );
+ }
+ });
+ $( "#widget" ).testWidget().parent().empty();
+});
+
+test( "auto-destroy - .detach()", function() {
+ $.widget( "ui.testWidget", {
+ _create: function() {},
+ destroy: function() {
+ ok( false, "destroyed from .detach()" );
+ }
+ });
+ $( "#widget" ).testWidget().detach();
+});
+
})( jQuery );
diff --git a/ui/jquery.ui.widget.js b/ui/jquery.ui.widget.js
index d08dbb81f..dbfea2574 100644
--- a/ui/jquery.ui.widget.js
+++ b/ui/jquery.ui.widget.js
@@ -9,20 +9,30 @@
*/
(function( $, undefined ) {
-var _remove = $.fn.remove;
-
-$.fn.remove = function( selector, keepData ) {
- return this.each(function() {
- if ( !keepData ) {
- if ( !selector || $.filter( selector, [ this ] ).length ) {
- $( "*", this ).add( [ this ] ).each(function() {
- $( this ).triggerHandler( "remove" );
- });
- }
+// jQuery 1.4+
+if ( $.cleanData ) {
+ var _cleanData = $.cleanData;
+ $.cleanData = function( elems ) {
+ for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+ $( elem ).triggerHandler( "remove" );
}
- return _remove.call( $(this), selector, keepData );
- });
-};
+ _cleanData( elems );
+ };
+} else {
+ var _remove = $.fn.remove;
+ $.fn.remove = function( selector, keepData ) {
+ return this.each(function() {
+ if ( !keepData ) {
+ if ( !selector || $.filter( selector, [ this ] ).length ) {
+ $( "*", this ).add( [ this ] ).each(function() {
+ $( this ).triggerHandler( "remove" );
+ });
+ }
+ }
+ return _remove.call( $(this), selector, keepData );
+ });
+ };
+}
$.widget = function( name, base, prototype ) {
var namespace = name.split( "." )[ 0 ],