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-css2/selector-css2.js"] = {
32 path: "build/selector-css2/selector-css2.js",
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) {
44 * The selector module provides helper methods allowing CSS2 Selectors to be used with DOM elements.
46 * @submodule selector-css2
51 * Provides helper methods for collecting and filtering DOM elements.
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',
58 ATTRIBUTES = 'attributes',
59 COMBINATOR = 'combinator',
62 Selector = Y.Selector,
65 _reRegExpTokens: /([\^\$\?\[\]\*\+\-\.\(\)\|\\])/,
68 // TODO: better detection, document specific
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);
78 * Mapping of shorthand tokens to corresponding attribute selector
83 '\\#(-?[_a-z0-9]+[-\\w\\uE000]*)': '[id=$1]',
84 '\\.(-?[_a-z]+[-\\w\\uE000]*)': '[className~=$1]'
88 * List of operators and corresponding boolean functions.
89 * These functions are passed the attribute and the current node's value of the attribute.
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
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;
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);
114 tokens = Selector._tokenize(selector),
115 token = tokens[tokens.length - 1],
116 rootDoc = Y.DOM._getDoc(root),
122 _yuitest_coverline("build/selector-css2/selector-css2.js", 71);
125 _yuitest_coverline("build/selector-css2/selector-css2.js", 73);
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);
141 } else {_yuitest_coverline("build/selector-css2/selector-css2.js", 83);
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);
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);
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);
162 _yuitest_coverline("build/selector-css2/selector-css2.js", 97);
163 child = child.nextSibling || child.firstChild;
166 _yuitest_coverline("build/selector-css2/selector-css2.js", 100);
168 _yuitest_coverline("build/selector-css2/selector-css2.js", 101);
169 ret = Selector._filterNodes(nodes, tokens, firstOnly);
173 _yuitest_coverline("build/selector-css2/selector-css2.js", 105);
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);
187 getters = Y.Selector.getters,
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);
201 _yuitest_coverline("build/selector-css2/selector-css2.js", 128);
204 _yuitest_coverline("build/selector-css2/selector-css2.js", 130);
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);
210 _yuitest_coverline("build/selector-css2/selector-css2.js", 133);
212 _yuitest_coverline("build/selector-css2/selector-css2.js", 134);
214 _yuitest_coverline("build/selector-css2/selector-css2.js", 135);
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);
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]);
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();
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
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);
257 (token.tagName && token.tagName !== tmpNode.tagName))
259 _yuitest_coverline("build/selector-css2/selector-css2.js", 165);
260 tmpNode = tmpNode[path];
263 _yuitest_coverline("build/selector-css2/selector-css2.js", 168);
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];
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);
292 } else { // success if we made it this far
293 _yuitest_coverline("build/selector-css2/selector-css2.js", 189);
295 _yuitest_coverline("build/selector-css2/selector-css2.js", 190);
297 _yuitest_coverline("build/selector-css2/selector-css2.js", 191);
300 _yuitest_coverline("build/selector-css2/selector-css2.js", 193);
305 _yuitest_coverline("build/selector-css2/selector-css2.js", 197);
306 node = tmpNode = null;
307 _yuitest_coverline("build/selector-css2/selector-css2.js", 198);
323 axis: 'previousSibling',
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, '') : '',
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);
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;
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]));
371 _yuitest_coverline("build/selector-css2/selector-css2.js", 250);
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);
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);
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();
395 _yuitest_coverline("build/selector-css2/selector-css2.js", 267);
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];
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';
412 re: /^\s*([>+~]|\s)\s*/,
413 fn: function(match, token) {
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);
427 _yuitest_coverline("build/selector-css2/selector-css2.js", 290);
428 match[2] = match[2].replace(/\\/g, '');
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);
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);
454 Break selector into token units per simple selector.
455 Combinator is attached to the previous token.
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
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.
478 'form:first-child[type=button]:not(button)[lang|=en]'
480 _yuitest_coverline("build/selector-css2/selector-css2.js", 334);
482 _yuitest_coverline("build/selector-css2/selector-css2.js", 335);
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;
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);
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]];
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);
515 _yuitest_coverline("build/selector-css2/selector-css2.js", 354);
517 } else {_yuitest_coverline("build/selector-css2/selector-css2.js", 355);
519 _yuitest_coverline("build/selector-css2/selector-css2.js", 356);
520 token.tests.push(test);
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);
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]];
535 _yuitest_coverline("build/selector-css2/selector-css2.js", 366);
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);
546 _yuitest_coverline("build/selector-css2/selector-css2.js", 374);
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);
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,
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]);
580 _yuitest_coverline("build/selector-css2/selector-css2.js", 396);
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);
612 'class': 'className',
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);
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);
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"]});