netsurf: node's attributes can be null

This commit is contained in:
Pierre Tachoire
2025-04-30 15:55:34 +02:00
parent 88f7687646
commit 09fbbc1e17
3 changed files with 16 additions and 15 deletions

View File

@@ -99,7 +99,8 @@ pub const Element = struct {
} }
pub fn get_attributes(self: *parser.Element) !*parser.NamedNodeMap { 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 { pub fn get_innerHTML(self: *parser.Element, state: *SessionState) ![]const u8 {

View File

@@ -38,18 +38,18 @@ pub fn writeNode(node: *parser.Node, writer: anytype) anyerror!void {
try writer.writeAll(tag); try writer.writeAll(tag);
// write the attributes // write the attributes
const map = try parser.nodeGetAttributes(node); const _map = try parser.nodeGetAttributes(node);
if (_map) |map| {
const ln = try parser.namedNodeMapGetLength(map); const ln = try parser.namedNodeMapGetLength(map);
var i: u32 = 0; for (0..ln) |i| {
while (i < ln) { const attr = try parser.namedNodeMapItem(map, @intCast(i)) orelse break;
const attr = try parser.namedNodeMapItem(map, i) orelse break;
try writer.writeAll(" "); try writer.writeAll(" ");
try writer.writeAll(try parser.attributeGetName(attr)); try writer.writeAll(try parser.attributeGetName(attr));
try writer.writeAll("=\""); try writer.writeAll("=\"");
const attribute_value = try parser.attributeGetValue(attr) orelse ""; const attribute_value = try parser.attributeGetValue(attr) orelse "";
try writeEscapedAttributeValue(writer, attribute_value); try writeEscapedAttributeValue(writer, attribute_value);
try writer.writeAll("\""); try writer.writeAll("\"");
i += 1; }
} }
try writer.writeAll(">"); try writer.writeAll(">");

View File

@@ -1338,11 +1338,11 @@ pub fn nodeHasAttributes(node: *Node) !bool {
return res; return res;
} }
pub fn nodeGetAttributes(node: *Node) !*NamedNodeMap { pub fn nodeGetAttributes(node: *Node) !?*NamedNodeMap {
var res: ?*NamedNodeMap = undefined; var res: ?*NamedNodeMap = undefined;
const err = nodeVtable(node).dom_node_get_attributes.?(node, &res); const err = nodeVtable(node).dom_node_get_attributes.?(node, &res);
try DOMErr(err); try DOMErr(err);
return res.?; return res;
} }
pub fn nodeGetNamespace(node: *Node) !?[]const u8 { pub fn nodeGetNamespace(node: *Node) !?[]const u8 {