diff --git a/src/dom/character_data.zig b/src/dom/character_data.zig index 81797c07..b19325a0 100644 --- a/src/dom/character_data.zig +++ b/src/dom/character_data.zig @@ -34,6 +34,14 @@ pub const CharacterData = struct { return HTMLElem.toInterface(HTMLElem.Union, res.?); } + pub fn get_previousElementSibling(self: *parser.CharacterData) ?HTMLElem.Union { + const res = parser.nodePreviousElementSibling(parser.characterDataToNode(self)); + if (res == null) { + return null; + } + return HTMLElem.toInterface(HTMLElem.Union, res.?); + } + // Read/Write attributes pub fn get_data(self: *parser.CharacterData) []const u8 { @@ -88,4 +96,13 @@ pub fn testExecFn( .{ .src = "cdata.nextElementSibling.localName === 'a' ", .ex = "true" }, }; try checkCases(js_env, &get_next_elem_sibling); + + var get_prev_elem_sibling = [_]Case{ + .{ .src = "cdata.previousElementSibling === null", .ex = "true" }, + // create a prev element + .{ .src = "let prev = document.createElement('div')", .ex = "undefined" }, + .{ .src = "link.insertBefore(prev, cdata) !== undefined", .ex = "true" }, + .{ .src = "cdata.previousElementSibling.localName === 'div' ", .ex = "true" }, + }; + try checkCases(js_env, &get_prev_elem_sibling); } diff --git a/src/netsurf.zig b/src/netsurf.zig index f6a7285a..c244c5c3 100644 --- a/src/netsurf.zig +++ b/src/netsurf.zig @@ -270,14 +270,14 @@ pub fn nodeNextSibling(node: *Node) ?*Node { pub fn nodeNextElementSibling(node: *Node) ?*Element { var n = node; while (true) { - const next = nodeNextSibling(n); - if (next == null) { + const res = nodeNextSibling(n); + if (res == null) { return null; } - if (nodeType(next.?) == .element) { - return @as(*Element, @ptrCast(next.?)); + if (nodeType(res.?) == .element) { + return @as(*Element, @ptrCast(res.?)); } - n = next.?; + n = res.?; } return null; } @@ -288,6 +288,21 @@ pub fn nodePreviousSibling(node: *Node) ?*Node { return res; } +pub fn nodePreviousElementSibling(node: *Node) ?*Element { + var n = node; + while (true) { + const res = nodePreviousSibling(n); + if (res == null) { + return null; + } + if (nodeType(res.?) == .element) { + return @as(*Element, @ptrCast(res.?)); + } + n = res.?; + } + return null; +} + pub fn nodeParentNode(node: *Node) ?*Node { var res: ?*Node = undefined; _ = nodeVtable(node).dom_node_get_parent_node.?(node, &res);