aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDigitalxero <digitalxero>2011-01-27 13:35:06 -0500
committerjeresig <jeresig@gmail.com>2011-01-27 13:35:06 -0500
commite00f74c43bf58132be01c6417c6126a5bc085899 (patch)
tree14b028322a24e2536f372d7274ecb5f1a317aa6e
parent7f95a730e50260c60e7d3ee4fa53cbe29258e6b6 (diff)
downloadjquery-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.js4
-rw-r--r--test/unit/core.js49
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(),