#

API Docs for: 3.10.3
Show: Inherited Protected Private Deprecated

# File: yui/js/features.js

    var feature_tests = {};

    /**
    Contains the core of YUI's feature test architecture.
    @module features
    */

    /**
    * Feature detection
    * @class Features
    * @static
    */

    Y.mix(Y.namespace('Features'), {

        /**
        * Object hash of all registered feature tests
        * @property tests
        * @type Object
        */
        tests: feature_tests,

        /**
        * Add a test to the system
        *
        *   ```
        *   Y.Features.add("load", "1", {});
        *   ```
        *
        * @method add
        * @param {String} cat The category, right now only 'load' is supported
        * @param {String} name The number sequence of the test, how it's reported in the URL or config: 1, 2, 3
        * @param {Object} o Object containing test properties
        * @param {String} o.name The name of the test
        * @param {Function} o.test The test function to execute, the only argument to the function is the `Y` instance
        * @param {String} o.trigger The module that triggers this test.
        */
        add: function(cat, name, o) {
            feature_tests[cat] = feature_tests[cat] || {};
            feature_tests[cat][name] = o;
        },
        /**
        * Execute all tests of a given category and return the serialized results
        *
        *   ```
        *   caps=1:1;2:1;3:0
        *   ```
        * @method all
        * @param {String} cat The category to execute
        * @param {Array} args The arguments to pass to the test function
        * @return {String} A semi-colon separated string of tests and their success/failure: 1:1;2:1;3:0
        */
        all: function(cat, args) {
            var cat_o = feature_tests[cat],
                // results = {};
                result = [];
            if (cat_o) {
                Y.Object.each(cat_o, function(v, k) {
                    result.push(k + ':' + (Y.Features.test(cat, k, args) ? 1 : 0));
                });
            }

            return (result.length) ? result.join(';') : '';
        },
        /**
        * Run a sepecific test and return a Boolean response.
        *
        *   ```
        *   Y.Features.test("load", "1");
        *   ```
        *
        * @method test
        * @param {String} cat The category of the test to run
        * @param {String} name The name of the test to run
        * @param {Array} args The arguments to pass to the test function
        * @return {Boolean} True or false if the test passed/failed.
        */
        test: function(cat, name, args) {
            args = args || [];
            var result, ua, test,
                cat_o = feature_tests[cat],
                feature = cat_o && cat_o[name];

            if (!feature) {
                Y.log('Feature test ' + cat + ', ' + name + ' not found');
            } else {

                result = feature.result;

                if (Y.Lang.isUndefined(result)) {

                    ua = feature.ua;
                    if (ua) {
                        result = (Y.UA[ua]);
                    }

                    test = feature.test;
                    if (test && ((!ua) || result)) {
                        result = test.apply(Y, args);
                    }

                    feature.result = result;
                }
            }

            return result;
        }
    });

    // Y.Features.add("load", "1", {});
    // Y.Features.test("load", "1");
    // caps=1:1;2:0;3:1;