| ; | |
| /* 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; | |
| } | |