diff options
author | Digitalxero <digitalxero> | 2011-01-27 13:35:06 -0500 |
---|---|---|
committer | jeresig <jeresig@gmail.com> | 2011-01-27 13:35:06 -0500 |
commit | e00f74c43bf58132be01c6417c6126a5bc085899 (patch) | |
tree | 14b028322a24e2536f372d7274ecb5f1a317aa6e | |
parent | 7f95a730e50260c60e7d3ee4fa53cbe29258e6b6 (diff) | |
download | jquery-e00f74c43bf58132be01c6417c6126a5bc085899.tar.gz jquery-e00f74c43bf58132be01c6417c6126a5bc085899.zip |
Make sure subclass is a proper subclass not just subclassing the fn methods. Fixes #7979.
-rw-r--r-- | src/core.js | 4 | ||||
-rw-r--r-- | test/unit/core.js | 49 |
2 files changed, 52 insertions, 1 deletions
diff --git a/src/core.js b/src/core.js index 422b68876..2e0ece1b3 100644 --- a/src/core.js +++ b/src/core.js @@ -961,14 +961,16 @@ jQuery.extend({ function jQuerySubclass( selector, context ) { return new jQuerySubclass.fn.init( selector, context ); } + jQuery.extend( true, jQuerySubclass, this ); jQuerySubclass.superclass = this; jQuerySubclass.fn = jQuerySubclass.prototype = this(); jQuerySubclass.fn.constructor = jQuerySubclass; jQuerySubclass.subclass = this.subclass; jQuerySubclass.fn.init = function init( selector, context ) { - if (context && context instanceof jQuery && !(context instanceof jQuerySubclass)){ + if ( context && context instanceof jQuery && !(context instanceof jQuerySubclass) ) { context = jQuerySubclass(context); } + return jQuery.fn.init.call( this, selector, context, rootjQuerySubclass ); }; jQuerySubclass.fn.init.prototype = jQuerySubclass.fn; diff --git a/test/unit/core.js b/test/unit/core.js index 30039bf92..24de5c9a8 100644 --- a/test/unit/core.js +++ b/test/unit/core.js @@ -1130,6 +1130,55 @@ test("jQuery.when() - joined", function() { }); test("jQuery.subclass", function(){ + expect(18); + var Subclass = jQuery.subclass(); + Subclass.extend({ + topLevelMethod: function() {return this.debug;}, + debug: false, + config: { + locale: 'en_US' + }, + setup: function(config) { + this.extend(true, this.config, config); + } + }); + Subclass.fn.extend({subClassMethod: function() { return this;}}); + + //Test Simple Subclass + ok(Subclass.topLevelMethod() === false, 'Subclass.topLevelMethod thought debug was true'); + ok(Subclass.config.locale == 'en_US', Subclass.config.locale + ' is wrong!'); + same(Subclass.config.test, undefined, 'Subclass.config.test is set incorrectly'); + equal(jQuery.ajax, Subclass.ajax, 'The subclass failed to get all top level methods'); + + //Create a SubSubclass + var SubSubclass = Subclass.subclass(); + + //Make Sure the SubSubclass inherited properly + ok(SubSubclass.topLevelMethod() === false, 'SubSubclass.topLevelMethod thought debug was true'); + ok(SubSubclass.config.locale == 'en_US', SubSubclass.config.locale + ' is wrong!'); + same(SubSubclass.config.test, undefined, 'SubSubclass.config.test is set incorrectly'); + equal(jQuery.ajax, SubSubclass.ajax, 'The subsubclass failed to get all top level methods'); + + //Modify The Subclass and test the Modifications + SubSubclass.fn.extend({subSubClassMethod: function() { return this;}}); + SubSubclass.setup({locale: 'es_MX', test: 'worked'}); + SubSubclass.debug = true; + SubSubclass.ajax = function() {return false;}; + ok(SubSubclass.topLevelMethod(), 'SubSubclass.topLevelMethod thought debug was false'); + same(SubSubclass(document).subClassMethod, Subclass.fn.subClassMethod, 'Methods Differ!'); + ok(SubSubclass.config.locale == 'es_MX', SubSubclass.config.locale + ' is wrong!'); + ok(SubSubclass.config.test == 'worked', 'SubSubclass.config.test is set incorrectly'); + notEqual(jQuery.ajax, SubSubclass.ajax, 'The subsubclass failed to get all top level methods'); + + //This shows that the modifications to the SubSubClass did not bubble back up to it's superclass + ok(Subclass.topLevelMethod() === false, 'Subclass.topLevelMethod thought debug was true'); + ok(Subclass.config.locale == 'en_US', Subclass.config.locale + ' is wrong!'); + same(Subclass.config.test, undefined, 'Subclass.config.test is set incorrectly'); + same(Subclass(document).subSubClassMethod, undefined, 'subSubClassMethod set incorrectly'); + equal(jQuery.ajax, Subclass.ajax, 'The subclass failed to get all top level methods'); +}); + +test("jQuery.subclass()", function(){ expect(378); var Subclass = jQuery.subclass(), |