r2453 - Merged in widget-factory branch and added tests. Fixes #4411 - Widget factory should aut...

r2453 - Merged in widget-factory branch and added tests. Fixes #4411 - Widget factory should aut...


Author: scott.gonzalez
Date: Tue Apr 14 19:33:28 2009
New Revision: 2453
Modified:
trunk/tests/unit/accordion/accordion_methods.js
trunk/tests/unit/dialog/dialog_methods.js
trunk/tests/unit/draggable/draggable_methods.js
trunk/tests/unit/droppable/droppable_methods.js
trunk/tests/unit/progressbar/progressbar_methods.js
trunk/tests/unit/resizable/resizable_methods.js
trunk/tests/unit/selectable/selectable_methods.js
trunk/tests/unit/slider/slider_methods.js
trunk/tests/unit/sortable/sortable_methods.js
trunk/ui/ui.accordion.js
trunk/ui/ui.core.js
trunk/ui/ui.dialog.js
trunk/ui/ui.draggable.js
trunk/ui/ui.droppable.js
trunk/ui/ui.progressbar.js
trunk/ui/ui.resizable.js
trunk/ui/ui.selectable.js
trunk/ui/ui.slider.js
trunk/ui/ui.sortable.js
trunk/ui/ui.tabs.js
Log:
Merged in widget-factory branch and added tests. Fixes #4411 - Widget
factory should auto detect getters.
Modified: trunk/tests/unit/accordion/accordion_methods.js
==============================================================================
--- trunk/tests/unit/accordion/accordion_methods.js    (original)
+++ trunk/tests/unit/accordion/accordion_methods.js    Tue Apr 14 19:33:28 2009
@@ -10,17 +10,32 @@
});
test("destroy", function() {
+    var expected = $('#list1').accordion(),
+        actual = expected.accordion('destroy');
+    equals(actual, expected, 'destroy is chainable');
    ok(false, 'missing test - untested code is broken code');
});
test("enable", function() {
+    var expected = $('#list1').accordion(),
+        actual = expected.accordion('enable');
+    equals(actual, expected, 'enable is chainable');
    ok(false, 'missing test - untested code is broken code');
});
test("disable", function() {
+    var expected = $('#list1').accordion(),
+        actual = expected.accordion('disable');
+    equals(actual, expected, 'disable is chainable');
    ok(false, 'missing test - untested code is broken code');
});
+test("activate", function() {
+    var expected = $('#list1').accordion(),
+        actual = expected.accordion('activate', 2);
+    equals(actual, expected, 'activate is chainable');
+});
+
test("activate, numeric", function() {
    var ac = $('#list1').accordion({ active: 1 });
    state(ac, 0, 1, 0);
@@ -72,6 +87,13 @@
    state(ac, 1, 0, 0);
    ac.accordion("activate", $("#list1 a")[1]);
    state(ac, 0, 1, 0);
+});
+
+test("resize", function() {
+    var expected = $('#list1').accordion(),
+        actual = expected.accordion('resize');
+    equals(actual, expected, 'resize is chainable');
+    ok(false, 'missing test - untested code is broken code');
});
})(jQuery);
Modified: trunk/tests/unit/dialog/dialog_methods.js
==============================================================================
--- trunk/tests/unit/dialog/dialog_methods.js    (original)
+++ trunk/tests/unit/dialog/dialog_methods.js    Tue Apr 14 19:33:28 2009
@@ -33,7 +33,7 @@
});
test("destroy", function() {
-    expect(6);
+    expect(7);
    $("<div></div>").appendTo('body').dialog().dialog("destroy").remove();
    ok(true, '.dialog("destroy") called on element');
@@ -54,6 +54,31 @@
    
$('<div></div>').dialog().dialog("destroy").data("foo.dialog", "bar").remove();
    ok(true, 'arbitrary option setter after destroy');
+
+    var expected = $('<div></div>').dialog(),
+        actual = expected.dialog('destroy');
+    equals(actual, expected, 'destroy is chainable');
+});
+
+test("enable", function() {
+    var expected = $('<div></div>').dialog(),
+        actual = expected.dialog('enable');
+    equals(actual, expected, 'enable is chainable');
+    ok(false, 'missing test - untested code is broken code');
+});
+
+test("disable", function() {
+    var expected = $('<div></div>').dialog(),
+        actual = expected.dialog('disable');
+    equals(actual, expected, 'disable is chainable');
+    ok(false, 'missing test - untested code is broken code');
+});
+
+test("close", function() {
+    var expected = $('<div></div>').dialog(),
+        actual = expected.dialog('close');
+    equals(actual, expected, 'close is chainable');
+    ok(false, 'missing test - untested code is broken code');
});
test("isOpen", function() {
@@ -70,6 +95,20 @@
    el.dialog('open');
    equals(el.dialog('isOpen'), true, "dialog is open");
    el.remove();
+});
+
+test("moveToTop", function() {
+    var expected = $('<div></div>').dialog(),
+        actual = expected.dialog('moveToTop');
+    equals(actual, expected, 'moveToTop is chainable');
+    ok(false, 'missing test - untested code is broken code');
+});
+
+test("open", function() {
+    var expected = $('<div></div>').dialog(),
+        actual = expected.dialog('open');
+    equals(actual, expected, 'open is chainable');
+    ok(false, 'missing test - untested code is broken code');
});
})(jQuery);
Modified: trunk/tests/unit/draggable/draggable_methods.js
==============================================================================
--- trunk/tests/unit/draggable/draggable_methods.js    (original)
+++ trunk/tests/unit/draggable/draggable_methods.js    Tue Apr 14 19:33:28 2009
@@ -38,7 +38,7 @@
});
test("destroy", function() {
-    expect(6);
+    expect(7);
    
$("<div></div>").appendTo('body').draggable().draggable("destroy").remove();
    ok(true, '.draggable("destroy") called on element');
@@ -57,10 +57,14 @@
    
$("<div></div>").draggable().draggable("destroy").data("foo.draggable", "bar");
    ok(true, 'arbitrary option setter after destroy');
+    
+    var expected = $('<div></div>').draggable(),
+        actual = expected.draggable('destroy');
+    equals(actual, expected, 'destroy is chainable');
});
test("enable", function() {
-    expect(6);
+    expect(7);
    el = $("#draggable2").draggable({ disabled: true });
    shouldnotmove('.draggable({ disabled: true })');
    el.draggable("enable");
@@ -73,10 +77,14 @@
    el.data("disabled.draggable", false);
    equals(el.data("disabled.draggable"), false, "disabled.draggable setter");
    shouldmove('.data("disabled.draggable", false)');
+    
+    var expected = $('<div></div>').draggable(),
+        actual = expected.draggable('enable');
+    equals(actual, expected, 'enable is chainable');
});
test("disable", function() {
-    expect(6);
+    expect(7);
    el = $("#draggable2").draggable({ disabled: false });
    shouldmove('.draggable({ disabled: false })');
    el.draggable("disable");
@@ -90,6 +98,10 @@
    el.data("disabled.draggable", true);
    equals(el.data("disabled.draggable"), true, "disabled.draggable setter");
    shouldnotmove('.data("disabled.draggable", true)');
+    
+    var expected = $('<div></div>').draggable(),
+        actual = expected.draggable('disable');
+    equals(actual, expected, 'disable is chainable');
});
})(jQuery);
Modified: trunk/tests/unit/droppable/droppable_methods.js
==============================================================================
--- trunk/tests/unit/droppable/droppable_methods.js    (original)
+++ trunk/tests/unit/droppable/droppable_methods.js    Tue Apr 14 19:33:28 2009
@@ -28,7 +28,7 @@
});
test("destroy", function() {
-    expect(6);
+    expect(7);
    
$("<div></div>").appendTo('body').droppable().droppable("destroy").remove();
    ok(true, '.droppable("destroy") called on element');
@@ -47,10 +47,14 @@
    
$("<div></div>").droppable().droppable("destroy").data("foo.droppable", "bar");
    ok(true, 'arbitrary option setter after destroy');
+    
+    var expected = $('<div></div>').droppable(),
+        actual = expected.droppable('destroy');
+    equals(actual, expected, 'destroy is chainable');
});
test("enable", function() {
-    expect(6);
+    expect(7);
    el = $("#droppable1").droppable({ disabled: true });
    shouldNotBeDroppable();
    el.droppable("enable");
@@ -62,10 +66,14 @@
    el.data("disabled.droppable", false);
    equals(el.data("disabled.droppable"), false, "disabled.droppable setter");
    shouldBeDroppable();
+    
+    var expected = $('<div></div>').droppable(),
+        actual = expected.droppable('enable');
+    equals(actual, expected, 'enable is chainable');
});
test("disable", function() {
-    expect(6);
+    expect(7);
    el = $("#droppable1").droppable({ disabled: false });
    shouldBeDroppable();
    el.droppable("disable");
@@ -77,6 +85,10 @@
    el.data("disabled.droppable", true);
    equals(el.data("disabled.droppable"), true, "disabled.droppable setter");
    shouldNotBeDroppable();
+    
+    var expected = $('<div></div>').droppable(),
+        actual = expected.droppable('disable');
+    equals(actual, expected, 'disable is chainable');
});
})(jQuery);
Modified: trunk/tests/unit/progressbar/progressbar_methods.js
==============================================================================
--- trunk/tests/unit/progressbar/progressbar_methods.js    (original)
+++ trunk/tests/unit/progressbar/progressbar_methods.js    Tue Apr 14 19:33:28
2009
@@ -14,11 +14,14 @@
});
test("destroy", function() {
-    expect(1);
+    expect(2);
    
$("<div></div>").appendTo('body').progressbar().progressbar("destroy").remove();
    ok(true, '.progressbar("destroy") called on element');
+    var expected = $('<div></div>').progressbar(),
+        actual = expected.progressbar('destroy');
+    equals(actual, expected, 'destroy is chainable');
});
})(jQuery);
Modified: trunk/tests/unit/resizable/resizable_methods.js
==============================================================================
--- trunk/tests/unit/resizable/resizable_methods.js    (original)
+++ trunk/tests/unit/resizable/resizable_methods.js    Tue Apr 14 19:33:28 2009
@@ -30,7 +30,7 @@
});
test("destroy", function() {
-    expect(6);
+    expect(7);
    
$("<div></div>").appendTo('body').resizable().resizable("destroy").remove();
    ok(true, '.resizable("destroy") called on element');
@@ -51,13 +51,23 @@
    
$('<div></div>').resizable().resizable("destroy").data("foo.resizable", "bar").remove();
    ok(true, 'arbitrary option setter after destroy');
+    
+    var expected = $('<div></div>').resizable(),
+        actual = expected.resizable('destroy');
+    equals(actual, expected, 'destroy is chainable');
});
test("enable", function() {
+    var expected = $('<div></div>').resizable(),
+        actual = expected.resizable('enable');
+    equals(actual, expected, 'enable is chainable');
    ok(false, "missing test - untested code is broken code.");
});
test("disable", function() {
+    var expected = $('<div></div>').resizable(),
+        actual = expected.resizable('disable');
+    equals(actual, expected, 'disable is chainable');
    ok(false, "missing test - untested code is broken code.");
});
Modified: trunk/tests/unit/selectable/selectable_methods.js
==============================================================================
--- trunk/tests/unit/selectable/selectable_methods.js    (original)
+++ trunk/tests/unit/selectable/selectable_methods.js    Tue Apr 14 19:33:28
2009
@@ -30,7 +30,7 @@
});
test("destroy", function() {
-    expect(6);
+    expect(7);
    
$("<div></div>").appendTo('body').selectable().selectable("destroy").remove();
    ok(true, '.selectable("destroy") called on element');
@@ -51,10 +51,14 @@
    
$("<div></div>").selectable().selectable("destroy").data("foo.selectable", "bar").remove();
    ok(true, 'arbitrary option setter after destroy');
+    
+    var expected = $('<div></div>').selectable(),
+        actual = expected.selectable('destroy');
+    equals(actual, expected, 'destroy is chainable');
});
test("enable", function() {
-    expect(2);
+    expect(3);
    var fired = false;
    el = $("#selectable1");
@@ -68,10 +72,14 @@
    el.simulate("drag", 20, 20);
    equals(fired, true, "start fired");
    el.selectable("destroy");
+    
+    var expected = $('<div></div>').selectable(),
+        actual = expected.selectable('enable');
+    equals(actual, expected, 'enable is chainable');
});
test("disable", function() {
-    expect(2);
+    expect(3);
    var fired = false;
    el = $("#selectable1");
@@ -86,6 +94,10 @@
    el.simulate("drag", 20, 20);
    equals(fired, false, "start fired");
    el.selectable("destroy");
+    
+    var expected = $('<div></div>').selectable(),
+        actual = expected.selectable('disable');
+    equals(actual, expected, 'disable is chainable');
});
})(jQuery);
Modified: trunk/tests/unit/slider/slider_methods.js
==============================================================================
--- trunk/tests/unit/slider/slider_methods.js    (original)
+++ trunk/tests/unit/slider/slider_methods.js    Tue Apr 14 19:33:28 2009
@@ -30,7 +30,7 @@
});
test("destroy", function() {
-    expect(8);
+    expect(9);
    $("<div></div>").appendTo('body').slider().slider("destroy").remove();
    ok(true, '.slider("destroy") called on element');
@@ -59,13 +59,23 @@
    
$('<div></div>').slider().slider("destroy").slider("options", "foo", "bar").remove();
    ok(true, 'arbitrary option setter (.slider option method) after destroy');
+    
+    var expected = $('<div></div>').slider(),
+        actual = expected.slider('destroy');
+    equals(actual, expected, 'destroy is chainable');
});
test("enable", function() {
+    var expected = $('<div></div>').slider(),
+        actual = expected.slider('enable');
+    equals(actual, expected, 'enable is chainable');
    ok(false, "missing test - untested code is broken code.");
});
test("disable", function() {
+    var expected = $('<div></div>').slider(),
+        actual = expected.slider('disable');
+    equals(actual, expected, 'disable is chainable');
    ok(false, "missing test - untested code is broken code.");
});
Modified: trunk/tests/unit/sortable/sortable_methods.js
==============================================================================
--- trunk/tests/unit/sortable/sortable_methods.js    (original)
+++ trunk/tests/unit/sortable/sortable_methods.js    Tue Apr 14 19:33:28 2009
@@ -45,7 +45,7 @@
});
test("destroy", function() {
-    expect(6);
+    expect(7);
    $("<div></div>").appendTo('body').sortable().sortable("destroy").remove();
    ok(true, '.sortable("destroy") called on element');
@@ -64,10 +64,14 @@
    
$("<div></div>").sortable().sortable("destroy").data("foo.sortable", "bar");
    ok(true, 'arbitrary option setter after destroy');
+    
+    var expected = $('<div></div>').sortable(),
+        actual = expected.sortable('destroy');
+    equals(actual, expected, 'destroy is chainable');
});
test("enable", function() {
-    expect(4);
+    expect(5);
    el = $("#sortable").sortable({ disabled: true });
    sort($("li", el)[0], 0, 40, 0, '.sortable({ disabled: true })');
@@ -81,10 +85,14 @@
    equals(el.data("disabled.sortable"), false, "disabled.sortable setter");
    sort($("li", el)[0], 0, 40, 2, '.data("disabled.sortable", false)');
+    
+    var expected = $('<div></div>').sortable(),
+        actual = expected.sortable('enable');
+    equals(actual, expected, 'enable is chainable');
});
test("disable", function() {
-    expect(5);
+    expect(6);
    el = $("#sortable").sortable({ disabled: false });
    sort($("li", el)[0], 0, 40, 2, '.sortable({ disabled: false })');
@@ -98,6 +106,10 @@
    el.data("disabled.sortable", true);
    equals(el.data("disabled.sortable"), true, "disabled.sortable setter");
    sort($("li", el)[0], 0, 40, 0, '.data("disabled.sortable", true)');
+    
+    var expected = $('<div></div>').sortable(),
+        actual = expected.sortable('disable');
+    equals(actual, expected, 'disable is chainable');
});
})(jQuery);
Modified: trunk/ui/ui.accordion.js
==============================================================================
--- trunk/ui/ui.accordion.js    (original)
+++ trunk/ui/ui.accordion.js    Tue Apr 14 19:33:28 2009
@@ -125,6 +125,8 @@
        if (o.autoHeight || o.fillHeight) {
            contents.css("height", "");
        }
