diff --git a/src/browser/dom/element.zig b/src/browser/dom/element.zig index 3aeac4bd..d6cff74d 100644 --- a/src/browser/dom/element.zig +++ b/src/browser/dom/element.zig @@ -99,7 +99,8 @@ pub const Element = struct { } pub fn get_attributes(self: *parser.Element) !*parser.NamedNodeMap { - return try parser.nodeGetAttributes(parser.elementToNode(self)); + // An element must have non-nil attributes. + return try parser.nodeGetAttributes(parser.elementToNode(self)) orelse unreachable; } pub fn get_innerHTML(self: *parser.Element, state: *SessionState) ![]const u8 { diff --git a/src/browser/dump.zig b/src/browser/dump.zig index 4c4e7996..01669036 100644 --- a/src/browser/dump.zig +++ b/src/browser/dump.zig @@ -38,18 +38,18 @@ pub fn writeNode(node: *parser.Node, writer: anytype) anyerror!void { try writer.writeAll(tag); // write the attributes - const map = try parser.nodeGetAttributes(node); - const ln = try parser.namedNodeMapGetLength(map); - var i: u32 = 0; - while (i < ln) { - const attr = try parser.namedNodeMapItem(map, i) orelse break; - try writer.writeAll(" "); - try writer.writeAll(try parser.attributeGetName(attr)); - try writer.writeAll("=\""); - const attribute_value = try parser.attributeGetValue(attr) orelse ""; - try writeEscapedAttributeValue(writer, attribute_value); - try writer.writeAll("\""); - i += 1; + const _map = try parser.nodeGetAttributes(node); + if (_map) |map| { + const ln = try parser.namedNodeMapGetLength(map); + for (0..ln) |i| { + const attr = try parser.namedNodeMapItem(map, @intCast(i)) orelse break; + try writer.writeAll(" "); + try writer.writeAll(try parser.attributeGetName(attr)); + try writer.writeAll("=\""); + const attribute_value = try parser.attributeGetValue(attr) orelse ""; + try writeEscapedAttributeValue(writer, attribute_value); + try writer.writeAll("\""); + } } try writer.writeAll(">"); diff --git a/src/browser/netsurf.zig b/src/browser/netsurf.zig index df5ab147..f7050d60 100644 --- a/src/browser/netsurf.zig +++ b/src/browser/netsurf.zig @@ -1338,11 +1338,11 @@ pub fn nodeHasAttributes(node: *Node) !bool { return res; } -pub fn nodeGetAttributes(node: *Node) !*NamedNodeMap { +pub fn nodeGetAttributes(node: *Node) !?*NamedNodeMap { var res: ?*NamedNodeMap = undefined; const err = nodeVtable(node).dom_node_get_attributes.?(node, &res); try DOMErr(err); - return res.?; + return res; } pub fn nodeGetNamespace(node: *Node) !?[]const u8 {