react / wstein / node_modules / jest-cli / node_modules / jsdom / node_modules / nwmatcher / src / modules / nwmatcher-traversal.js
81144 views/*1* Element Traversal methods from Juriy Zaytsev (kangax)2* used to emulate Prototype up/down/previous/next methods3*/45(function(D){67// TODO: all of this needs tests8var match = D.match, select = D.select, root = document.documentElement,910// Use the Element Traversal API if available.11nextElement = 'nextElementSibling',12previousElement = 'previousElementSibling',13parentElement = 'parentElement';1415// Fall back to the DOM Level 1 API.16if (!(nextElement in root)) nextElement = 'nextSibling';17if (!(previousElement in root)) previousElement = 'previousSibling';18if (!(parentElement in root)) parentElement = 'parentNode';1920function walkElements(property, element, expr) {21var i = 0, isIndex = typeof expr == 'number';22if (typeof expr == 'undefined') {23isIndex = true;24expr = 0;25}26while ((element = element[property])) {27if (element.nodeType != 1) continue;28if (isIndex) {29++i;30if (i == expr) return element;31} else if (match(element, expr)) {32return element;33}34}35return null;36}3738/**39* @method up40* @param {HTMLElement} element element to walk from41* @param {String | Number} expr CSS expression or an index42* @return {HTMLElement | null}43*/44function up(element, expr) {45return walkElements(parentElement, element, expr);46}47/**48* @method next49* @param {HTMLElement} element element to walk from50* @param {String | Number} expr CSS expression or an index51* @return {HTMLElement | null}52*/53function next(element, expr) {54return walkElements(nextElement, element, expr);55}56/**57* @method previous58* @param {HTMLElement} element element to walk from59* @param {String | Number} expr CSS expression or an index60* @return {HTMLElement | null}61*/62function previous(element, expr) {63return walkElements(previousElement, element, expr);64}65/**66* @method down67* @param {HTMLElement} element element to walk from68* @param {String | Number} expr CSS expression or an index69* @return {HTMLElement | null}70*/71function down(element, expr) {72var isIndex = typeof expr == 'number', descendants, index, descendant;73if (expr === null) {74element = element.firstChild;75while (element && element.nodeType != 1) element = element[nextElement];76return element;77}78if (!isIndex && match(element, expr) || isIndex && expr === 0) return element;79descendants = select('*', element);80if (isIndex) return descendants[expr] || null;81index = 0;82while ((descendant = descendants[index]) && !match(descendant, expr)) { ++index; }83return descendant || null;84}85D.up = up;86D.down = down;87D.next = next;88D.previous = previous;89})(NW.Dom);909192