diff --git a/src/browser/tests/domparser.html b/src/browser/tests/domparser.html
index 7930ec87..d8399055 100644
--- a/src/browser/tests/domparser.html
+++ b/src/browser/tests/domparser.html
@@ -11,9 +11,9 @@
}
{
- // Empty XML is a parse error (no root element)
const parser = new DOMParser();
- testing.expectError('Error', () => parser.parseFromString('', 'text/xml'));
+ let d = parser.parseFromString('', 'text/xml');
+ testing.expectEqual('error', new XMLSerializer().serializeToString(d));
}
}
diff --git a/src/browser/webapi/DOMParser.zig b/src/browser/webapi/DOMParser.zig
index 9e27e9c7..10a94bca 100644
--- a/src/browser/webapi/DOMParser.zig
+++ b/src/browser/webapi/DOMParser.zig
@@ -86,15 +86,15 @@ pub fn parseFromString(
var parser = Parser.init(arena, doc_node, page);
parser.parseXML(html);
- if (parser.err) |pe| {
- return pe.err;
+ if (parser.err != null or doc_node.firstChild() == null) {
+ // Return a document with a element per spec.
+ const err_doc = try page._factory.document(XMLDocument{ ._proto = undefined });
+ var err_parser = Parser.init(arena, err_doc.asNode(), page);
+ err_parser.parseXML("error");
+ return err_doc.asDocument();
}
- const first_child = doc_node.firstChild() orelse {
- // Empty XML or no root element - this is a parse error.
- // TODO: Return a document with a element per spec.
- return error.JsException;
- };
+ const first_child = doc_node.firstChild().?;
// If first node is a `ProcessingInstruction`, skip it.
if (first_child.getNodeType() == 7) {