]> source.dussan.org Git - jquery-ui.git/commitdiff
Widget: Support mixins
authorScott González <scott.gonzalez@gmail.com>
Wed, 13 May 2015 18:59:02 +0000 (14:59 -0400)
committerScott González <scott.gonzalez@gmail.com>
Fri, 15 May 2015 00:36:00 +0000 (20:36 -0400)
Fixes #12601
Closes gh-1554

tests/unit/widget/core.js
ui/widget.js

index 74967e683f4df0c1b36e705cabda382ed906be32..c1fb44f3c46c4df928202fd364b77146879aaa7d 100644 (file)
@@ -476,6 +476,85 @@ test( "._superApply()", function() {
        delete $.fn.testWidget2;
 });
 
+test( "mixins", function() {
+       expect( 5 );
+
+       var mixin1 = {
+               foo: function() {
+                       equal( method, "foo", "Methods from first mixin are copied over" );
+               }
+       };
+       var mixin2 = {
+               bar: function() {
+                       equal( method, "bar", "Methods from second mixin are copied over" );
+               }
+       };
+       var prototype = {
+               baz: function() {
+                       equal( method, "baz", "Methods from protoype are copied over" );
+               }
+       };
+       var existingBar = mixin2.bar;
+       var method;
+
+       $.widget( "ui.testWidget", [ mixin1, mixin2, prototype ] );
+       method = "foo";
+       $.ui.testWidget.prototype.foo();
+       method = "bar";
+       $.ui.testWidget.prototype.bar();
+       method = "baz";
+       $.ui.testWidget.prototype.baz();
+
+       mixin1.foo = function() {
+               ok( false, "Changes to a mixin don't change the prototype" );
+       };
+       method = "foo";
+       $.ui.testWidget.prototype.foo();
+
+       $.ui.testWidget.prototype.bar = function() {};
+       strictEqual( mixin2.bar, existingBar, "Changes to a prototype don't change the mixin" );
+});
+
+test( "mixins with inheritance", function() {
+       expect( 4 );
+
+       var mixin1 = {
+               foo: function() {
+                       equal( method, "foo", "Methods from first mixin are copied over" );
+               }
+       };
+       var mixin2 = {
+               bar: function() {
+                       equal( method, "bar", "Methods from second mixin are copied over" );
+               }
+       };
+       var parentPrototype = {
+               baz: function() {
+                       equal( method, "baz", "Methods from parent protoype are copied over" );
+               }
+       };
+       var childPrototype = {
+               qux: function() {
+                       equal( method, "qux", "Methods from child protoype are copied over" );
+               }
+       };
+       var method;
+
+       $.widget( "ui.testWidget", [ mixin1, parentPrototype ] );
+       $.widget( "ui.testWidget2", $.ui.testWidget, [ mixin2, childPrototype ] );
+       method = "foo";
+       $.ui.testWidget2.prototype.foo();
+       method = "bar";
+       $.ui.testWidget2.prototype.bar();
+       method = "baz";
+       $.ui.testWidget2.prototype.baz();
+       method = "qux";
+       $.ui.testWidget2.prototype.qux();
+
+       delete $.ui.testWidget2;
+       delete $.fn.testWidget2;
+});
+
 test( ".option() - getter", function() {
        expect( 6 );
        $.widget( "ui.testWidget", {
index 2bac3d8d2d83aab20cfd989b6cd2179dde0bc317..ae72c709b1a0ae6ed123538637789353bd1175b2 100644 (file)
@@ -62,6 +62,10 @@ $.widget = function( name, base, prototype ) {
                base = $.Widget;
        }
 
+       if ( $.isArray( prototype ) ) {
+               prototype = $.extend.apply( null, [ {} ].concat( prototype ) );
+       }
+
        // create selector for plugin
        $.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) {
                return !!$.data( elem, fullName );