Skip to content
Permalink
Browse files

Generate a uuid for each widget for unique namespaces. Fixes #8385 - …

…Widget: _bind() on elements such as document are dangerous
  • Loading branch information
jzaefferer authored and scottgonzalez committed Jun 10, 2012
1 parent 4a215e3 commit 28b14ec47cfeb3c58e44f35170cdd8a9270aceae
Showing with 29 additions and 8 deletions.
  1. +22 −3 tests/unit/widget/widget_core.js
  2. +7 −5 ui/jquery.ui.widget.js
@@ -711,9 +711,10 @@ test( "_on() with delegate", function() {
expect( 8 );
$.widget( "ui.testWidget", {
_create: function() {
var uuid = this.uuid;
this.element = {
bind: function( event, handler ) {
equal( event, "click.testWidget" );
equal( event, "click.testWidget" + uuid );
ok( $.isFunction(handler) );
},
trigger: $.noop
@@ -722,7 +723,7 @@ test( "_on() with delegate", function() {
return {
delegate: function( selector, event, handler ) {
equal( selector, "a" );
equal( event, "click.testWidget" );
equal( event, "click.testWidget" + uuid );
ok( $.isFunction(handler) );
}
};
@@ -735,7 +736,7 @@ test( "_on() with delegate", function() {
return {
delegate: function( selector, event, handler ) {
equal( selector, "form fieldset > input" );
equal( event, "change.testWidget" );
equal( event, "change.testWidget" + uuid );
ok( $.isFunction(handler) );
}
};
@@ -748,6 +749,24 @@ test( "_on() with delegate", function() {
$.ui.testWidget();
});

test( "_bind() to common element", function() {
expect( 1 );
$.widget( "ui.testWidget", {
_create: function() {
this._bind( this.document, {
"customevent": "_handler"
});
},
_handler: function() {
ok( true, "handler triggered" );
}
});
var widget = $( "#widget" ).testWidget().data( "testWidget" );
$( "#widget-wrapper" ).testWidget();
widget.destroy();
$( document ).trigger( "customevent" );
});

test( "._hoverable()", function() {
$.widget( "ui.testWidget", {
_create: function() {
@@ -9,7 +9,8 @@
*/
(function( $, undefined ) {

var slice = Array.prototype.slice,
var uuid = 0,
slice = Array.prototype.slice,
_cleanData = $.cleanData;
$.cleanData = function( elems ) {
for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
@@ -214,6 +215,7 @@ $.Widget.prototype = {
this.options,
this._getCreateOptions(),
options );
this.uuid = uuid++;

this.bindings = $();
this.hoverable = $();
@@ -247,7 +249,7 @@ $.Widget.prototype = {
// we can probably remove the unbind calls in 2.0
// all event bindings should go through this._on()
this.element
.unbind( "." + this.widgetName )
.unbind( "." + this.widgetName + this.uuid )
// 1.9 BC for #7810
// TODO remove dual storage
.removeData( this.widgetName )
@@ -256,14 +258,14 @@ $.Widget.prototype = {
// http://bugs.jquery.com/ticket/9413
.removeData( $.camelCase( this.widgetFullName ) );
this.widget()
.unbind( "." + this.widgetName )
.unbind( "." + this.widgetName + this.uuid )
.removeAttr( "aria-disabled" )
.removeClass(
this.widgetFullName + "-disabled " +
"ui-state-disabled" );

// clean up events and states
this.bindings.unbind( "." + this.widgetName );
this.bindings.unbind( "." + this.widgetName + this.uuid );
this.hoverable.removeClass( "ui-state-hover" );
this.focusable.removeClass( "ui-state-focus" );
},
@@ -374,7 +376,7 @@ $.Widget.prototype = {
}

var match = event.match( /^(\w+)\s*(.*)$/ ),
eventName = match[1] + "." + instance.widgetName,
eventName = match[1] + "." + instance.widgetName + instance.uuid,
selector = match[2];
if ( selector ) {
instance.widget().delegate( selector, eventName, handlerProxy );

0 comments on commit 28b14ec

Please sign in to comment.
You can’t perform that action at this time.