Skip to content

Commit 93ea4ed

Browse files
committed
fix callback crash with Node.Union
1 parent 26fada3 commit 93ea4ed

File tree

3 files changed

+43
-38
lines changed

3 files changed

+43
-38
lines changed

src/browser/dom/node_filter.zig

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
const std = @import("std");
2020
const parser = @import("../netsurf.zig");
2121
const Env = @import("../env.zig").Env;
22+
const Node = @import("node.zig").Node;
2223

2324
pub const NodeFilter = struct {
2425
pub const _FILTER_ACCEPT: u16 = 1;
@@ -63,7 +64,7 @@ pub fn verify(what_to_show: u32, filter: ?Env.Function, node: *parser.Node) !Ver
6364

6465
// Verify that we aren't filtering it out.
6566
if (filter) |f| {
66-
const acceptance = try f.call(u16, .{node});
67+
const acceptance = try f.call(u16, .{try Node.toInterface(node)});
6768
return switch (acceptance) {
6869
NodeFilter._FILTER_ACCEPT => .accept,
6970
NodeFilter._FILTER_REJECT => .reject,

src/browser/dom/node_iterator.zig

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,11 @@ const std = @import("std");
2020
const parser = @import("../netsurf.zig");
2121
const Env = @import("../env.zig").Env;
2222
const NodeFilter = @import("node_filter.zig");
23+
const Node = @import("node.zig").Node;
24+
const NodeUnion = @import("node.zig").Union;
2325

2426
// https://developer.mozilla.org/en-US/docs/Web/API/NodeIterator
25-
// While this is similar to TreeWalker it has it's own implementation as there are several suttle differences
27+
// While this is similar to TreeWalker it has its own implementation as there are several subtle differences
2628
// For example:
2729
// - nextNode returns the reference node, whereas TreeWalker returns the next node
2830
// - Skip and reject are equivalent for NodeIterator, for TreeWalker they are different
@@ -66,36 +68,36 @@ pub const NodeIterator = struct {
6668
return self.pointer_before_current;
6769
}
6870

69-
pub fn get_referenceNode(self: *const NodeIterator) *parser.Node {
70-
return self.reference_node;
71+
pub fn get_referenceNode(self: *const NodeIterator) !NodeUnion {
72+
return try Node.toInterface(self.reference_node);
7173
}
7274

73-
pub fn get_root(self: *const NodeIterator) *parser.Node {
74-
return self.root;
75+
pub fn get_root(self: *const NodeIterator) !NodeUnion {
76+
return try Node.toInterface(self.root);
7577
}
7678

7779
pub fn get_whatToShow(self: *const NodeIterator) u32 {
7880
return self.what_to_show;
7981
}
8082

81-
pub fn _nextNode(self: *NodeIterator) !?*parser.Node {
83+
pub fn _nextNode(self: *NodeIterator) !?NodeUnion {
8284
if (self.pointer_before_current) { // Unlike TreeWalker, NodeIterator starts at the first node
8385
self.pointer_before_current = false;
8486
if (.accept == try NodeFilter.verify(self.what_to_show, self.filter_func, self.reference_node)) {
85-
return self.reference_node;
87+
return try Node.toInterface(self.reference_node);
8688
}
8789
}
8890

8991
if (try self.firstChild(self.reference_node)) |child| {
9092
self.reference_node = child;
91-
return child;
93+
return try Node.toInterface(child);
9294
}
9395

9496
var current = self.reference_node;
9597
while (current != self.root) {
9698
if (try self.nextSibling(current)) |sibling| {
9799
self.reference_node = sibling;
98-
return sibling;
100+
return try Node.toInterface(sibling);
99101
}
100102

101103
current = (try parser.nodeParentNode(current)) orelse break;
@@ -104,11 +106,11 @@ pub const NodeIterator = struct {
104106
return null;
105107
}
106108

107-
pub fn _previousNode(self: *NodeIterator) !?*parser.Node {
109+
pub fn _previousNode(self: *NodeIterator) !?NodeUnion {
108110
if (!self.pointer_before_current) {
109111
self.pointer_before_current = true;
110112
if (.accept == try NodeFilter.verify(self.what_to_show, self.filter_func, self.reference_node)) {
111-
return self.reference_node; // Still need to verify as last may be first as well
113+
return try Node.toInterface(self.reference_node); // Still need to verify as last may be first as well
112114
}
113115
}
114116
if (self.reference_node == self.root) return null;
@@ -122,18 +124,18 @@ pub const NodeIterator = struct {
122124
// Get last child if it has one.
123125
if (try self.lastChild(current)) |child| {
124126
self.reference_node = child;
125-
return child;
127+
return try Node.toInterface(child);
126128
}
127129

128130
// Otherwise, this node is our previous one.
129131
self.reference_node = current;
130-
return current;
132+
return try Node.toInterface(current);
131133
},
132134
.reject, .skip => {
133135
// Get last child if it has one.
134136
if (try self.lastChild(current)) |child| {
135137
self.reference_node = child;
136-
return child;
138+
return try Node.toInterface(child);
137139
}
138140
},
139141
}
@@ -142,7 +144,7 @@ pub const NodeIterator = struct {
142144
if (current != self.root) {
143145
if (try self.parentNode(current)) |parent| {
144146
self.reference_node = parent;
145-
return parent;
147+
return try Node.toInterface(parent);
146148
}
147149
}
148150

src/browser/dom/tree_walker.zig

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ const parser = @import("../netsurf.zig");
2222
const NodeFilter = @import("node_filter.zig");
2323
const Env = @import("../env.zig").Env;
2424
const Page = @import("../page.zig").Page;
25+
const Node = @import("node.zig").Node;
26+
const NodeUnion = @import("node.zig").Union;
2527

2628
// https://developer.mozilla.org/en-US/docs/Web/API/TreeWalker
2729
pub const TreeWalker = struct {
@@ -55,12 +57,12 @@ pub const TreeWalker = struct {
5557
};
5658
}
5759

58-
pub fn get_root(self: *TreeWalker) *parser.Node {
59-
return self.root;
60+
pub fn get_root(self: *TreeWalker) !NodeUnion {
61+
return try Node.toInterface(self.root);
6062
}
6163

62-
pub fn get_currentNode(self: *TreeWalker) *parser.Node {
63-
return self.current_node;
64+
pub fn get_currentNode(self: *TreeWalker) !NodeUnion {
65+
return try Node.toInterface(self.current_node);
6466
}
6567

6668
pub fn get_whatToShow(self: *TreeWalker) u32 {
@@ -157,35 +159,35 @@ pub const TreeWalker = struct {
157159
}
158160
}
159161

160-
pub fn _firstChild(self: *TreeWalker) !?*parser.Node {
162+
pub fn _firstChild(self: *TreeWalker) !?NodeUnion {
161163
if (try self.firstChild(self.current_node)) |child| {
162164
self.current_node = child;
163-
return child;
165+
return try Node.toInterface(child);
164166
}
165167

166168
return null;
167169
}
168170

169-
pub fn _lastChild(self: *TreeWalker) !?*parser.Node {
171+
pub fn _lastChild(self: *TreeWalker) !?NodeUnion {
170172
if (try self.lastChild(self.current_node)) |child| {
171173
self.current_node = child;
172-
return child;
174+
return try Node.toInterface(child);
173175
}
174176

175177
return null;
176178
}
177179

178-
pub fn _nextNode(self: *TreeWalker) !?*parser.Node {
180+
pub fn _nextNode(self: *TreeWalker) !?NodeUnion {
179181
if (try self.firstChild(self.current_node)) |child| {
180182
self.current_node = child;
181-
return child;
183+
return try Node.toInterface(child);
182184
}
183185

184186
var current = self.current_node;
185187
while (current != self.root) {
186188
if (try self.nextSibling(current)) |sibling| {
187189
self.current_node = sibling;
188-
return sibling;
190+
return try Node.toInterface(sibling);
189191
}
190192

191193
current = (try parser.nodeParentNode(current)) orelse break;
@@ -194,25 +196,25 @@ pub const TreeWalker = struct {
194196
return null;
195197
}
196198

197-
pub fn _nextSibling(self: *TreeWalker) !?*parser.Node {
199+
pub fn _nextSibling(self: *TreeWalker) !?NodeUnion {
198200
if (try self.nextSibling(self.current_node)) |sibling| {
199201
self.current_node = sibling;
200-
return sibling;
202+
return try Node.toInterface(sibling);
201203
}
202204

203205
return null;
204206
}
205207

206-
pub fn _parentNode(self: *TreeWalker) !?*parser.Node {
208+
pub fn _parentNode(self: *TreeWalker) !?NodeUnion {
207209
if (try self.parentNode(self.current_node)) |parent| {
208210
self.current_node = parent;
209-
return parent;
211+
return try Node.toInterface(parent);
210212
}
211213

212214
return null;
213215
}
214216

215-
pub fn _previousNode(self: *TreeWalker) !?*parser.Node {
217+
pub fn _previousNode(self: *TreeWalker) !?NodeUnion {
216218
if (self.current_node == self.root) return null;
217219

218220
var current = self.current_node;
@@ -224,19 +226,19 @@ pub const TreeWalker = struct {
224226
// Get last child if it has one.
225227
if (try self.lastChild(current)) |child| {
226228
self.current_node = child;
227-
return child;
229+
return try Node.toInterface(child);
228230
}
229231

230232
// Otherwise, this node is our previous one.
231233
self.current_node = current;
232-
return current;
234+
return try Node.toInterface(current);
233235
},
234236
.reject => continue,
235237
.skip => {
236238
// Get last child if it has one.
237239
if (try self.lastChild(current)) |child| {
238240
self.current_node = child;
239-
return child;
241+
return try Node.toInterface(child);
240242
}
241243
},
242244
}
@@ -245,17 +247,17 @@ pub const TreeWalker = struct {
245247
if (current != self.root) {
246248
if (try self.parentNode(current)) |parent| {
247249
self.current_node = parent;
248-
return parent;
250+
return try Node.toInterface(parent);
249251
}
250252
}
251253

252254
return null;
253255
}
254256

255-
pub fn _previousSibling(self: *TreeWalker) !?*parser.Node {
257+
pub fn _previousSibling(self: *TreeWalker) !?NodeUnion {
256258
if (try self.previousSibling(self.current_node)) |sibling| {
257259
self.current_node = sibling;
258-
return sibling;
260+
return try Node.toInterface(sibling);
259261
}
260262

261263
return null;

0 commit comments

Comments
 (0)