{"ScriptPreparationCode":"window.symbol = Symbol(\u0027symbol\u0027);\r\nwindow.traversalRoot = document.getElementById(\u0027traversal-root\u0027);\r\nfor (const el of traversalRoot.getElementsByTagName(\u0027section\u0027)) {\r\n\tObject.defineProperty(el, window.symbol, { value: {} });\r\n}\r\n\r\nwindow.isMatch = function isMatch(element) {\r\n\treturn element[symbol] !== undefined;\r\n}\r\n\r\nwindow.traverse = function traverse(element, callback) {\r\n\tif (isMatch(element)) {\r\n\t\tcallback(element);\r\n\t} else {\r\n\t\tfor (const child of element.children) {\r\n\t\t\ttraverse(child, callback);\r\n\t\t}\r\n\t}\r\n};\r\n\r\nwindow.traverseNodeIterator = function traverseNodeIterator(initialElement, callback) {\r\n\tconst nodeIterator = document.createNodeIterator(\r\n\t initialElement,\r\n\t NodeFilter.SHOW_ELEMENT,\r\n\t\t(element) =\u003E {\r\n\t\t\tif (isMatch(element)) {\r\n\t\t\t\tcallback(element);\r\n\t\t\t\treturn NodeFilter.FILTER_REJECT;\r\n\t\t\t}\r\n\t\t\treturn NodeFilter.FILTER_ACCEPT;\r\n\t\t}\r\n\t);\r\n\r\n\twhile (nodeIterator.nextNode()) {}\r\n};\r\n\r\nwindow.traverseTreeWalker = function traverseTreeWalker(initialElement, callback) {\r\n\tconst nodeIterator = document.createTreeWalker(\r\n\t initialElement,\r\n\t NodeFilter.SHOW_ELEMENT,\r\n\t\t(element) =\u003E {\r\n\t\t\tif (isMatch(element)) {\r\n\t\t\t\tcallback(element);\r\n\t\t\t\treturn NodeFilter.FILTER_REJECT;\r\n\t\t\t}\r\n\t\t\treturn NodeFilter.FILTER_ACCEPT;\r\n\t\t}\r\n\t);\r\n\r\n\twhile (nodeIterator.nextNode()) {}\r\n};\r\n","TestCases":[{"Name":"Manual traversal function","Code":"const results = [];\r\ntraverse(traversalRoot, function callback(element) {\r\n\tfor (const child of element.children) {\r\n\t\ttraverse(child, callback);\r\n\t}\r\n\tresults.push(element);\r\n})","IsDeferred":false},{"Name":"NodeIterator","Code":"const results = [];\r\ntraverseNodeIterator(traversalRoot, function callback(element) {\r\n\tfor (const child of element.children) {\r\n\t\ttraverseNodeIterator(child, callback);\r\n\t}\r\n\tresults.push(element);\r\n})","IsDeferred":false},{"Name":"TreeWalker","Code":"const results = [];\r\ntraverseTreeWalker(traversalRoot, function callback(element) {\r\n\tfor (const child of element.children) {\r\n\t\ttraverseTreeWalker(child, callback);\r\n\t}\r\n\tresults.push(element);\r\n})","IsDeferred":false}]}