weekly release 2.4dev
[moodle.git] / lib / yuilib / 3.7.1 / build / selector-css2 / selector-css2-coverage.js
blob6b87329ec757eb2b4e4ae2a0183bf20608f94576
1 /*
2 YUI 3.7.1 (build 5627)
3 Copyright 2012 Yahoo! Inc. All rights reserved.
4 Licensed under the BSD License.
5 http://yuilibrary.com/license/
6 */
7 if (typeof _yuitest_coverage == "undefined"){
8     _yuitest_coverage = {};
9     _yuitest_coverline = function(src, line){
10         var coverage = _yuitest_coverage[src];
11         if (!coverage.lines[line]){
12             coverage.calledLines++;
13         }
14         coverage.lines[line]++;
15     };
16     _yuitest_coverfunc = function(src, name, line){
17         var coverage = _yuitest_coverage[src],
18             funcId = name + ":" + line;
19         if (!coverage.functions[funcId]){
20             coverage.calledFunctions++;
21         }
22         coverage.functions[funcId]++;
23     };
25 _yuitest_coverage["build/selector-css2/selector-css2.js"] = {
26     lines: {},
27     functions: {},
28     coveredLines: 0,
29     calledLines: 0,
30     coveredFunctions: 0,
31     calledFunctions: 0,
32     path: "build/selector-css2/selector-css2.js",
33     code: []
35 _yuitest_coverage["build/selector-css2/selector-css2.js"].code=["YUI.add('selector-css2', function (Y, NAME) {","","/**"," * The selector module provides helper methods allowing CSS2 Selectors to be used with DOM elements."," * @module dom"," * @submodule selector-css2"," * @for Selector"," */","","/*"," * Provides helper methods for collecting and filtering DOM elements."," */","","var PARENT_NODE = 'parentNode',","    TAG_NAME = 'tagName',","    ATTRIBUTES = 'attributes',","    COMBINATOR = 'combinator',","    PSEUDOS = 'pseudos',","","    Selector = Y.Selector,","","    SelectorCSS2 = {","        _reRegExpTokens: /([\\^\\$\\?\\[\\]\\*\\+\\-\\.\\(\\)\\|\\\\])/,","        SORT_RESULTS: true,","","        // TODO: better detection, document specific","        _isXML: (function() {","            var isXML = (Y.config.doc.createElement('div').tagName !== 'DIV');","            return isXML;","        }()),","","        /**","         * Mapping of shorthand tokens to corresponding attribute selector ","         * @property shorthand","         * @type object","         */","        shorthand: {","            '\\\\#(-?[_a-z0-9]+[-\\\\w\\\\uE000]*)': '[id=$1]',","            '\\\\.(-?[_a-z]+[-\\\\w\\\\uE000]*)': '[className~=$1]'","        },","","        /**","         * List of operators and corresponding boolean functions. ","         * These functions are passed the attribute and the current node's value of the attribute.","         * @property operators","         * @type object","         */","        operators: {","            '': function(node, attr) { return Y.DOM.getAttribute(node, attr) !== ''; }, // Just test for existence of attribute","            '~=': '(?:^|\\\\s+){val}(?:\\\\s+|$)', // space-delimited","            '|=': '^{val}-?' // optional hyphen-delimited","        },","","        pseudos: {","           'first-child': function(node) { ","                return Y.DOM._children(node[PARENT_NODE])[0] === node; ","            } ","        },","","        _bruteQuery: function(selector, root, firstOnly) {","            var ret = [],","                nodes = [],","                tokens = Selector._tokenize(selector),","                token = tokens[tokens.length - 1],","                rootDoc = Y.DOM._getDoc(root),","                child,","                id,","                className,","                tagName;","","            if (token) {","                // prefilter nodes","                id = token.id;","                className = token.className;","                tagName = token.tagName || '*';","","                if (root.getElementsByTagName) { // non-IE lacks DOM api on doc frags","                    // try ID first, unless no root.all && root not in document","                    // (root.all works off document, but not getElementById)","                    if (id && (root.all || (root.nodeType === 9 || Y.DOM.inDoc(root)))) {","                        nodes = Y.DOM.allById(id, root);","                    // try className","                    } else if (className) {","                        nodes = root.getElementsByClassName(className);","                    } else { // default to tagName","                        nodes = root.getElementsByTagName(tagName);","                    }","","                } else { // brute getElementsByTagName()","                    child = root.firstChild;","                    while (child) {","                        // only collect HTMLElements","                        // match tag to supplement missing getElementsByTagName","                        if (child.tagName && (tagName === '*' || child.tagName === tagName)) {","                            nodes.push(child);","                        }","                        child = child.nextSibling || child.firstChild;","                    }","                }","                if (nodes.length) {","                    ret = Selector._filterNodes(nodes, tokens, firstOnly);","                }","            }","","            return ret;","        },","        ","        _filterNodes: function(nodes, tokens, firstOnly) {","            var i = 0,","                j,","                len = tokens.length,","                n = len - 1,","                result = [],","                node = nodes[0],","                tmpNode = node,","                getters = Y.Selector.getters,","                operator,","                combinator,","                token,","                path,","                pass,","                value,","                tests,","                test;","","            for (i = 0; (tmpNode = node = nodes[i++]);) {","                n = len - 1;","                path = null;","                ","                testLoop:","                while (tmpNode && tmpNode.tagName) {","                    token = tokens[n];","                    tests = token.tests;","                    j = tests.length;","                    if (j && !pass) {","                        while ((test = tests[--j])) {","                            operator = test[1];","                            if (getters[test[0]]) {","                                value = getters[test[0]](tmpNode, test[0]);","                            } else {","                                value = tmpNode[test[0]];","                                if (test[0] === 'tagName' && !Selector._isXML) {","                                    value = value.toUpperCase();    ","                                }","                                if (typeof value != 'string' && value !== undefined && value.toString) {","                                    value = value.toString(); // coerce for comparison","                                } else if (value === undefined && tmpNode.getAttribute) {","                                    // use getAttribute for non-standard attributes","                                    value = tmpNode.getAttribute(test[0], 2); // 2 === force string for IE","                                }","                            }","","                            if ((operator === '=' && value !== test[2]) ||  // fast path for equality","                                (typeof operator !== 'string' && // protect against String.test monkey-patch (Moo)","                                operator.test && !operator.test(value)) ||  // regex test","                                (!operator.test && // protect against RegExp as function (webkit)","                                        typeof operator === 'function' && !operator(tmpNode, test[0], test[2]))) { // function test","","                                // skip non element nodes or non-matching tags","                                if ((tmpNode = tmpNode[path])) {","                                    while (tmpNode &&","                                        (!tmpNode.tagName ||","                                            (token.tagName && token.tagName !== tmpNode.tagName))","                                    ) {","                                        tmpNode = tmpNode[path]; ","                                    }","                                }","                                continue testLoop;","                            }","                        }","                    }","","                    n--; // move to next token","                    // now that we've passed the test, move up the tree by combinator","                    if (!pass && (combinator = token.combinator)) {","                        path = combinator.axis;","                        tmpNode = tmpNode[path];","","                        // skip non element nodes","                        while (tmpNode && !tmpNode.tagName) {","                            tmpNode = tmpNode[path]; ","                        }","","                        if (combinator.direct) { // one pass only","                            path = null; ","                        }","","                    } else { // success if we made it this far","                        result.push(node);","                        if (firstOnly) {","                            return result;","                        }","                        break;","                    }","                }","            }","            node = tmpNode = null;","            return result;","        },","","        combinators: {","            ' ': {","                axis: 'parentNode'","            },","","            '>': {","                axis: 'parentNode',","                direct: true","            },","","","            '+': {","                axis: 'previousSibling',","                direct: true","            }","        },","","        _parsers: [","            {","                name: ATTRIBUTES,","                re: /^\\uE003(-?[a-z]+[\\w\\-]*)+([~\\|\\^\\$\\*!=]=?)?['\"]?([^\\uE004'\"]*)['\"]?\\uE004/i,","                fn: function(match, token) {","                    var operator = match[2] || '',","                        operators = Selector.operators,","                        escVal = (match[3]) ? match[3].replace(/\\\\/g, '') : '',","                        test;","","                    // add prefiltering for ID and CLASS","                    if ((match[1] === 'id' && operator === '=') ||","                            (match[1] === 'className' &&","                            Y.config.doc.documentElement.getElementsByClassName &&","                            (operator === '~=' || operator === '='))) {","                        token.prefilter = match[1];","","","                        match[3] = escVal; ","","                        // escape all but ID for prefilter, which may run through QSA (via Dom.allById)","                        token[match[1]] = (match[1] === 'id') ? match[3] : escVal;","","                    }","","                    // add tests","                    if (operator in operators) {","                        test = operators[operator];","                        if (typeof test === 'string') {","                            match[3] = escVal.replace(Selector._reRegExpTokens, '\\\\$1');","                            test = new RegExp(test.replace('{val}', match[3]));","                        }","                        match[2] = test;","                    }","                    if (!token.last || token.prefilter !== match[1]) {","                        return match.slice(1);","                    }","                }","            },","            {","                name: TAG_NAME,","                re: /^((?:-?[_a-z]+[\\w-]*)|\\*)/i,","                fn: function(match, token) {","                    var tag = match[1];","","                    if (!Selector._isXML) {","                        tag = tag.toUpperCase();","                    }","","                    token.tagName = tag;","","                    if (tag !== '*' && (!token.last || token.prefilter)) {","                        return [TAG_NAME, '=', tag];","                    }","                    if (!token.prefilter) {","                        token.prefilter = 'tagName';","                    }","                }","            },","            {","                name: COMBINATOR,","                re: /^\\s*([>+~]|\\s)\\s*/,","                fn: function(match, token) {","                }","            },","            {","                name: PSEUDOS,","                re: /^:([\\-\\w]+)(?:\\uE005['\"]?([^\\uE005]*)['\"]?\\uE006)*/i,","                fn: function(match, token) {","                    var test = Selector[PSEUDOS][match[1]];","                    if (test) { // reorder match array and unescape special chars for tests","                        if (match[2]) {","                            match[2] = match[2].replace(/\\\\/g, '');","                        }","                        return [match[2], test]; ","                    } else { // selector token not supported (possibly missing CSS3 module)","                        return false;","                    }","                }","            }","            ],","","        _getToken: function(token) {","            return {","                tagName: null,","                id: null,","                className: null,","                attributes: {},","                combinator: null,","                tests: []","            };","        },","","        /*","            Break selector into token units per simple selector.","            Combinator is attached to the previous token.","         */","        _tokenize: function(selector) {","            selector = selector || '';","            selector = Selector._parseSelector(Y.Lang.trim(selector)); ","            var token = Selector._getToken(),     // one token per simple selector (left selector holds combinator)","                query = selector, // original query for debug report","                tokens = [],    // array of tokens","                found = false,  // whether or not any matches were found this pass","                match,         // the regex match","                test,","                i, parser;","","            /*","                Search for selector patterns, store, and strip them from the selector string","                until no patterns match (invalid selector) or we run out of chars.","","                Multiple attributes and pseudos are allowed, in any order.","                for example:","                    'form:first-child[type=button]:not(button)[lang|=en]'","            */","            outer:","            do {","                found = false; // reset after full pass","                for (i = 0; (parser = Selector._parsers[i++]);) {","                    if ( (match = parser.re.exec(selector)) ) { // note assignment","                        if (parser.name !== COMBINATOR ) {","                            token.selector = selector;","                        }","                        selector = selector.replace(match[0], ''); // strip current match from selector","                        if (!selector.length) {","                            token.last = true;","                        }","","                        if (Selector._attrFilters[match[1]]) { // convert class to className, etc.","                            match[1] = Selector._attrFilters[match[1]];","                        }","","                        test = parser.fn(match, token);","                        if (test === false) { // selector not supported","                            found = false;","                            break outer;","                        } else if (test) {","                            token.tests.push(test);","                        }","","                        if (!selector.length || parser.name === COMBINATOR) {","                            tokens.push(token);","                            token = Selector._getToken(token);","                            if (parser.name === COMBINATOR) {","                                token.combinator = Y.Selector.combinators[match[1]];","                            }","                        }","                        found = true;","                    }","                }","            } while (found && selector.length);","","            if (!found || selector.length) { // not fully parsed","                tokens = [];","            }","            return tokens;","        },","","        _replaceMarkers: function(selector) {","            selector = selector.replace(/\\[/g, '\\uE003');","            selector = selector.replace(/\\]/g, '\\uE004');","","            selector = selector.replace(/\\(/g, '\\uE005');","            selector = selector.replace(/\\)/g, '\\uE006');","            return selector;","        },","","        _replaceShorthand: function(selector) {","            var shorthand = Y.Selector.shorthand,","                re;","","            for (re in shorthand) {","                if (shorthand.hasOwnProperty(re)) {","                    selector = selector.replace(new RegExp(re, 'gi'), shorthand[re]);","                }","            }","","            return selector;","        },","","        _parseSelector: function(selector) {","            var replaced = Y.Selector._replaceSelector(selector),","                selector = replaced.selector;","","            // replace shorthand (\".foo, #bar\") after pseudos and attrs","            // to avoid replacing unescaped chars","            selector = Y.Selector._replaceShorthand(selector);","","            selector = Y.Selector._restore('attr', selector, replaced.attrs);","            selector = Y.Selector._restore('pseudo', selector, replaced.pseudos);","","            // replace braces and parens before restoring escaped chars","            // to avoid replacing ecaped markers","            selector = Y.Selector._replaceMarkers(selector);","            selector = Y.Selector._restore('esc', selector, replaced.esc);","","            return selector;","        },","","        _attrFilters: {","            'class': 'className',","            'for': 'htmlFor'","        },","","        getters: {","            href: function(node, attr) {","                return Y.DOM.getAttribute(node, attr);","            },","","            id: function(node, attr) {","                return Y.DOM.getId(node);","            }","        }","    };","","Y.mix(Y.Selector, SelectorCSS2, true);","Y.Selector.getters.src = Y.Selector.getters.rel = Y.Selector.getters.href;","","// IE wants class with native queries","if (Y.Selector.useNative && Y.config.doc.querySelector) {","    Y.Selector.shorthand['\\\\.(-?[_a-z]+[-\\\\w]*)'] = '[class~=$1]';","}","","","","}, '3.7.1', {\"requires\": [\"selector-native\"]});"];
36 _yuitest_coverage["build/selector-css2/selector-css2.js"].lines = {"1":0,"14":0,"28":0,"29":0,"49":0,"56":0,"61":0,"71":0,"73":0,"74":0,"75":0,"77":0,"80":0,"81":0,"83":0,"84":0,"86":0,"90":0,"91":0,"94":0,"95":0,"97":0,"100":0,"101":0,"105":0,"109":0,"126":0,"127":0,"128":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"141":0,"142":0,"143":0,"145":0,"146":0,"147":0,"149":0,"153":0,"160":0,"161":0,"165":0,"168":0,"173":0,"175":0,"176":0,"177":0,"180":0,"181":0,"184":0,"185":0,"189":0,"190":0,"191":0,"193":0,"197":0,"198":0,"223":0,"229":0,"233":0,"236":0,"239":0,"244":0,"245":0,"246":0,"247":0,"248":0,"250":0,"252":0,"253":0,"261":0,"263":0,"264":0,"267":0,"269":0,"270":0,"272":0,"273":0,"287":0,"288":0,"289":0,"290":0,"292":0,"294":0,"301":0,"316":0,"317":0,"318":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":0,"342":0,"343":0,"344":0,"347":0,"348":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"359":0,"360":0,"361":0,"362":0,"363":0,"366":0,"371":0,"372":0,"374":0,"378":0,"379":0,"381":0,"382":0,"383":0,"387":0,"390":0,"391":0,"392":0,"396":0,"400":0,"405":0,"407":0,"408":0,"412":0,"413":0,"415":0,"425":0,"429":0,"434":0,"435":0,"438":0,"439":0};
37 _yuitest_coverage["build/selector-css2/selector-css2.js"].functions = {"(anonymous 2):27":0,"\'\':49":0,"\'first-child\':55":0,"_bruteQuery:60":0,"_filterNodes:108":0,"fn:222":0,"fn:260":0,"fn:286":0,"_getToken:300":0,"_tokenize:315":0,"_replaceMarkers:377":0,"_replaceShorthand:386":0,"_parseSelector:399":0,"href:424":0,"id:428":0,"(anonymous 1):1":0};
38 _yuitest_coverage["build/selector-css2/selector-css2.js"].coveredLines = 146;
39 _yuitest_coverage["build/selector-css2/selector-css2.js"].coveredFunctions = 16;
40 _yuitest_coverline("build/selector-css2/selector-css2.js", 1);
41 YUI.add('selector-css2', function (Y, NAME) {
43 /**
44  * The selector module provides helper methods allowing CSS2 Selectors to be used with DOM elements.
45  * @module dom
46  * @submodule selector-css2
47  * @for Selector
48  */
51  * Provides helper methods for collecting and filtering DOM elements.
52  */
54 _yuitest_coverfunc("build/selector-css2/selector-css2.js", "(anonymous 1)", 1);
55 _yuitest_coverline("build/selector-css2/selector-css2.js", 14);
56 var PARENT_NODE = 'parentNode',
57     TAG_NAME = 'tagName',
58     ATTRIBUTES = 'attributes',
59     COMBINATOR = 'combinator',
60     PSEUDOS = 'pseudos',
62     Selector = Y.Selector,
64     SelectorCSS2 = {
65         _reRegExpTokens: /([\^\$\?\[\]\*\+\-\.\(\)\|\\])/,
66         SORT_RESULTS: true,
68         // TODO: better detection, document specific
69         _isXML: (function() {
70             _yuitest_coverfunc("build/selector-css2/selector-css2.js", "(anonymous 2)", 27);
71 _yuitest_coverline("build/selector-css2/selector-css2.js", 28);
72 var isXML = (Y.config.doc.createElement('div').tagName !== 'DIV');
73             _yuitest_coverline("build/selector-css2/selector-css2.js", 29);
74 return isXML;
75         }()),
77         /**
78          * Mapping of shorthand tokens to corresponding attribute selector 
79          * @property shorthand
80          * @type object
81          */
82         shorthand: {
83             '\\#(-?[_a-z0-9]+[-\\w\\uE000]*)': '[id=$1]',
84             '\\.(-?[_a-z]+[-\\w\\uE000]*)': '[className~=$1]'
85         },
87         /**
88          * List of operators and corresponding boolean functions. 
89          * These functions are passed the attribute and the current node's value of the attribute.
90          * @property operators
91          * @type object
92          */
93         operators: {
94             '': function(node, attr) { _yuitest_coverfunc("build/selector-css2/selector-css2.js", "\'\'", 49);
95 _yuitest_coverline("build/selector-css2/selector-css2.js", 49);
96 return Y.DOM.getAttribute(node, attr) !== ''; }, // Just test for existence of attribute
97             '~=': '(?:^|\\s+){val}(?:\\s+|$)', // space-delimited
98             '|=': '^{val}-?' // optional hyphen-delimited
99         },
101         pseudos: {
102            'first-child': function(node) { 
103                 _yuitest_coverfunc("build/selector-css2/selector-css2.js", "\'first-child\'", 55);
104 _yuitest_coverline("build/selector-css2/selector-css2.js", 56);
105 return Y.DOM._children(node[PARENT_NODE])[0] === node; 
106             } 
107         },
109         _bruteQuery: function(selector, root, firstOnly) {
110             _yuitest_coverfunc("build/selector-css2/selector-css2.js", "_bruteQuery", 60);
111 _yuitest_coverline("build/selector-css2/selector-css2.js", 61);
112 var ret = [],
113                 nodes = [],
114                 tokens = Selector._tokenize(selector),
115                 token = tokens[tokens.length - 1],
116                 rootDoc = Y.DOM._getDoc(root),
117                 child,
118                 id,
119                 className,
120                 tagName;
122             _yuitest_coverline("build/selector-css2/selector-css2.js", 71);
123 if (token) {
124                 // prefilter nodes
125                 _yuitest_coverline("build/selector-css2/selector-css2.js", 73);
126 id = token.id;
127                 _yuitest_coverline("build/selector-css2/selector-css2.js", 74);
128 className = token.className;
129                 _yuitest_coverline("build/selector-css2/selector-css2.js", 75);
130 tagName = token.tagName || '*';
132                 _yuitest_coverline("build/selector-css2/selector-css2.js", 77);
133 if (root.getElementsByTagName) { // non-IE lacks DOM api on doc frags
134                     // try ID first, unless no root.all && root not in document
135                     // (root.all works off document, but not getElementById)
136                     _yuitest_coverline("build/selector-css2/selector-css2.js", 80);
137 if (id && (root.all || (root.nodeType === 9 || Y.DOM.inDoc(root)))) {
138                         _yuitest_coverline("build/selector-css2/selector-css2.js", 81);
139 nodes = Y.DOM.allById(id, root);
140                     // try className
141                     } else {_yuitest_coverline("build/selector-css2/selector-css2.js", 83);
142 if (className) {
143                         _yuitest_coverline("build/selector-css2/selector-css2.js", 84);
144 nodes = root.getElementsByClassName(className);
145                     } else { // default to tagName
146                         _yuitest_coverline("build/selector-css2/selector-css2.js", 86);
147 nodes = root.getElementsByTagName(tagName);
148                     }}
150                 } else { // brute getElementsByTagName()
151                     _yuitest_coverline("build/selector-css2/selector-css2.js", 90);
152 child = root.firstChild;
153                     _yuitest_coverline("build/selector-css2/selector-css2.js", 91);
154 while (child) {
155                         // only collect HTMLElements
156                         // match tag to supplement missing getElementsByTagName
157                         _yuitest_coverline("build/selector-css2/selector-css2.js", 94);
158 if (child.tagName && (tagName === '*' || child.tagName === tagName)) {
159                             _yuitest_coverline("build/selector-css2/selector-css2.js", 95);
160 nodes.push(child);
161                         }
162                         _yuitest_coverline("build/selector-css2/selector-css2.js", 97);
163 child = child.nextSibling || child.firstChild;
164                     }
165                 }
166                 _yuitest_coverline("build/selector-css2/selector-css2.js", 100);
167 if (nodes.length) {
168                     _yuitest_coverline("build/selector-css2/selector-css2.js", 101);
169 ret = Selector._filterNodes(nodes, tokens, firstOnly);
170                 }
171             }
173             _yuitest_coverline("build/selector-css2/selector-css2.js", 105);
174 return ret;
175         },
176         
177         _filterNodes: function(nodes, tokens, firstOnly) {
178             _yuitest_coverfunc("build/selector-css2/selector-css2.js", "_filterNodes", 108);
179 _yuitest_coverline("build/selector-css2/selector-css2.js", 109);
180 var i = 0,
181                 j,
182                 len = tokens.length,
183                 n = len - 1,
184                 result = [],
185                 node = nodes[0],
186                 tmpNode = node,
187                 getters = Y.Selector.getters,
188                 operator,
189                 combinator,
190                 token,
191                 path,
192                 pass,
193                 value,
194                 tests,
195                 test;
197             _yuitest_coverline("build/selector-css2/selector-css2.js", 126);
198 for (i = 0; (tmpNode = node = nodes[i++]);) {
199                 _yuitest_coverline("build/selector-css2/selector-css2.js", 127);
200 n = len - 1;
201                 _yuitest_coverline("build/selector-css2/selector-css2.js", 128);
202 path = null;
203                 
204                 _yuitest_coverline("build/selector-css2/selector-css2.js", 130);
205 testLoop:
206                 _yuitest_coverline("build/selector-css2/selector-css2.js", 131);
207 while (tmpNode && tmpNode.tagName) {
208                     _yuitest_coverline("build/selector-css2/selector-css2.js", 132);
209 token = tokens[n];
210                     _yuitest_coverline("build/selector-css2/selector-css2.js", 133);
211 tests = token.tests;
212                     _yuitest_coverline("build/selector-css2/selector-css2.js", 134);
213 j = tests.length;
214                     _yuitest_coverline("build/selector-css2/selector-css2.js", 135);
215 if (j && !pass) {
216                         _yuitest_coverline("build/selector-css2/selector-css2.js", 136);
217 while ((test = tests[--j])) {
218                             _yuitest_coverline("build/selector-css2/selector-css2.js", 137);
219 operator = test[1];
220                             _yuitest_coverline("build/selector-css2/selector-css2.js", 138);
221 if (getters[test[0]]) {
222                                 _yuitest_coverline("build/selector-css2/selector-css2.js", 139);
223 value = getters[test[0]](tmpNode, test[0]);
224                             } else {
225                                 _yuitest_coverline("build/selector-css2/selector-css2.js", 141);
226 value = tmpNode[test[0]];
227                                 _yuitest_coverline("build/selector-css2/selector-css2.js", 142);
228 if (test[0] === 'tagName' && !Selector._isXML) {
229                                     _yuitest_coverline("build/selector-css2/selector-css2.js", 143);
230 value = value.toUpperCase();    
231                                 }
232                                 _yuitest_coverline("build/selector-css2/selector-css2.js", 145);
233 if (typeof value != 'string' && value !== undefined && value.toString) {
234                                     _yuitest_coverline("build/selector-css2/selector-css2.js", 146);
235 value = value.toString(); // coerce for comparison
236                                 } else {_yuitest_coverline("build/selector-css2/selector-css2.js", 147);
237 if (value === undefined && tmpNode.getAttribute) {
238                                     // use getAttribute for non-standard attributes
239                                     _yuitest_coverline("build/selector-css2/selector-css2.js", 149);
240 value = tmpNode.getAttribute(test[0], 2); // 2 === force string for IE
241                                 }}
242                             }
244                             _yuitest_coverline("build/selector-css2/selector-css2.js", 153);
245 if ((operator === '=' && value !== test[2]) ||  // fast path for equality
246                                 (typeof operator !== 'string' && // protect against String.test monkey-patch (Moo)
247                                 operator.test && !operator.test(value)) ||  // regex test
248                                 (!operator.test && // protect against RegExp as function (webkit)
249                                         typeof operator === 'function' && !operator(tmpNode, test[0], test[2]))) { // function test
251                                 // skip non element nodes or non-matching tags
252                                 _yuitest_coverline("build/selector-css2/selector-css2.js", 160);
253 if ((tmpNode = tmpNode[path])) {
254                                     _yuitest_coverline("build/selector-css2/selector-css2.js", 161);
255 while (tmpNode &&
256                                         (!tmpNode.tagName ||
257                                             (token.tagName && token.tagName !== tmpNode.tagName))
258                                     ) {
259                                         _yuitest_coverline("build/selector-css2/selector-css2.js", 165);
260 tmpNode = tmpNode[path]; 
261                                     }
262                                 }
263                                 _yuitest_coverline("build/selector-css2/selector-css2.js", 168);
264 continue testLoop;
265                             }
266                         }
267                     }
269                     _yuitest_coverline("build/selector-css2/selector-css2.js", 173);
270 n--; // move to next token
271                     // now that we've passed the test, move up the tree by combinator
272                     _yuitest_coverline("build/selector-css2/selector-css2.js", 175);
273 if (!pass && (combinator = token.combinator)) {
274                         _yuitest_coverline("build/selector-css2/selector-css2.js", 176);
275 path = combinator.axis;
276                         _yuitest_coverline("build/selector-css2/selector-css2.js", 177);
277 tmpNode = tmpNode[path];
279                         // skip non element nodes
280                         _yuitest_coverline("build/selector-css2/selector-css2.js", 180);
281 while (tmpNode && !tmpNode.tagName) {
282                             _yuitest_coverline("build/selector-css2/selector-css2.js", 181);
283 tmpNode = tmpNode[path]; 
284                         }
286                         _yuitest_coverline("build/selector-css2/selector-css2.js", 184);
287 if (combinator.direct) { // one pass only
288                             _yuitest_coverline("build/selector-css2/selector-css2.js", 185);
289 path = null; 
290                         }
292                     } else { // success if we made it this far
293                         _yuitest_coverline("build/selector-css2/selector-css2.js", 189);
294 result.push(node);
295                         _yuitest_coverline("build/selector-css2/selector-css2.js", 190);
296 if (firstOnly) {
297                             _yuitest_coverline("build/selector-css2/selector-css2.js", 191);
298 return result;
299                         }
300                         _yuitest_coverline("build/selector-css2/selector-css2.js", 193);
301 break;
302                     }
303                 }
304             }
305             _yuitest_coverline("build/selector-css2/selector-css2.js", 197);
306 node = tmpNode = null;
307             _yuitest_coverline("build/selector-css2/selector-css2.js", 198);
308 return result;
309         },
311         combinators: {
312             ' ': {
313                 axis: 'parentNode'
314             },
316             '>': {
317                 axis: 'parentNode',
318                 direct: true
319             },
322             '+': {
323                 axis: 'previousSibling',
324                 direct: true
325             }
326         },
328         _parsers: [
329             {
330                 name: ATTRIBUTES,
331                 re: /^\uE003(-?[a-z]+[\w\-]*)+([~\|\^\$\*!=]=?)?['"]?([^\uE004'"]*)['"]?\uE004/i,
332                 fn: function(match, token) {
333                     _yuitest_coverfunc("build/selector-css2/selector-css2.js", "fn", 222);
334 _yuitest_coverline("build/selector-css2/selector-css2.js", 223);
335 var operator = match[2] || '',
336                         operators = Selector.operators,
337                         escVal = (match[3]) ? match[3].replace(/\\/g, '') : '',
338                         test;
340                     // add prefiltering for ID and CLASS
341                     _yuitest_coverline("build/selector-css2/selector-css2.js", 229);
342 if ((match[1] === 'id' && operator === '=') ||
343                             (match[1] === 'className' &&
344                             Y.config.doc.documentElement.getElementsByClassName &&
345                             (operator === '~=' || operator === '='))) {
346                         _yuitest_coverline("build/selector-css2/selector-css2.js", 233);
347 token.prefilter = match[1];
350                         _yuitest_coverline("build/selector-css2/selector-css2.js", 236);
351 match[3] = escVal; 
353                         // escape all but ID for prefilter, which may run through QSA (via Dom.allById)
354                         _yuitest_coverline("build/selector-css2/selector-css2.js", 239);
355 token[match[1]] = (match[1] === 'id') ? match[3] : escVal;
357                     }
359                     // add tests
360                     _yuitest_coverline("build/selector-css2/selector-css2.js", 244);
361 if (operator in operators) {
362                         _yuitest_coverline("build/selector-css2/selector-css2.js", 245);
363 test = operators[operator];
364                         _yuitest_coverline("build/selector-css2/selector-css2.js", 246);
365 if (typeof test === 'string') {
366                             _yuitest_coverline("build/selector-css2/selector-css2.js", 247);
367 match[3] = escVal.replace(Selector._reRegExpTokens, '\\$1');
368                             _yuitest_coverline("build/selector-css2/selector-css2.js", 248);
369 test = new RegExp(test.replace('{val}', match[3]));
370                         }
371                         _yuitest_coverline("build/selector-css2/selector-css2.js", 250);
372 match[2] = test;
373                     }
374                     _yuitest_coverline("build/selector-css2/selector-css2.js", 252);
375 if (!token.last || token.prefilter !== match[1]) {
376                         _yuitest_coverline("build/selector-css2/selector-css2.js", 253);
377 return match.slice(1);
378                     }
379                 }
380             },
381             {
382                 name: TAG_NAME,
383                 re: /^((?:-?[_a-z]+[\w-]*)|\*)/i,
384                 fn: function(match, token) {
385                     _yuitest_coverfunc("build/selector-css2/selector-css2.js", "fn", 260);
386 _yuitest_coverline("build/selector-css2/selector-css2.js", 261);
387 var tag = match[1];
389                     _yuitest_coverline("build/selector-css2/selector-css2.js", 263);
390 if (!Selector._isXML) {
391                         _yuitest_coverline("build/selector-css2/selector-css2.js", 264);
392 tag = tag.toUpperCase();
393                     }
395                     _yuitest_coverline("build/selector-css2/selector-css2.js", 267);
396 token.tagName = tag;
398                     _yuitest_coverline("build/selector-css2/selector-css2.js", 269);
399 if (tag !== '*' && (!token.last || token.prefilter)) {
400                         _yuitest_coverline("build/selector-css2/selector-css2.js", 270);
401 return [TAG_NAME, '=', tag];
402                     }
403                     _yuitest_coverline("build/selector-css2/selector-css2.js", 272);
404 if (!token.prefilter) {
405                         _yuitest_coverline("build/selector-css2/selector-css2.js", 273);
406 token.prefilter = 'tagName';
407                     }
408                 }
409             },
410             {
411                 name: COMBINATOR,
412                 re: /^\s*([>+~]|\s)\s*/,
413                 fn: function(match, token) {
414                 }
415             },
416             {
417                 name: PSEUDOS,
418                 re: /^:([\-\w]+)(?:\uE005['"]?([^\uE005]*)['"]?\uE006)*/i,
419                 fn: function(match, token) {
420                     _yuitest_coverfunc("build/selector-css2/selector-css2.js", "fn", 286);
421 _yuitest_coverline("build/selector-css2/selector-css2.js", 287);
422 var test = Selector[PSEUDOS][match[1]];
423                     _yuitest_coverline("build/selector-css2/selector-css2.js", 288);
424 if (test) { // reorder match array and unescape special chars for tests
425                         _yuitest_coverline("build/selector-css2/selector-css2.js", 289);
426 if (match[2]) {
427                             _yuitest_coverline("build/selector-css2/selector-css2.js", 290);
428 match[2] = match[2].replace(/\\/g, '');
429                         }
430                         _yuitest_coverline("build/selector-css2/selector-css2.js", 292);
431 return [match[2], test]; 
432                     } else { // selector token not supported (possibly missing CSS3 module)
433                         _yuitest_coverline("build/selector-css2/selector-css2.js", 294);
434 return false;
435                     }
436                 }
437             }
438             ],
440         _getToken: function(token) {
441             _yuitest_coverfunc("build/selector-css2/selector-css2.js", "_getToken", 300);
442 _yuitest_coverline("build/selector-css2/selector-css2.js", 301);
443 return {
444                 tagName: null,
445                 id: null,
446                 className: null,
447                 attributes: {},
448                 combinator: null,
449                 tests: []
450             };
451         },
453         /*
454             Break selector into token units per simple selector.
455             Combinator is attached to the previous token.
456          */
457         _tokenize: function(selector) {
458             _yuitest_coverfunc("build/selector-css2/selector-css2.js", "_tokenize", 315);
459 _yuitest_coverline("build/selector-css2/selector-css2.js", 316);
460 selector = selector || '';
461             _yuitest_coverline("build/selector-css2/selector-css2.js", 317);
462 selector = Selector._parseSelector(Y.Lang.trim(selector)); 
463             _yuitest_coverline("build/selector-css2/selector-css2.js", 318);
464 var token = Selector._getToken(),     // one token per simple selector (left selector holds combinator)
465                 query = selector, // original query for debug report
466                 tokens = [],    // array of tokens
467                 found = false,  // whether or not any matches were found this pass
468                 match,         // the regex match
469                 test,
470                 i, parser;
472             /*
473                 Search for selector patterns, store, and strip them from the selector string
474                 until no patterns match (invalid selector) or we run out of chars.
476                 Multiple attributes and pseudos are allowed, in any order.
477                 for example:
478                     'form:first-child[type=button]:not(button)[lang|=en]'
479             */
480             _yuitest_coverline("build/selector-css2/selector-css2.js", 334);
481 outer:
482             _yuitest_coverline("build/selector-css2/selector-css2.js", 335);
483 do {
484                 _yuitest_coverline("build/selector-css2/selector-css2.js", 336);
485 found = false; // reset after full pass
486                 _yuitest_coverline("build/selector-css2/selector-css2.js", 337);
487 for (i = 0; (parser = Selector._parsers[i++]);) {
488                     _yuitest_coverline("build/selector-css2/selector-css2.js", 338);
489 if ( (match = parser.re.exec(selector)) ) { // note assignment
490                         _yuitest_coverline("build/selector-css2/selector-css2.js", 339);
491 if (parser.name !== COMBINATOR ) {
492                             _yuitest_coverline("build/selector-css2/selector-css2.js", 340);
493 token.selector = selector;
494                         }
495                         _yuitest_coverline("build/selector-css2/selector-css2.js", 342);
496 selector = selector.replace(match[0], ''); // strip current match from selector
497                         _yuitest_coverline("build/selector-css2/selector-css2.js", 343);
498 if (!selector.length) {
499                             _yuitest_coverline("build/selector-css2/selector-css2.js", 344);
500 token.last = true;
501                         }
503                         _yuitest_coverline("build/selector-css2/selector-css2.js", 347);
504 if (Selector._attrFilters[match[1]]) { // convert class to className, etc.
505                             _yuitest_coverline("build/selector-css2/selector-css2.js", 348);
506 match[1] = Selector._attrFilters[match[1]];
507                         }
509                         _yuitest_coverline("build/selector-css2/selector-css2.js", 351);
510 test = parser.fn(match, token);
511                         _yuitest_coverline("build/selector-css2/selector-css2.js", 352);
512 if (test === false) { // selector not supported
513                             _yuitest_coverline("build/selector-css2/selector-css2.js", 353);
514 found = false;
515                             _yuitest_coverline("build/selector-css2/selector-css2.js", 354);
516 break outer;
517                         } else {_yuitest_coverline("build/selector-css2/selector-css2.js", 355);
518 if (test) {
519                             _yuitest_coverline("build/selector-css2/selector-css2.js", 356);
520 token.tests.push(test);
521                         }}
523                         _yuitest_coverline("build/selector-css2/selector-css2.js", 359);
524 if (!selector.length || parser.name === COMBINATOR) {
525                             _yuitest_coverline("build/selector-css2/selector-css2.js", 360);
526 tokens.push(token);
527                             _yuitest_coverline("build/selector-css2/selector-css2.js", 361);
528 token = Selector._getToken(token);
529                             _yuitest_coverline("build/selector-css2/selector-css2.js", 362);
530 if (parser.name === COMBINATOR) {
531                                 _yuitest_coverline("build/selector-css2/selector-css2.js", 363);
532 token.combinator = Y.Selector.combinators[match[1]];
533                             }
534                         }
535                         _yuitest_coverline("build/selector-css2/selector-css2.js", 366);
536 found = true;
537                     }
538                 }
539             }while (found && selector.length);
541             _yuitest_coverline("build/selector-css2/selector-css2.js", 371);
542 if (!found || selector.length) { // not fully parsed
543                 _yuitest_coverline("build/selector-css2/selector-css2.js", 372);
544 tokens = [];
545             }
546             _yuitest_coverline("build/selector-css2/selector-css2.js", 374);
547 return tokens;
548         },
550         _replaceMarkers: function(selector) {
551             _yuitest_coverfunc("build/selector-css2/selector-css2.js", "_replaceMarkers", 377);
552 _yuitest_coverline("build/selector-css2/selector-css2.js", 378);
553 selector = selector.replace(/\[/g, '\uE003');
554             _yuitest_coverline("build/selector-css2/selector-css2.js", 379);
555 selector = selector.replace(/\]/g, '\uE004');
557             _yuitest_coverline("build/selector-css2/selector-css2.js", 381);
558 selector = selector.replace(/\(/g, '\uE005');
559             _yuitest_coverline("build/selector-css2/selector-css2.js", 382);
560 selector = selector.replace(/\)/g, '\uE006');
561             _yuitest_coverline("build/selector-css2/selector-css2.js", 383);
562 return selector;
563         },
565         _replaceShorthand: function(selector) {
566             _yuitest_coverfunc("build/selector-css2/selector-css2.js", "_replaceShorthand", 386);
567 _yuitest_coverline("build/selector-css2/selector-css2.js", 387);
568 var shorthand = Y.Selector.shorthand,
569                 re;
571             _yuitest_coverline("build/selector-css2/selector-css2.js", 390);
572 for (re in shorthand) {
573                 _yuitest_coverline("build/selector-css2/selector-css2.js", 391);
574 if (shorthand.hasOwnProperty(re)) {
575                     _yuitest_coverline("build/selector-css2/selector-css2.js", 392);
576 selector = selector.replace(new RegExp(re, 'gi'), shorthand[re]);
577                 }
578             }
580             _yuitest_coverline("build/selector-css2/selector-css2.js", 396);
581 return selector;
582         },
584         _parseSelector: function(selector) {
585             _yuitest_coverfunc("build/selector-css2/selector-css2.js", "_parseSelector", 399);
586 _yuitest_coverline("build/selector-css2/selector-css2.js", 400);
587 var replaced = Y.Selector._replaceSelector(selector),
588                 selector = replaced.selector;
590             // replace shorthand (".foo, #bar") after pseudos and attrs
591             // to avoid replacing unescaped chars
592             _yuitest_coverline("build/selector-css2/selector-css2.js", 405);
593 selector = Y.Selector._replaceShorthand(selector);
595             _yuitest_coverline("build/selector-css2/selector-css2.js", 407);
596 selector = Y.Selector._restore('attr', selector, replaced.attrs);
597             _yuitest_coverline("build/selector-css2/selector-css2.js", 408);
598 selector = Y.Selector._restore('pseudo', selector, replaced.pseudos);
600             // replace braces and parens before restoring escaped chars
601             // to avoid replacing ecaped markers
602             _yuitest_coverline("build/selector-css2/selector-css2.js", 412);
603 selector = Y.Selector._replaceMarkers(selector);
604             _yuitest_coverline("build/selector-css2/selector-css2.js", 413);
605 selector = Y.Selector._restore('esc', selector, replaced.esc);
607             _yuitest_coverline("build/selector-css2/selector-css2.js", 415);
608 return selector;
609         },
611         _attrFilters: {
612             'class': 'className',
613             'for': 'htmlFor'
614         },
616         getters: {
617             href: function(node, attr) {
618                 _yuitest_coverfunc("build/selector-css2/selector-css2.js", "href", 424);
619 _yuitest_coverline("build/selector-css2/selector-css2.js", 425);
620 return Y.DOM.getAttribute(node, attr);
621             },
623             id: function(node, attr) {
624                 _yuitest_coverfunc("build/selector-css2/selector-css2.js", "id", 428);
625 _yuitest_coverline("build/selector-css2/selector-css2.js", 429);
626 return Y.DOM.getId(node);
627             }
628         }
629     };
631 _yuitest_coverline("build/selector-css2/selector-css2.js", 434);
632 Y.mix(Y.Selector, SelectorCSS2, true);
633 _yuitest_coverline("build/selector-css2/selector-css2.js", 435);
634 Y.Selector.getters.src = Y.Selector.getters.rel = Y.Selector.getters.href;
636 // IE wants class with native queries
637 _yuitest_coverline("build/selector-css2/selector-css2.js", 438);
638 if (Y.Selector.useNative && Y.config.doc.querySelector) {
639     _yuitest_coverline("build/selector-css2/selector-css2.js", 439);
640 Y.Selector.shorthand['\\.(-?[_a-z]+[-\\w]*)'] = '[class~=$1]';
645 }, '3.7.1', {"requires": ["selector-native"]});