weekly release 2.4dev
[moodle.git] / lib / yuilib / 3.7.1 / build / selector-native / selector-native-coverage.js
blobeb4faa1ef97210d05439a823f58f17f4537921c7
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-native/selector-native.js"] = {
26     lines: {},
27     functions: {},
28     coveredLines: 0,
29     calledLines: 0,
30     coveredFunctions: 0,
31     calledFunctions: 0,
32     path: "build/selector-native/selector-native.js",
33     code: []
35 _yuitest_coverage["build/selector-native/selector-native.js"].code=["YUI.add('selector-native', function (Y, NAME) {","","(function(Y) {","/**"," * The selector-native module provides support for native querySelector"," * @module dom"," * @submodule selector-native"," * @for Selector"," */","","/**"," * Provides support for using CSS selectors to query the DOM "," * @class Selector "," * @static"," * @for Selector"," */","","Y.namespace('Selector'); // allow native module to standalone","","var COMPARE_DOCUMENT_POSITION = 'compareDocumentPosition',","    OWNER_DOCUMENT = 'ownerDocument';","","var Selector = {","    _types: {","        esc: {","            token: '\\uE000',","            re: /\\\\[:\\[\\]\\(\\)#\\.\\'\\>+~\"]/gi","        },","","        attr: {","            token: '\\uE001',","            re: /(\\[[^\\]]*\\])/g","        },","","        pseudo: {","            token: '\\uE002',","            re: /(\\([^\\)]*\\))/g","        }","    },","","    useNative: true,","","    _escapeId: function(id) {","        if (id) {","            id = id.replace(/([:\\[\\]\\(\\)#\\.'<>+~\"])/g,'\\\\$1');","        }","        return id;","    },","","    _compare: ('sourceIndex' in Y.config.doc.documentElement) ?","        function(nodeA, nodeB) {","            var a = nodeA.sourceIndex,","                b = nodeB.sourceIndex;","","            if (a === b) {","                return 0;","            } else if (a > b) {","                return 1;","            }","","            return -1;","","        } : (Y.config.doc.documentElement[COMPARE_DOCUMENT_POSITION] ?","        function(nodeA, nodeB) {","            if (nodeA[COMPARE_DOCUMENT_POSITION](nodeB) & 4) {","                return -1;","            } else {","                return 1;","            }","        } :","        function(nodeA, nodeB) {","            var rangeA, rangeB, compare;","            if (nodeA && nodeB) {","                rangeA = nodeA[OWNER_DOCUMENT].createRange();","                rangeA.setStart(nodeA, 0);","                rangeB = nodeB[OWNER_DOCUMENT].createRange();","                rangeB.setStart(nodeB, 0);","                compare = rangeA.compareBoundaryPoints(1, rangeB); // 1 === Range.START_TO_END","            }","","            return compare;","        ","    }),","","    _sort: function(nodes) {","        if (nodes) {","            nodes = Y.Array(nodes, 0, true);","            if (nodes.sort) {","                nodes.sort(Selector._compare);","            }","        }","","        return nodes;","    },","","    _deDupe: function(nodes) {","        var ret = [],","            i, node;","","        for (i = 0; (node = nodes[i++]);) {","            if (!node._found) {","                ret[ret.length] = node;","                node._found = true;","            }","        }","","        for (i = 0; (node = ret[i++]);) {","            node._found = null;","            node.removeAttribute('_found');","        }","","        return ret;","    },","","    /**","     * Retrieves a set of nodes based on a given CSS selector. ","     * @method query","     *","     * @param {string} selector The CSS Selector to test the node against.","     * @param {HTMLElement} root optional An HTMLElement to start the query from. Defaults to Y.config.doc","     * @param {Boolean} firstOnly optional Whether or not to return only the first match.","     * @return {Array} An array of nodes that match the given selector.","     * @static","     */","    query: function(selector, root, firstOnly, skipNative) {","        root = root || Y.config.doc;","        var ret = [],","            useNative = (Y.Selector.useNative && Y.config.doc.querySelector && !skipNative),","            queries = [[selector, root]],","            query,","            result,","            i,","            fn = (useNative) ? Y.Selector._nativeQuery : Y.Selector._bruteQuery;","","        if (selector && fn) {","            // split group into seperate queries","            if (!skipNative && // already done if skipping","                    (!useNative || root.tagName)) { // split native when element scoping is needed","                queries = Selector._splitQueries(selector, root);","            }","","            for (i = 0; (query = queries[i++]);) {","                result = fn(query[0], query[1], firstOnly);","                if (!firstOnly) { // coerce DOM Collection to Array","                    result = Y.Array(result, 0, true);","                }","                if (result) {","                    ret = ret.concat(result);","                }","            }","","            if (queries.length > 1) { // remove dupes and sort by doc order ","                ret = Selector._sort(Selector._deDupe(ret));","            }","        }","","        return (firstOnly) ? (ret[0] || null) : ret;","","    },","","    _replaceSelector: function(selector) {","        var esc = Y.Selector._parse('esc', selector), // pull escaped colon, brackets, etc. ","            attrs,","            pseudos;","","        // first replace escaped chars, which could be present in attrs or pseudos","        selector = Y.Selector._replace('esc', selector);","","        // then replace pseudos before attrs to avoid replacing :not([foo])","        pseudos = Y.Selector._parse('pseudo', selector);","        selector = Selector._replace('pseudo', selector);","","        attrs = Y.Selector._parse('attr', selector);","        selector = Y.Selector._replace('attr', selector);","","        return {","            esc: esc,","            attrs: attrs,","            pseudos: pseudos,","            selector: selector","        };","    },","","    _restoreSelector: function(replaced) {","        var selector = replaced.selector;","        selector = Y.Selector._restore('attr', selector, replaced.attrs);","        selector = Y.Selector._restore('pseudo', selector, replaced.pseudos);","        selector = Y.Selector._restore('esc', selector, replaced.esc);","        return selector;","    },","","    _replaceCommas: function(selector) {","        var replaced = Y.Selector._replaceSelector(selector),","            selector = replaced.selector;","","        if (selector) {","            selector = selector.replace(/,/g, '\\uE007');","            replaced.selector = selector;","            selector = Y.Selector._restoreSelector(replaced);","        }","        return selector;","    },","","    // allows element scoped queries to begin with combinator","    // e.g. query('> p', document.body) === query('body > p')","    _splitQueries: function(selector, node) {","        if (selector.indexOf(',') > -1) {","            selector = Y.Selector._replaceCommas(selector);","        }","","        var groups = selector.split('\\uE007'), // split on replaced comma token","            queries = [],","            prefix = '',","            id,","            i,","            len;","","        if (node) {","            // enforce for element scoping","            if (node.nodeType === 1) { // Elements only","                id = Y.Selector._escapeId(Y.DOM.getId(node));","","                if (!id) {","                    id = Y.guid();","                    Y.DOM.setId(node, id);","                }","            ","                prefix = '[id=\"' + id + '\"] ';","            }","","            for (i = 0, len = groups.length; i < len; ++i) {","                selector =  prefix + groups[i];","                queries.push([selector, node]);","            }","        }","","        return queries;","    },","","    _nativeQuery: function(selector, root, one) {","        if (Y.UA.webkit && selector.indexOf(':checked') > -1 &&","                (Y.Selector.pseudos && Y.Selector.pseudos.checked)) { // webkit (chrome, safari) fails to pick up \"selected\"  with \"checked\"","            return Y.Selector.query(selector, root, one, true); // redo with skipNative true to try brute query","        }","        try {","            return root['querySelector' + (one ? '' : 'All')](selector);","        } catch(e) { // fallback to brute if available","            return Y.Selector.query(selector, root, one, true); // redo with skipNative true","        }","    },","","    filter: function(nodes, selector) {","        var ret = [],","            i, node;","","        if (nodes && selector) {","            for (i = 0; (node = nodes[i++]);) {","                if (Y.Selector.test(node, selector)) {","                    ret[ret.length] = node;","                }","            }","        } else {","        }","","        return ret;","    },","","    test: function(node, selector, root) {","        var ret = false,","            useFrag = false,","            groups,","            parent,","            item,","            items,","            frag,","            id,","            i, j, group;","","        if (node && node.tagName) { // only test HTMLElements","","            if (typeof selector == 'function') { // test with function","                ret = selector.call(node, node);","            } else { // test with query","                // we need a root if off-doc","                groups = selector.split(',');","                if (!root && !Y.DOM.inDoc(node)) {","                    parent = node.parentNode;","                    if (parent) { ","                        root = parent;","                    } else { // only use frag when no parent to query","                        frag = node[OWNER_DOCUMENT].createDocumentFragment();","                        frag.appendChild(node);","                        root = frag;","                        useFrag = true;","                    }","                }","                root = root || node[OWNER_DOCUMENT];","","                id = Y.Selector._escapeId(Y.DOM.getId(node));","                if (!id) {","                    id = Y.guid();","                    Y.DOM.setId(node, id);","                }","","                for (i = 0; (group = groups[i++]);) { // TODO: off-dom test","                    group += '[id=\"' + id + '\"]';","                    items = Y.Selector.query(group, root);","","                    for (j = 0; item = items[j++];) {","                        if (item === node) {","                            ret = true;","                            break;","                        }","                    }","                    if (ret) {","                        break;","                    }","                }","","                if (useFrag) { // cleanup","                    frag.removeChild(node);","                }","            };","        }","","        return ret;","    },","","    /**","     * A convenience function to emulate Y.Node's aNode.ancestor(selector).","     * @param {HTMLElement} element An HTMLElement to start the query from.","     * @param {String} selector The CSS selector to test the node against.","     * @return {HTMLElement} The ancestor node matching the selector, or null.","     * @param {Boolean} testSelf optional Whether or not to include the element in the scan ","     * @static","     * @method ancestor","     */","    ancestor: function (element, selector, testSelf) {","        return Y.DOM.ancestor(element, function(n) {","            return Y.Selector.test(n, selector);","        }, testSelf);","    },","","    _parse: function(name, selector) {","        return selector.match(Y.Selector._types[name].re);","    },","","    _replace: function(name, selector) {","        var o = Y.Selector._types[name];","        return selector.replace(o.re, o.token);","    },","","    _restore: function(name, selector, items) {","        if (items) {","            var token = Y.Selector._types[name].token,","                i, len;","            for (i = 0, len = items.length; i < len; ++i) {","                selector = selector.replace(token, items[i]);","            }","        }","        return selector;","    }","};","","Y.mix(Y.Selector, Selector, true);","","})(Y);","","","}, '3.7.1', {\"requires\": [\"dom-base\"]});"];
36 _yuitest_coverage["build/selector-native/selector-native.js"].lines = {"1":0,"3":0,"18":0,"20":0,"23":0,"44":0,"45":0,"47":0,"52":0,"55":0,"56":0,"57":0,"58":0,"61":0,"65":0,"66":0,"68":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"81":0,"86":0,"87":0,"88":0,"89":0,"93":0,"97":0,"100":0,"101":0,"102":0,"103":0,"107":0,"108":0,"109":0,"112":0,"126":0,"127":0,"135":0,"137":0,"139":0,"142":0,"143":0,"144":0,"145":0,"147":0,"148":0,"152":0,"153":0,"157":0,"162":0,"167":0,"170":0,"171":0,"173":0,"174":0,"176":0,"185":0,"186":0,"187":0,"188":0,"189":0,"193":0,"196":0,"197":0,"198":0,"199":0,"201":0,"207":0,"208":0,"211":0,"218":0,"220":0,"221":0,"223":0,"224":0,"225":0,"228":0,"231":0,"232":0,"233":0,"237":0,"241":0,"243":0,"245":0,"246":0,"248":0,"253":0,"256":0,"257":0,"258":0,"259":0,"265":0,"269":0,"279":0,"281":0,"282":0,"285":0,"286":0,"287":0,"288":0,"289":0,"291":0,"292":0,"293":0,"294":0,"297":0,"299":0,"300":0,"301":0,"302":0,"305":0,"306":0,"307":0,"309":0,"310":0,"311":0,"312":0,"315":0,"316":0,"320":0,"321":0,"323":0,"326":0,"339":0,"340":0,"345":0,"349":0,"350":0,"354":0,"355":0,"357":0,"358":0,"361":0,"365":0};
37 _yuitest_coverage["build/selector-native/selector-native.js"].functions = {"_escapeId:43":0,"(anonymous 3):51":0,"(anonymous 4):64":0,"}:71":0,"_sort:85":0,"_deDupe:96":0,"query:125":0,"_replaceSelector:161":0,"_restoreSelector:184":0,"_replaceCommas:192":0,"_splitQueries:206":0,"_nativeQuery:240":0,"filter:252":0,"test:268":0,"(anonymous 5):339":0,"ancestor:338":0,"_parse:344":0,"_replace:348":0,"_restore:353":0,"(anonymous 2):3":0,"(anonymous 1):1":0};
38 _yuitest_coverage["build/selector-native/selector-native.js"].coveredLines = 138;
39 _yuitest_coverage["build/selector-native/selector-native.js"].coveredFunctions = 21;
40 _yuitest_coverline("build/selector-native/selector-native.js", 1);
41 YUI.add('selector-native', function (Y, NAME) {
43 _yuitest_coverfunc("build/selector-native/selector-native.js", "(anonymous 1)", 1);
44 _yuitest_coverline("build/selector-native/selector-native.js", 3);
45 (function(Y) {
46 /**
47  * The selector-native module provides support for native querySelector
48  * @module dom
49  * @submodule selector-native
50  * @for Selector
51  */
53 /**
54  * Provides support for using CSS selectors to query the DOM 
55  * @class Selector 
56  * @static
57  * @for Selector
58  */
60 _yuitest_coverfunc("build/selector-native/selector-native.js", "(anonymous 2)", 3);
61 _yuitest_coverline("build/selector-native/selector-native.js", 18);
62 Y.namespace('Selector'); // allow native module to standalone
64 _yuitest_coverline("build/selector-native/selector-native.js", 20);
65 var COMPARE_DOCUMENT_POSITION = 'compareDocumentPosition',
66     OWNER_DOCUMENT = 'ownerDocument';
68 _yuitest_coverline("build/selector-native/selector-native.js", 23);
69 var Selector = {
70     _types: {
71         esc: {
72             token: '\uE000',
73             re: /\\[:\[\]\(\)#\.\'\>+~"]/gi
74         },
76         attr: {
77             token: '\uE001',
78             re: /(\[[^\]]*\])/g
79         },
81         pseudo: {
82             token: '\uE002',
83             re: /(\([^\)]*\))/g
84         }
85     },
87     useNative: true,
89     _escapeId: function(id) {
90         _yuitest_coverfunc("build/selector-native/selector-native.js", "_escapeId", 43);
91 _yuitest_coverline("build/selector-native/selector-native.js", 44);
92 if (id) {
93             _yuitest_coverline("build/selector-native/selector-native.js", 45);
94 id = id.replace(/([:\[\]\(\)#\.'<>+~"])/g,'\\$1');
95         }
96         _yuitest_coverline("build/selector-native/selector-native.js", 47);
97 return id;
98     },
100     _compare: ('sourceIndex' in Y.config.doc.documentElement) ?
101         function(nodeA, nodeB) {
102             _yuitest_coverfunc("build/selector-native/selector-native.js", "(anonymous 3)", 51);
103 _yuitest_coverline("build/selector-native/selector-native.js", 52);
104 var a = nodeA.sourceIndex,
105                 b = nodeB.sourceIndex;
107             _yuitest_coverline("build/selector-native/selector-native.js", 55);
108 if (a === b) {
109                 _yuitest_coverline("build/selector-native/selector-native.js", 56);
110 return 0;
111             } else {_yuitest_coverline("build/selector-native/selector-native.js", 57);
112 if (a > b) {
113                 _yuitest_coverline("build/selector-native/selector-native.js", 58);
114 return 1;
115             }}
117             _yuitest_coverline("build/selector-native/selector-native.js", 61);
118 return -1;
120         } : (Y.config.doc.documentElement[COMPARE_DOCUMENT_POSITION] ?
121         function(nodeA, nodeB) {
122             _yuitest_coverfunc("build/selector-native/selector-native.js", "(anonymous 4)", 64);
123 _yuitest_coverline("build/selector-native/selector-native.js", 65);
124 if (nodeA[COMPARE_DOCUMENT_POSITION](nodeB) & 4) {
125                 _yuitest_coverline("build/selector-native/selector-native.js", 66);
126 return -1;
127             } else {
128                 _yuitest_coverline("build/selector-native/selector-native.js", 68);
129 return 1;
130             }
131         } :
132         function(nodeA, nodeB) {
133             _yuitest_coverfunc("build/selector-native/selector-native.js", "}", 71);
134 _yuitest_coverline("build/selector-native/selector-native.js", 72);
135 var rangeA, rangeB, compare;
136             _yuitest_coverline("build/selector-native/selector-native.js", 73);
137 if (nodeA && nodeB) {
138                 _yuitest_coverline("build/selector-native/selector-native.js", 74);
139 rangeA = nodeA[OWNER_DOCUMENT].createRange();
140                 _yuitest_coverline("build/selector-native/selector-native.js", 75);
141 rangeA.setStart(nodeA, 0);
142                 _yuitest_coverline("build/selector-native/selector-native.js", 76);
143 rangeB = nodeB[OWNER_DOCUMENT].createRange();
144                 _yuitest_coverline("build/selector-native/selector-native.js", 77);
145 rangeB.setStart(nodeB, 0);
146                 _yuitest_coverline("build/selector-native/selector-native.js", 78);
147 compare = rangeA.compareBoundaryPoints(1, rangeB); // 1 === Range.START_TO_END
148             }
150             _yuitest_coverline("build/selector-native/selector-native.js", 81);
151 return compare;
152         
153     }),
155     _sort: function(nodes) {
156         _yuitest_coverfunc("build/selector-native/selector-native.js", "_sort", 85);
157 _yuitest_coverline("build/selector-native/selector-native.js", 86);
158 if (nodes) {
159             _yuitest_coverline("build/selector-native/selector-native.js", 87);
160 nodes = Y.Array(nodes, 0, true);
161             _yuitest_coverline("build/selector-native/selector-native.js", 88);
162 if (nodes.sort) {
163                 _yuitest_coverline("build/selector-native/selector-native.js", 89);
164 nodes.sort(Selector._compare);
165             }
166         }
168         _yuitest_coverline("build/selector-native/selector-native.js", 93);
169 return nodes;
170     },
172     _deDupe: function(nodes) {
173         _yuitest_coverfunc("build/selector-native/selector-native.js", "_deDupe", 96);
174 _yuitest_coverline("build/selector-native/selector-native.js", 97);
175 var ret = [],
176             i, node;
178         _yuitest_coverline("build/selector-native/selector-native.js", 100);
179 for (i = 0; (node = nodes[i++]);) {
180             _yuitest_coverline("build/selector-native/selector-native.js", 101);
181 if (!node._found) {
182                 _yuitest_coverline("build/selector-native/selector-native.js", 102);
183 ret[ret.length] = node;
184                 _yuitest_coverline("build/selector-native/selector-native.js", 103);
185 node._found = true;
186             }
187         }
189         _yuitest_coverline("build/selector-native/selector-native.js", 107);
190 for (i = 0; (node = ret[i++]);) {
191             _yuitest_coverline("build/selector-native/selector-native.js", 108);
192 node._found = null;
193             _yuitest_coverline("build/selector-native/selector-native.js", 109);
194 node.removeAttribute('_found');
195         }
197         _yuitest_coverline("build/selector-native/selector-native.js", 112);
198 return ret;
199     },
201     /**
202      * Retrieves a set of nodes based on a given CSS selector. 
203      * @method query
204      *
205      * @param {string} selector The CSS Selector to test the node against.
206      * @param {HTMLElement} root optional An HTMLElement to start the query from. Defaults to Y.config.doc
207      * @param {Boolean} firstOnly optional Whether or not to return only the first match.
208      * @return {Array} An array of nodes that match the given selector.
209      * @static
210      */
211     query: function(selector, root, firstOnly, skipNative) {
212         _yuitest_coverfunc("build/selector-native/selector-native.js", "query", 125);
213 _yuitest_coverline("build/selector-native/selector-native.js", 126);
214 root = root || Y.config.doc;
215         _yuitest_coverline("build/selector-native/selector-native.js", 127);
216 var ret = [],
217             useNative = (Y.Selector.useNative && Y.config.doc.querySelector && !skipNative),
218             queries = [[selector, root]],
219             query,
220             result,
221             i,
222             fn = (useNative) ? Y.Selector._nativeQuery : Y.Selector._bruteQuery;
224         _yuitest_coverline("build/selector-native/selector-native.js", 135);
225 if (selector && fn) {
226             // split group into seperate queries
227             _yuitest_coverline("build/selector-native/selector-native.js", 137);
228 if (!skipNative && // already done if skipping
229                     (!useNative || root.tagName)) { // split native when element scoping is needed
230                 _yuitest_coverline("build/selector-native/selector-native.js", 139);
231 queries = Selector._splitQueries(selector, root);
232             }
234             _yuitest_coverline("build/selector-native/selector-native.js", 142);
235 for (i = 0; (query = queries[i++]);) {
236                 _yuitest_coverline("build/selector-native/selector-native.js", 143);
237 result = fn(query[0], query[1], firstOnly);
238                 _yuitest_coverline("build/selector-native/selector-native.js", 144);
239 if (!firstOnly) { // coerce DOM Collection to Array
240                     _yuitest_coverline("build/selector-native/selector-native.js", 145);
241 result = Y.Array(result, 0, true);
242                 }
243                 _yuitest_coverline("build/selector-native/selector-native.js", 147);
244 if (result) {
245                     _yuitest_coverline("build/selector-native/selector-native.js", 148);
246 ret = ret.concat(result);
247                 }
248             }
250             _yuitest_coverline("build/selector-native/selector-native.js", 152);
251 if (queries.length > 1) { // remove dupes and sort by doc order 
252                 _yuitest_coverline("build/selector-native/selector-native.js", 153);
253 ret = Selector._sort(Selector._deDupe(ret));
254             }
255         }
257         _yuitest_coverline("build/selector-native/selector-native.js", 157);
258 return (firstOnly) ? (ret[0] || null) : ret;
260     },
262     _replaceSelector: function(selector) {
263         _yuitest_coverfunc("build/selector-native/selector-native.js", "_replaceSelector", 161);
264 _yuitest_coverline("build/selector-native/selector-native.js", 162);
265 var esc = Y.Selector._parse('esc', selector), // pull escaped colon, brackets, etc. 
266             attrs,
267             pseudos;
269         // first replace escaped chars, which could be present in attrs or pseudos
270         _yuitest_coverline("build/selector-native/selector-native.js", 167);
271 selector = Y.Selector._replace('esc', selector);
273         // then replace pseudos before attrs to avoid replacing :not([foo])
274         _yuitest_coverline("build/selector-native/selector-native.js", 170);
275 pseudos = Y.Selector._parse('pseudo', selector);
276         _yuitest_coverline("build/selector-native/selector-native.js", 171);
277 selector = Selector._replace('pseudo', selector);
279         _yuitest_coverline("build/selector-native/selector-native.js", 173);
280 attrs = Y.Selector._parse('attr', selector);
281         _yuitest_coverline("build/selector-native/selector-native.js", 174);
282 selector = Y.Selector._replace('attr', selector);
284         _yuitest_coverline("build/selector-native/selector-native.js", 176);
285 return {
286             esc: esc,
287             attrs: attrs,
288             pseudos: pseudos,
289             selector: selector
290         };
291     },
293     _restoreSelector: function(replaced) {
294         _yuitest_coverfunc("build/selector-native/selector-native.js", "_restoreSelector", 184);
295 _yuitest_coverline("build/selector-native/selector-native.js", 185);
296 var selector = replaced.selector;
297         _yuitest_coverline("build/selector-native/selector-native.js", 186);
298 selector = Y.Selector._restore('attr', selector, replaced.attrs);
299         _yuitest_coverline("build/selector-native/selector-native.js", 187);
300 selector = Y.Selector._restore('pseudo', selector, replaced.pseudos);
301         _yuitest_coverline("build/selector-native/selector-native.js", 188);
302 selector = Y.Selector._restore('esc', selector, replaced.esc);
303         _yuitest_coverline("build/selector-native/selector-native.js", 189);
304 return selector;
305     },
307     _replaceCommas: function(selector) {
308         _yuitest_coverfunc("build/selector-native/selector-native.js", "_replaceCommas", 192);
309 _yuitest_coverline("build/selector-native/selector-native.js", 193);
310 var replaced = Y.Selector._replaceSelector(selector),
311             selector = replaced.selector;
313         _yuitest_coverline("build/selector-native/selector-native.js", 196);
314 if (selector) {
315             _yuitest_coverline("build/selector-native/selector-native.js", 197);
316 selector = selector.replace(/,/g, '\uE007');
317             _yuitest_coverline("build/selector-native/selector-native.js", 198);
318 replaced.selector = selector;
319             _yuitest_coverline("build/selector-native/selector-native.js", 199);
320 selector = Y.Selector._restoreSelector(replaced);
321         }
322         _yuitest_coverline("build/selector-native/selector-native.js", 201);
323 return selector;
324     },
326     // allows element scoped queries to begin with combinator
327     // e.g. query('> p', document.body) === query('body > p')
328     _splitQueries: function(selector, node) {
329         _yuitest_coverfunc("build/selector-native/selector-native.js", "_splitQueries", 206);
330 _yuitest_coverline("build/selector-native/selector-native.js", 207);
331 if (selector.indexOf(',') > -1) {
332             _yuitest_coverline("build/selector-native/selector-native.js", 208);
333 selector = Y.Selector._replaceCommas(selector);
334         }
336         _yuitest_coverline("build/selector-native/selector-native.js", 211);
337 var groups = selector.split('\uE007'), // split on replaced comma token
338             queries = [],
339             prefix = '',
340             id,
341             i,
342             len;
344         _yuitest_coverline("build/selector-native/selector-native.js", 218);
345 if (node) {
346             // enforce for element scoping
347             _yuitest_coverline("build/selector-native/selector-native.js", 220);
348 if (node.nodeType === 1) { // Elements only
349                 _yuitest_coverline("build/selector-native/selector-native.js", 221);
350 id = Y.Selector._escapeId(Y.DOM.getId(node));
352                 _yuitest_coverline("build/selector-native/selector-native.js", 223);
353 if (!id) {
354                     _yuitest_coverline("build/selector-native/selector-native.js", 224);
355 id = Y.guid();
356                     _yuitest_coverline("build/selector-native/selector-native.js", 225);
357 Y.DOM.setId(node, id);
358                 }
359             
360                 _yuitest_coverline("build/selector-native/selector-native.js", 228);
361 prefix = '[id="' + id + '"] ';
362             }
364             _yuitest_coverline("build/selector-native/selector-native.js", 231);
365 for (i = 0, len = groups.length; i < len; ++i) {
366                 _yuitest_coverline("build/selector-native/selector-native.js", 232);
367 selector =  prefix + groups[i];
368                 _yuitest_coverline("build/selector-native/selector-native.js", 233);
369 queries.push([selector, node]);
370             }
371         }
373         _yuitest_coverline("build/selector-native/selector-native.js", 237);
374 return queries;
375     },
377     _nativeQuery: function(selector, root, one) {
378         _yuitest_coverfunc("build/selector-native/selector-native.js", "_nativeQuery", 240);
379 _yuitest_coverline("build/selector-native/selector-native.js", 241);
380 if (Y.UA.webkit && selector.indexOf(':checked') > -1 &&
381                 (Y.Selector.pseudos && Y.Selector.pseudos.checked)) { // webkit (chrome, safari) fails to pick up "selected"  with "checked"
382             _yuitest_coverline("build/selector-native/selector-native.js", 243);
383 return Y.Selector.query(selector, root, one, true); // redo with skipNative true to try brute query
384         }
385         _yuitest_coverline("build/selector-native/selector-native.js", 245);
386 try {
387             _yuitest_coverline("build/selector-native/selector-native.js", 246);
388 return root['querySelector' + (one ? '' : 'All')](selector);
389         } catch(e) { // fallback to brute if available
390             _yuitest_coverline("build/selector-native/selector-native.js", 248);
391 return Y.Selector.query(selector, root, one, true); // redo with skipNative true
392         }
393     },
395     filter: function(nodes, selector) {
396         _yuitest_coverfunc("build/selector-native/selector-native.js", "filter", 252);
397 _yuitest_coverline("build/selector-native/selector-native.js", 253);
398 var ret = [],
399             i, node;
401         _yuitest_coverline("build/selector-native/selector-native.js", 256);
402 if (nodes && selector) {
403             _yuitest_coverline("build/selector-native/selector-native.js", 257);
404 for (i = 0; (node = nodes[i++]);) {
405                 _yuitest_coverline("build/selector-native/selector-native.js", 258);
406 if (Y.Selector.test(node, selector)) {
407                     _yuitest_coverline("build/selector-native/selector-native.js", 259);
408 ret[ret.length] = node;
409                 }
410             }
411         } else {
412         }
414         _yuitest_coverline("build/selector-native/selector-native.js", 265);
415 return ret;
416     },
418     test: function(node, selector, root) {
419         _yuitest_coverfunc("build/selector-native/selector-native.js", "test", 268);
420 _yuitest_coverline("build/selector-native/selector-native.js", 269);
421 var ret = false,
422             useFrag = false,
423             groups,
424             parent,
425             item,
426             items,
427             frag,
428             id,
429             i, j, group;
431         _yuitest_coverline("build/selector-native/selector-native.js", 279);
432 if (node && node.tagName) { // only test HTMLElements
434             _yuitest_coverline("build/selector-native/selector-native.js", 281);
435 if (typeof selector == 'function') { // test with function
436                 _yuitest_coverline("build/selector-native/selector-native.js", 282);
437 ret = selector.call(node, node);
438             } else { // test with query
439                 // we need a root if off-doc
440                 _yuitest_coverline("build/selector-native/selector-native.js", 285);
441 groups = selector.split(',');
442                 _yuitest_coverline("build/selector-native/selector-native.js", 286);
443 if (!root && !Y.DOM.inDoc(node)) {
444                     _yuitest_coverline("build/selector-native/selector-native.js", 287);
445 parent = node.parentNode;
446                     _yuitest_coverline("build/selector-native/selector-native.js", 288);
447 if (parent) { 
448                         _yuitest_coverline("build/selector-native/selector-native.js", 289);
449 root = parent;
450                     } else { // only use frag when no parent to query
451                         _yuitest_coverline("build/selector-native/selector-native.js", 291);
452 frag = node[OWNER_DOCUMENT].createDocumentFragment();
453                         _yuitest_coverline("build/selector-native/selector-native.js", 292);
454 frag.appendChild(node);
455                         _yuitest_coverline("build/selector-native/selector-native.js", 293);
456 root = frag;
457                         _yuitest_coverline("build/selector-native/selector-native.js", 294);
458 useFrag = true;
459                     }
460                 }
461                 _yuitest_coverline("build/selector-native/selector-native.js", 297);
462 root = root || node[OWNER_DOCUMENT];
464                 _yuitest_coverline("build/selector-native/selector-native.js", 299);
465 id = Y.Selector._escapeId(Y.DOM.getId(node));
466                 _yuitest_coverline("build/selector-native/selector-native.js", 300);
467 if (!id) {
468                     _yuitest_coverline("build/selector-native/selector-native.js", 301);
469 id = Y.guid();
470                     _yuitest_coverline("build/selector-native/selector-native.js", 302);
471 Y.DOM.setId(node, id);
472                 }
474                 _yuitest_coverline("build/selector-native/selector-native.js", 305);
475 for (i = 0; (group = groups[i++]);) { // TODO: off-dom test
476                     _yuitest_coverline("build/selector-native/selector-native.js", 306);
477 group += '[id="' + id + '"]';
478                     _yuitest_coverline("build/selector-native/selector-native.js", 307);
479 items = Y.Selector.query(group, root);
481                     _yuitest_coverline("build/selector-native/selector-native.js", 309);
482 for (j = 0; item = items[j++];) {
483                         _yuitest_coverline("build/selector-native/selector-native.js", 310);
484 if (item === node) {
485                             _yuitest_coverline("build/selector-native/selector-native.js", 311);
486 ret = true;
487                             _yuitest_coverline("build/selector-native/selector-native.js", 312);
488 break;
489                         }
490                     }
491                     _yuitest_coverline("build/selector-native/selector-native.js", 315);
492 if (ret) {
493                         _yuitest_coverline("build/selector-native/selector-native.js", 316);
494 break;
495                     }
496                 }
498                 _yuitest_coverline("build/selector-native/selector-native.js", 320);
499 if (useFrag) { // cleanup
500                     _yuitest_coverline("build/selector-native/selector-native.js", 321);
501 frag.removeChild(node);
502                 }
503             }_yuitest_coverline("build/selector-native/selector-native.js", 323);
505         }
507         _yuitest_coverline("build/selector-native/selector-native.js", 326);
508 return ret;
509     },
511     /**
512      * A convenience function to emulate Y.Node's aNode.ancestor(selector).
513      * @param {HTMLElement} element An HTMLElement to start the query from.
514      * @param {String} selector The CSS selector to test the node against.
515      * @return {HTMLElement} The ancestor node matching the selector, or null.
516      * @param {Boolean} testSelf optional Whether or not to include the element in the scan 
517      * @static
518      * @method ancestor
519      */
520     ancestor: function (element, selector, testSelf) {
521         _yuitest_coverfunc("build/selector-native/selector-native.js", "ancestor", 338);
522 _yuitest_coverline("build/selector-native/selector-native.js", 339);
523 return Y.DOM.ancestor(element, function(n) {
524             _yuitest_coverfunc("build/selector-native/selector-native.js", "(anonymous 5)", 339);
525 _yuitest_coverline("build/selector-native/selector-native.js", 340);
526 return Y.Selector.test(n, selector);
527         }, testSelf);
528     },
530     _parse: function(name, selector) {
531         _yuitest_coverfunc("build/selector-native/selector-native.js", "_parse", 344);
532 _yuitest_coverline("build/selector-native/selector-native.js", 345);
533 return selector.match(Y.Selector._types[name].re);
534     },
536     _replace: function(name, selector) {
537         _yuitest_coverfunc("build/selector-native/selector-native.js", "_replace", 348);
538 _yuitest_coverline("build/selector-native/selector-native.js", 349);
539 var o = Y.Selector._types[name];
540         _yuitest_coverline("build/selector-native/selector-native.js", 350);
541 return selector.replace(o.re, o.token);
542     },
544     _restore: function(name, selector, items) {
545         _yuitest_coverfunc("build/selector-native/selector-native.js", "_restore", 353);
546 _yuitest_coverline("build/selector-native/selector-native.js", 354);
547 if (items) {
548             _yuitest_coverline("build/selector-native/selector-native.js", 355);
549 var token = Y.Selector._types[name].token,
550                 i, len;
551             _yuitest_coverline("build/selector-native/selector-native.js", 357);
552 for (i = 0, len = items.length; i < len; ++i) {
553                 _yuitest_coverline("build/selector-native/selector-native.js", 358);
554 selector = selector.replace(token, items[i]);
555             }
556         }
557         _yuitest_coverline("build/selector-native/selector-native.js", 361);
558 return selector;
559     }
562 _yuitest_coverline("build/selector-native/selector-native.js", 365);
563 Y.mix(Y.Selector, Selector, true);
565 })(Y);
568 }, '3.7.1', {"requires": ["dom-base"]});