ref: a5214c3c2a9396417edd4658e1344126da856ba9
dir: /domino-lib/NodeTraversal.js/
"use strict"; /* exported NodeTraversal */ var NodeTraversal = module.exports = { nextSkippingChildren: nextSkippingChildren, nextAncestorSibling: nextAncestorSibling, next: next, previous: previous, deepLastChild: deepLastChild }; /** * @based on WebKit's NodeTraversal::nextSkippingChildren * https://trac.webkit.org/browser/trunk/Source/WebCore/dom/NodeTraversal.h?rev=179143#L109 */ function nextSkippingChildren(node, stayWithin) { if (node === stayWithin) { return null; } if (node.nextSibling !== null) { return node.nextSibling; } return nextAncestorSibling(node, stayWithin); } /** * @based on WebKit's NodeTraversal::nextAncestorSibling * https://trac.webkit.org/browser/trunk/Source/WebCore/dom/NodeTraversal.cpp?rev=179143#L93 */ function nextAncestorSibling(node, stayWithin) { for (node = node.parentNode; node !== null; node = node.parentNode) { if (node === stayWithin) { return null; } if (node.nextSibling !== null) { return node.nextSibling; } } return null; } /** * @based on WebKit's NodeTraversal::next * https://trac.webkit.org/browser/trunk/Source/WebCore/dom/NodeTraversal.h?rev=179143#L99 */ function next(node, stayWithin) { var n; n = node.firstChild; if (n !== null) { return n; } if (node === stayWithin) { return null; } n = node.nextSibling; if (n !== null) { return n; } return nextAncestorSibling(node, stayWithin); } /** * @based on WebKit's NodeTraversal::deepLastChild * https://trac.webkit.org/browser/trunk/Source/WebCore/dom/NodeTraversal.cpp?rev=179143#L116 */ function deepLastChild(node) { while (node.lastChild) { node = node.lastChild; } return node; } /** * @based on WebKit's NodeTraversal::previous * https://trac.webkit.org/browser/trunk/Source/WebCore/dom/NodeTraversal.h?rev=179143#L121 */ function previous(node, stayWithin) { var p; p = node.previousSibling; if (p !== null) { return deepLastChild(p); } p = node.parentNode; if (p === stayWithin) { return null; } return p; }