+
+        return this;
    },
    
    _setData: function(key, value) {
@@ -195,12 +197,15 @@
            }).height(maxHeight);
        }
+        return this;
    },
    activate: function(index) {
        // call clickHandler with custom event
        var active = this._findActive(index)[0];
        this._clickHandler({ target: active }, active);
+
+        return this;
    },
    _findActive: function(selector) {
Modified: trunk/ui/ui.core.js
==============================================================================
--- trunk/ui/ui.core.js    (original)
+++ trunk/ui/ui.core.js    Tue Apr 14 19:33:28 2009
@@ -203,19 +203,6 @@
// $.widget is a factory to create jQuery plugins
// taking some boilerplate code out of the plugin code
-function getter(namespace, plugin, method, args) {
-    function getMethods(type) {
-        var methods = $[namespace][plugin][type] || [];
-        return (typeof methods == 'string' ? methods.split(/,?\s+/) : methods);
-    }
-
-    var methods = getMethods('getter');
-    if (args.length == 1 && typeof args[0] == 'string') {
-        methods = methods.concat(getMethods('getterSetter'));
-    }
-    return ($.inArray(method, methods) != -1);
-}
-
$.widget = function(name, prototype) {
    var namespace = name.split(".")[0],
        fullName;
@@ -230,32 +217,31 @@
    // create plugin method
    $.fn[name] = function(options) {
        var isMethodCall = (typeof options == 'string'),
-            args = Array.prototype.slice.call(arguments, 1);
+            args = Array.prototype.slice.call(arguments, 1),
+            returnValue = this;
        // prevent calls to internal methods
        if (isMethodCall && options.substring(0, 1) == '_') {
-            return this;
+            return returnValue;
        }
-        // handle getter methods
-        if (isMethodCall && getter(namespace, name, options, args)) {
-            var instance = $.data(this[0], name);
-            return (instance ? instance[options].apply(instance, args)
-                : undefined);
-        }
+        (isMethodCall
+            ? this.each(function() {
+                var instance = $.data(this, name),
+                    methodValue = (instance && $.isFunction(instance[options])
+                        ? instance[options].apply(instance, args)
+                        : instance);
+                if (methodValue !== instance) {
+                    returnValue = methodValue;
+                    return false;
+                }
+            })
+            : this.each(function() {
+                ($.data(this, name) ||
+                    $.data(this, name, new $[namespace][name](this, options))._init());
+            }));
-        // handle initialization and non-getter methods
-        return this.each(function() {
-            var instance = $.data(this, name);
-
-            // constructor
-            (!instance && !isMethodCall &&
-                $.data(this, name, new $[namespace][name](this, options))._init());
-
-            // method call
-            (instance && isMethodCall && $.isFunction(instance[options]) &&
-                instance[options].apply(instance, args));
-        });
+        return returnValue;
    };
    // create widget constructor
@@ -292,10 +278,6 @@
    // add widget prototype
    $[namespace][name].prototype = $.extend({}, $.widget.prototype,
prototype);
-
-    // TODO: merge getter and getterSetter properties from widget prototype
-    // and plugin prototype
-    $[namespace][name].getterSetter = 'option';
};
$.widget.prototype = {
@@ -304,6 +286,8 @@
        this.element.removeData(this.widgetName)
            .removeClass(this.widgetBaseClass + '-disabled' + ' ' + this.namespace
+ '-state-disabled')
            .removeAttr('aria-disabled');
+
+        return this;
    },
    option: function(key, value) {
@@ -321,6 +305,8 @@
        $.each(options, function(key, value) {
            self._setData(key, value);
        });
+
+        return self;
    },
    _getData: function(key) {
        return this.options[key];
@@ -339,9 +325,11 @@
    enable: function() {
        this._setData('disabled', false);
+        return this;
    },
    disable: function() {
        this._setData('disabled', true);
+        return this;
    },
    _trigger: function(type, event, data) {
Modified: trunk/ui/ui.dialog.js
==============================================================================
--- trunk/ui/ui.dialog.js    (original)
+++ trunk/ui/ui.dialog.js    Tue Apr 14 19:33:28 2009
@@ -137,7 +137,6 @@
        (options.bgiframe && $.fn.bgiframe && uiDialog.bgiframe());
        (options.autoOpen && this.open());
-        
    },
    destroy: function() {
@@ -151,6 +150,8 @@
        this.uiDialog.remove();
        (this.originalTitle && this.element.attr('title', this.originalTitle));
+
+        return this;
    },
    close: function(event) {
@@ -172,7 +173,7 @@
        $.ui.dialog.overlay.resize();
        self._isOpen = false;
-        
+
        // adjust the maxZ to allow other modal dialogs to continue to work (see
#4309)
        if (self.options.modal) {
            var maxZ = 0;
@@ -183,6 +184,8 @@
            });
            $.ui.dialog.maxZ = maxZ;
        }
+
+        return self;
    },
    isOpen: function() {
@@ -192,7 +195,6 @@
    // the force parameter allows us to move modal dialogs to their correct
    // position on open
    moveToTop: function(force, event) {
-
        if ((this.options.modal && !force)
            || (!this.options.stack && !this.options.modal)) {
            return this._trigger('focus', event);
@@ -209,6 +211,8 @@
        this.uiDialog.css('z-index', ++$.ui.dialog.maxZ);
        this.element.attr(saveScroll);
        this._trigger('focus', event);
+
+        return this;
    },
    open: function() {
@@ -256,6 +260,8 @@
        this._trigger('open');
        this._isOpen = true;
+
+        return this;
    },
    _createButtons: function(buttons) {
@@ -518,8 +524,6 @@
        width: 300,
        zIndex: 1000
    },
-
-    getter: 'isOpen',
    uuid: 0,
    maxZ: 0,
Modified: trunk/ui/ui.draggable.js
==============================================================================
--- trunk/ui/ui.draggable.js    (original)
+++ trunk/ui/ui.draggable.js    Tue Apr 14 19:33:28 2009
@@ -35,6 +35,8 @@
                + " ui-draggable-dragging"
                + " ui-draggable-disabled");
        this._mouseDestroy();
+
+        return this;
    },
&