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 specific 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;
-
-
-