1446f40f68dd25f13b97bdce2a425cd9f36104d1
[WebKit-https.git] / LayoutTests / imported / w3c / web-platform-tests / dom / traversal / TreeWalker-acceptNode-filter.html
1 <!DOCTYPE html>
2 <html>
3 <!--
4 Test adapted from https://dxr.mozilla.org/chromium/source/src/third_party/WebKit/LayoutTests/fast/dom/TreeWalker/script-tests/acceptNode-filter.js
5 -->
6 <head>
7 <title>TreeWalker: acceptNode-filter</title>
8 <script src="/resources/testharness.js"></script>
9 <script src="/resources/testharnessreport.js"></script>
10 <script src="traversal-support.js"></script>
11 <div id=log></div>
12 </head>
13 <body>
14 <p>Test JS objects as NodeFilters</p>
15 <script>
16 var testElement;
17 setup(function() {
18     testElement = document.createElement("div");
19     testElement.id = 'root';
20     //testElement.innerHTML='<div id="A1"><div id="B1"></div><div id="B2"></div></div>';
21
22     // XXX for Servo, build the tree without using innerHTML
23     var a1 = document.createElement("div");
24     a1.id = "A1";
25     var b1 = document.createElement("div");
26     b1.id = "B1";
27     var b2 = document.createElement("div");
28     b2.id = "B2";
29     testElement.appendChild(a1);
30     a1.appendChild(b1);
31     a1.appendChild(b2);
32 });
33
34 test(function()
35 {
36     function filter(node)
37     {
38         if (node.id == "B1")
39             return NodeFilter.FILTER_SKIP;
40         return NodeFilter.FILTER_ACCEPT;
41     }
42
43     var walker = document.createTreeWalker(testElement, NodeFilter.SHOW_ELEMENT, filter);
44     assert_node(walker.currentNode, { type: Element, id: 'root' });
45     assert_node(walker.firstChild(), { type: Element, id: 'A1' });
46     assert_node(walker.currentNode, { type: Element, id: 'A1' });
47     assert_node(walker.nextNode(), { type: Element, id: 'B2' });
48     assert_node(walker.currentNode, { type: Element, id: 'B2' });
49 }, 'Testing with raw function filter');
50
51 test(function()
52 {
53     var walker = document.createTreeWalker(testElement, NodeFilter.SHOW_ELEMENT, {
54         acceptNode : function(node) {
55             if (node.id == "B1")
56                 return NodeFilter.FILTER_SKIP;
57             return NodeFilter.FILTER_ACCEPT;
58         }
59     });
60     assert_node(walker.currentNode, { type: Element, id: 'root' });
61     assert_node(walker.firstChild(), { type: Element, id: 'A1' });
62     assert_node(walker.currentNode, { type: Element, id: 'A1' });
63     assert_node(walker.nextNode(), { type: Element, id: 'B2' });
64     assert_node(walker.currentNode, { type: Element, id: 'B2' });
65 }, 'Testing with object filter');
66
67 test(function()
68 {
69     var walker = document.createTreeWalker(testElement, NodeFilter.SHOW_ELEMENT, null);
70     assert_node(walker.currentNode, { type: Element, id: 'root' });
71     assert_node(walker.firstChild(), { type: Element, id: 'A1' });
72     assert_node(walker.currentNode, { type: Element, id: 'A1' });
73     assert_node(walker.nextNode(), { type: Element, id: 'B1' });
74     assert_node(walker.currentNode, { type: Element, id: 'B1' });
75 }, 'Testing with null filter');
76
77 test(function()
78 {
79     var walker = document.createTreeWalker(testElement, NodeFilter.SHOW_ELEMENT, undefined);
80     assert_node(walker.currentNode, { type: Element, id: 'root' });
81     assert_node(walker.firstChild(), { type: Element, id: 'A1' });
82     assert_node(walker.currentNode, { type: Element, id: 'A1' });
83     assert_node(walker.nextNode(), { type: Element, id: 'B1' });
84     assert_node(walker.currentNode, { type: Element, id: 'B1' });
85 }, 'Testing with undefined filter');
86
87 test(function()
88 {
89     var walker = document.createTreeWalker(testElement, NodeFilter.SHOW_ELEMENT, {});
90     assert_throws(new TypeError(), function () { walker.firstChild(); });
91     assert_node(walker.currentNode, { type: Element, id: 'root' });
92     assert_throws(new TypeError(), function () { walker.nextNode(); });
93     assert_node(walker.currentNode, { type: Element, id: 'root' });
94 }, 'Testing with object lacking acceptNode property');
95
96 test(function()
97 {
98     var walker = document.createTreeWalker(testElement, NodeFilter.SHOW_ELEMENT, { acceptNode: "foo" });
99     assert_throws(new TypeError(), function () { walker.firstChild(); });
100     assert_node(walker.currentNode, { type: Element, id: 'root' });
101     assert_throws(new TypeError(), function () { walker.nextNode(); });
102     assert_node(walker.currentNode, { type: Element, id: 'root' });
103 }, 'Testing with object with non-function acceptNode property');
104
105 test(function()
106 {
107     var filter = function() { return NodeFilter.FILTER_ACCEPT; };
108     filter.acceptNode = function(node) { return NodeFilter.FILTER_SKIP; };
109     var walker = document.createTreeWalker(testElement, NodeFilter.SHOW_ELEMENT, filter);
110     assert_node(walker.firstChild(), { type: Element, id: 'A1' });
111     assert_node(walker.nextNode(), { type: Element, id: 'B1' });
112 }, 'Testing with function having acceptNode function');
113
114 test(function()
115 {
116     var filter = {
117         acceptNode: function(node) {
118             return NodeFilter.FILTER_ACCEPT;
119         }
120     };
121     var walker = document.createTreeWalker(testElement, NodeFilter.SHOW_ELEMENT, filter);
122     assert_node(walker.firstChild(), { type: Element, id: 'A1' });
123 }, 'Testing acceptNode callee');
124
125 test(function()
126 {
127     var test_error = { name: "test" };
128     var walker = document.createTreeWalker(testElement, NodeFilter.SHOW_ELEMENT,
129                                            function(node) {
130                                                throw test_error;
131                                            });
132     assert_throws(test_error, function () { walker.firstChild(); });
133     assert_node(walker.currentNode, { type: Element, id: 'root' });
134     assert_throws(test_error, function () { walker.nextNode(); });
135     assert_node(walker.currentNode, { type: Element, id: 'root' });
136 }, 'Testing with filter function that throws');
137
138 test(function()
139 {
140     var test_error = { name: "test" };
141     var walker = document.createTreeWalker(testElement, NodeFilter.SHOW_ELEMENT,
142                                            {
143                                                acceptNode : function(node) {
144                                                    throw test_error;
145                                                }
146                                            });
147     assert_throws(test_error, function () { walker.firstChild(); });
148     assert_node(walker.currentNode, { type: Element, id: 'root' });
149     assert_throws(test_error, function () { walker.nextNode(); });
150     assert_node(walker.currentNode, { type: Element, id: 'root' });
151 }, 'Testing with filter object that throws');
152
153 </script>
154 </body>
155 </html>