From 3dd8a09b441d65445f2b6a7c73e72af65445d5da Mon Sep 17 00:00:00 2001 From: =?utf8?q?Scott=20Gonz=C3=A1lez?= Date: Thu, 4 Aug 2016 09:04:16 -0400 Subject: [PATCH] Widget: `instance()` should return `undefined` for empty sets Fixes #15019 --- tests/unit/widget/core.js | 8 +++--- ui/widget.js | 55 ++++++++++++++++++++++----------------- 2 files changed, 36 insertions(+), 27 deletions(-) diff --git a/tests/unit/widget/core.js b/tests/unit/widget/core.js index 00dcb1611..d6bb3efb8 100644 --- a/tests/unit/widget/core.js +++ b/tests/unit/widget/core.js @@ -786,7 +786,7 @@ QUnit.test( ".widget() - overriden", function( assert ) { } ); QUnit.test( ".instance()", function( assert ) { - assert.expect( 2 ); + assert.expect( 3 ); var div; $.widget( "ui.testWidget", { @@ -794,9 +794,11 @@ QUnit.test( ".instance()", function( assert ) { } ); div = $( "
" ); - assert.equal( div.testWidget( "instance" ), undefined ); + assert.equal( div.testWidget( "instance" ), undefined, "uninitialized" ); div.testWidget(); - assert.equal( div.testWidget( "instance" ), div.testWidget( "instance" ) ); + assert.equal( div.testWidget( "instance" ), div.testWidget( "instance" ), "initialized" ); + + assert.equal( $().testWidget( "instance" ), undefined, "empty set" ); } ); QUnit.test( "._on() to element (default)", function( assert ) { diff --git a/ui/widget.js b/ui/widget.js index c82b95326..06a3ce88e 100644 --- a/ui/widget.js +++ b/ui/widget.js @@ -215,35 +215,42 @@ $.widget.bridge = function( name, object ) { var returnValue = this; if ( isMethodCall ) { - this.each( function() { - var methodValue; - var instance = $.data( this, fullName ); - if ( options === "instance" ) { - returnValue = instance; - return false; - } + // If this is an empty collection, we need to have the instance method + // return undefined instead of the jQuery instance + if ( !this.length && options === "instance" ) { + returnValue = undefined; + } else { + this.each( function() { + var methodValue; + var instance = $.data( this, fullName ); - if ( !instance ) { - return $.error( "cannot call methods on " + name + - " prior to initialization; " + - "attempted to call method '" + options + "'" ); - } + if ( options === "instance" ) { + returnValue = instance; + return false; + } - if ( !$.isFunction( instance[ options ] ) || options.charAt( 0 ) === "_" ) { - return $.error( "no such method '" + options + "' for " + name + - " widget instance" ); - } + if ( !instance ) { + return $.error( "cannot call methods on " + name + + " prior to initialization; " + + "attempted to call method '" + options + "'" ); + } - methodValue = instance[ options ].apply( instance, args ); + if ( !$.isFunction( instance[ options ] ) || options.charAt( 0 ) === "_" ) { + return $.error( "no such method '" + options + "' for " + name + + " widget instance" ); + } - if ( methodValue !== instance && methodValue !== undefined ) { - returnValue = methodValue && methodValue.jquery ? - returnValue.pushStack( methodValue.get() ) : - methodValue; - return false; - } - } ); + methodValue = instance[ options ].apply( instance, args ); + + if ( methodValue !== instance && methodValue !== undefined ) { + returnValue = methodValue && methodValue.jquery ? + returnValue.pushStack( methodValue.get() ) : + methodValue; + return false; + } + } ); + } } else { // Allow multiple hashes to be passed on init -- 2.39.5