| <!DOCTYPE html> |
| <html> |
| <!-- |
| Test adapted from https://mxr.mozilla.org/chromium/source/src/third_party/WebKit/LayoutTests/fast/dom/TreeWalker/script-tests/acceptNode-filter.js |
| --> |
| <head> |
| <title>TreeWalker: acceptNode-filter</title> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script src="traversal-support.js"></script> |
| <link rel="stylesheet" href="/resources/testharness.css"> |
| <div id=log></div> |
| </head> |
| <body> |
| <p>Test JS objects as NodeFilters</p> |
| <script> |
| var testElement; |
| setup(function() { |
| testElement = document.createElement("div"); |
| testElement.id = 'root'; |
| //testElement.innerHTML='<div id="A1"><div id="B1"></div><div id="B2"></div></div>'; |
| |
| // XXX for Servo, build the tree without using innerHTML |
| var a1 = document.createElement("div"); |
| a1.id = "A1"; |
| var b1 = document.createElement("div"); |
| b1.id = "B1"; |
| var b2 = document.createElement("div"); |
| b2.id = "B2"; |
| testElement.appendChild(a1); |
| a1.appendChild(b1); |
| a1.appendChild(b2); |
| }); |
| |
| test(function() |
| { |
| function filter(node) |
| { |
| if (node.id == "B1") |
| return NodeFilter.FILTER_SKIP; |
| return NodeFilter.FILTER_ACCEPT; |
| } |
| |
| var walker = document.createTreeWalker(testElement, NodeFilter.SHOW_ELEMENT, filter); |
| assert_node(walker.currentNode, { type: Element, id: 'root' }); |
| assert_node(walker.firstChild(), { type: Element, id: 'A1' }); |
| assert_node(walker.currentNode, { type: Element, id: 'A1' }); |
| assert_node(walker.nextNode(), { type: Element, id: 'B2' }); |
| assert_node(walker.currentNode, { type: Element, id: 'B2' }); |
| }, 'Testing with raw function filter'); |
| |
| test(function() |
| { |
| var walker = document.createTreeWalker(testElement, NodeFilter.SHOW_ELEMENT, { |
| acceptNode : function(node) { |
| if (node.id == "B1") |
| return NodeFilter.FILTER_SKIP; |
| return NodeFilter.FILTER_ACCEPT; |
| } |
| }); |
| assert_node(walker.currentNode, { type: Element, id: 'root' }); |
| assert_node(walker.firstChild(), { type: Element, id: 'A1' }); |
| assert_node(walker.currentNode, { type: Element, id: 'A1' }); |
| assert_node(walker.nextNode(), { type: Element, id: 'B2' }); |
| assert_node(walker.currentNode, { type: Element, id: 'B2' }); |
| }, 'Testing with object filter'); |
| |
| test(function() |
| { |
| var walker = document.createTreeWalker(testElement, NodeFilter.SHOW_ELEMENT, null); |
| assert_node(walker.currentNode, { type: Element, id: 'root' }); |
| assert_node(walker.firstChild(), { type: Element, id: 'A1' }); |
| assert_node(walker.currentNode, { type: Element, id: 'A1' }); |
| assert_node(walker.nextNode(), { type: Element, id: 'B1' }); |
| assert_node(walker.currentNode, { type: Element, id: 'B1' }); |
| }, 'Testing with null filter'); |
| |
| test(function() |
| { |
| var walker = document.createTreeWalker(testElement, NodeFilter.SHOW_ELEMENT, undefined); |
| assert_node(walker.currentNode, { type: Element, id: 'root' }); |
| assert_node(walker.firstChild(), { type: Element, id: 'A1' }); |
| assert_node(walker.currentNode, { type: Element, id: 'A1' }); |
| assert_node(walker.nextNode(), { type: Element, id: 'B1' }); |
| assert_node(walker.currentNode, { type: Element, id: 'B1' }); |
| }, 'Testing with undefined filter'); |
| |
| test(function() |
| { |
| var walker = document.createTreeWalker(testElement, NodeFilter.SHOW_ELEMENT, {}); |
| assert_throws(new TypeError(), function () { walker.firstChild(); }); |
| assert_node(walker.currentNode, { type: Element, id: 'root' }); |
| assert_throws(new TypeError(), function () { walker.nextNode(); }); |
| assert_node(walker.currentNode, { type: Element, id: 'root' }); |
| }, 'Testing with object lacking acceptNode property'); |
| |
| test(function() |
| { |
| var walker = document.createTreeWalker(testElement, NodeFilter.SHOW_ELEMENT, { acceptNode: "foo" }); |
| assert_throws(new TypeError(), function () { walker.firstChild(); }); |
| assert_node(walker.currentNode, { type: Element, id: 'root' }); |
| assert_throws(new TypeError(), function () { walker.nextNode(); }); |
| assert_node(walker.currentNode, { type: Element, id: 'root' }); |
| }, 'Testing with object with non-function acceptNode property'); |
| |
| test(function() |
| { |
| var filter = function() { return NodeFilter.FILTER_ACCEPT; }; |
| filter.acceptNode = function(node) { return NodeFilter.FILTER_SKIP; }; |
| var walker = document.createTreeWalker(testElement, NodeFilter.SHOW_ELEMENT, filter); |
| assert_node(walker.firstChild(), { type: Element, id: 'A1' }); |
| assert_node(walker.nextNode(), { type: Element, id: 'B1' }); |
| }, 'Testing with function having acceptNode function'); |
| |
| test(function() |
| { |
| var filter = { |
| acceptNode: function(node) { |
| return NodeFilter.FILTER_ACCEPT; |
| } |
| }; |
| var walker = document.createTreeWalker(testElement, NodeFilter.SHOW_ELEMENT, filter); |
| assert_node(walker.firstChild(), { type: Element, id: 'A1' }); |
| }, 'Testing acceptNode callee'); |
| |
| test(function() |
| { |
| var test_error = { name: "test" }; |
| var walker = document.createTreeWalker(testElement, NodeFilter.SHOW_ELEMENT, |
| function(node) { |
| throw test_error; |
| }); |
| assert_throws(test_error, function () { walker.firstChild(); }); |
| assert_node(walker.currentNode, { type: Element, id: 'root' }); |
| assert_throws(test_error, function () { walker.nextNode(); }); |
| assert_node(walker.currentNode, { type: Element, id: 'root' }); |
| }, 'Testing with filter function that throws'); |
| |
| test(function() |
| { |
| var test_error = { name: "test" }; |
| var walker = document.createTreeWalker(testElement, NodeFilter.SHOW_ELEMENT, |
| { |
| acceptNode : function(node) { |
| throw test_error; |
| } |
| }); |
| assert_throws(test_error, function () { walker.firstChild(); }); |
| assert_node(walker.currentNode, { type: Element, id: 'root' }); |
| assert_throws(test_error, function () { walker.nextNode(); }); |
| assert_node(walker.currentNode, { type: Element, id: 'root' }); |
| }, 'Testing with filter object that throws'); |
| |
| </script> |
| </body> |
| </html> |