mirror of
https://github.com/jquery/jquery-ui.git
synced 2024-10-05 01:44:18 +00:00
Generate a uuid for each widget for unique namespaces. Fixes #8385 - Widget: _bind() on elements such as document are dangerous
This commit is contained in:
parent
4a215e3f72
commit
28b14ec47c
@ -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() {
|
||||
|
12
ui/jquery.ui.widget.js
vendored
12
ui/jquery.ui.widget.js
vendored
@ -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 );
|
||||
|
Loading…
Reference in New Issue
Block a user