3 Copyright 2012 Yahoo! Inc. All rights reserved.
4 Licensed under the BSD License.
5 http://yuilibrary.com/license/
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++;
14 coverage.lines[line]++;
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++;
22 coverage.functions[funcId]++;
25 _yuitest_coverage["build/selector-native/selector-native.js"] = {
32 path: "build/selector-native/selector-native.js",
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);
47 * The selector-native module provides support for native querySelector
49 * @submodule selector-native
54 * Provides support for using CSS selectors to query the DOM
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);
73 re: /\\[:\[\]\(\)#\.\'\>+~"]/gi
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);
93 _yuitest_coverline("build/selector-native/selector-native.js", 45);
94 id = id.replace(/([:\[\]\(\)#\.'<>+~"])/g,'\\$1');
96 _yuitest_coverline("build/selector-native/selector-native.js", 47);
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);
109 _yuitest_coverline("build/selector-native/selector-native.js", 56);
111 } else {_yuitest_coverline("build/selector-native/selector-native.js", 57);
113 _yuitest_coverline("build/selector-native/selector-native.js", 58);
117 _yuitest_coverline("build/selector-native/selector-native.js", 61);
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);
128 _yuitest_coverline("build/selector-native/selector-native.js", 68);
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
150 _yuitest_coverline("build/selector-native/selector-native.js", 81);
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);
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);
163 _yuitest_coverline("build/selector-native/selector-native.js", 89);
164 nodes.sort(Selector._compare);
168 _yuitest_coverline("build/selector-native/selector-native.js", 93);
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);
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);
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);
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);
193 _yuitest_coverline("build/selector-native/selector-native.js", 109);
194 node.removeAttribute('_found');
197 _yuitest_coverline("build/selector-native/selector-native.js", 112);
202 * Retrieves a set of nodes based on a given CSS selector.
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.
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);
217 useNative = (Y.Selector.useNative && Y.config.doc.querySelector && !skipNative),
218 queries = [[selector, root]],
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);
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);
243 _yuitest_coverline("build/selector-native/selector-native.js", 147);
245 _yuitest_coverline("build/selector-native/selector-native.js", 148);
246 ret = ret.concat(result);
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));
257 _yuitest_coverline("build/selector-native/selector-native.js", 157);
258 return (firstOnly) ? (ret[0] || null) : ret;
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.
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);
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);
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);
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);
322 _yuitest_coverline("build/selector-native/selector-native.js", 201);
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);
336 _yuitest_coverline("build/selector-native/selector-native.js", 211);
337 var groups = selector.split('\uE007'), // split on replaced comma token
344 _yuitest_coverline("build/selector-native/selector-native.js", 218);
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);
354 _yuitest_coverline("build/selector-native/selector-native.js", 224);
356 _yuitest_coverline("build/selector-native/selector-native.js", 225);
357 Y.DOM.setId(node, id);
360 _yuitest_coverline("build/selector-native/selector-native.js", 228);
361 prefix = '[id="' + id + '"] ';
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]);
373 _yuitest_coverline("build/selector-native/selector-native.js", 237);
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
385 _yuitest_coverline("build/selector-native/selector-native.js", 245);
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
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);
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;
414 _yuitest_coverline("build/selector-native/selector-native.js", 265);
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);
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);
448 _yuitest_coverline("build/selector-native/selector-native.js", 289);
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);
457 _yuitest_coverline("build/selector-native/selector-native.js", 294);
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);
468 _yuitest_coverline("build/selector-native/selector-native.js", 301);
470 _yuitest_coverline("build/selector-native/selector-native.js", 302);
471 Y.DOM.setId(node, id);
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);
485 _yuitest_coverline("build/selector-native/selector-native.js", 311);
487 _yuitest_coverline("build/selector-native/selector-native.js", 312);
491 _yuitest_coverline("build/selector-native/selector-native.js", 315);
493 _yuitest_coverline("build/selector-native/selector-native.js", 316);
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);
503 }_yuitest_coverline("build/selector-native/selector-native.js", 323);
507 _yuitest_coverline("build/selector-native/selector-native.js", 326);
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
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);
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);
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);
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);
548 _yuitest_coverline("build/selector-native/selector-native.js", 355);
549 var token = Y.Selector._types[name].token,
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]);
557 _yuitest_coverline("build/selector-native/selector-native.js", 361);
562 _yuitest_coverline("build/selector-native/selector-native.js", 365);
563 Y.mix(Y.Selector, Selector, true);
568 }, '3.7.1', {"requires": ["dom-base"]});