From 556b2710f0f09b76909b92c751edc3f4243fa5c0 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Scott=20Gonz=C3=A1lez?= Date: Wed, 13 May 2015 14:59:02 -0400 Subject: [PATCH] Widget: Support mixins Fixes #12601 Closes gh-1554 --- tests/unit/widget/core.js | 79 +++++++++++++++++++++++++++++++++++++++ ui/widget.js | 4 ++ 2 files changed, 83 insertions(+) diff --git a/tests/unit/widget/core.js b/tests/unit/widget/core.js index 74967e683..c1fb44f3c 100644 --- a/tests/unit/widget/core.js +++ b/tests/unit/widget/core.js @@ -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", { diff --git a/ui/widget.js b/ui/widget.js index 2bac3d8d2..ae72c709b 100644 --- a/ui/widget.js +++ b/ui/widget.js @@ -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 ); -- 2.39.5