Skip to content

Commit d8fe029

Browse files
committed
mutation: very partial childList implementation
1 parent c9cfb1e commit d8fe029

File tree

2 files changed

+42
-2
lines changed

2 files changed

+42
-2
lines changed

src/dom/mutation_observer.zig

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,9 @@ const EventHandler = struct {
284284

285285
const muevt = parser.eventToMutationEvent(evt.?);
286286

287+
// TODO get the allocator by another way?
288+
const alloc = data.cbk.nat_ctx.alloc;
289+
287290
if (std.mem.eql(u8, t, "DOMAttrModified")) {
288291
mrs.first = .{
289292
.type = "attributes",
@@ -305,12 +308,41 @@ const EventHandler = struct {
305308
if (o.options.characterDataOldValue) {
306309
mrs.first.?.oldValue = parser.mutationEventPrevValue(muevt) catch null;
307310
}
311+
} else if (std.mem.eql(u8, t, "DOMNodeInserted")) {
312+
mrs.first = .{
313+
.type = "childList",
314+
.target = o.node,
315+
.addedNodes = NodeList.init(),
316+
.removedNodes = NodeList.init(),
317+
};
318+
319+
const rn = parser.mutationEventRelatedNode(muevt) catch null;
320+
if (rn) |n| {
321+
mrs.first.?.addedNodes.append(alloc, n) catch |e| {
322+
log.err("mutation event handler error: {any}", .{e});
323+
return;
324+
};
325+
}
326+
} else if (std.mem.eql(u8, t, "DOMNodeRemoved")) {
327+
mrs.first = .{
328+
.type = "childList",
329+
.target = o.node,
330+
.addedNodes = NodeList.init(),
331+
.removedNodes = NodeList.init(),
332+
};
333+
334+
const rn = parser.mutationEventRelatedNode(muevt) catch null;
335+
if (rn) |n| {
336+
mrs.first.?.removedNodes.append(alloc, n) catch |e| {
337+
log.err("mutation event handler error: {any}", .{e});
338+
return;
339+
};
340+
}
308341
} else {
309342
return;
310343
}
311344

312-
// TODO get the allocator by another way?
313-
var res = CallbackResult.init(data.cbk.nat_ctx.alloc);
345+
var res = CallbackResult.init(alloc);
314346
defer res.deinit();
315347

316348
// TODO pass MutationRecords and MutationObserver

src/netsurf/netsurf.zig

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -543,6 +543,14 @@ pub fn mutationEventPrevValue(evt: *MutationEvent) !?[]const u8 {
543543
return strToData(s.?);
544544
}
545545

546+
pub fn mutationEventRelatedNode(evt: *MutationEvent) !?*Node {
547+
var n: NodeExternal = undefined;
548+
const err = c._dom_mutation_event_get_related_node(evt, &n);
549+
try DOMErr(err);
550+
if (n == null) return null;
551+
return @as(*Node, @ptrCast(n));
552+
}
553+
546554
// EventListener
547555
pub const EventListener = c.dom_event_listener;
548556
const EventListenerEntry = c.listener_entry;

0 commit comments

Comments
 (0)