diff --git a/src/dom/document.zig b/src/dom/document.zig index 80a90593..cb07715c 100644 --- a/src/dom/document.zig +++ b/src/dom/document.zig @@ -22,8 +22,8 @@ pub const Document = struct { pub const prototype = *Node; pub const mem_guarantied = true; - pub fn constructor() *parser.Document { - return parser.domImplementationCreateHTMLDocument(null); + pub fn constructor() !*parser.Document { + return try parser.domImplementationCreateHTMLDocument(null); } // JS funcs diff --git a/src/dom/exceptions.zig b/src/dom/exceptions.zig index 32792d86..48650489 100644 --- a/src/dom/exceptions.zig +++ b/src/dom/exceptions.zig @@ -54,7 +54,11 @@ pub const DOMException = struct { .{ errName, callerName }, ), error.NoError => unreachable, - else => "", // TODO: implement other messages + else => try allocPrint( + alloc, + "{s}: TODO message", // TODO: implement other messages + .{DOMException.name(errCast)}, + ), }; return .{ .err = errCast, .str = str }; } @@ -154,6 +158,8 @@ pub fn testExecFn( .{ .src = "HierarchyRequestError.code", .ex = "3" }, .{ .src = "HierarchyRequestError.message", .ex = err }, .{ .src = "HierarchyRequestError.toString()", .ex = "HierarchyRequestError: " ++ err }, + .{ .src = "HierarchyRequestError instanceof DOMException", .ex = "true" }, + .{ .src = "HierarchyRequestError instanceof Error", .ex = "true" }, }; try checkCases(js_env, &cases); } diff --git a/src/dom/implementation.zig b/src/dom/implementation.zig index 3e4e9eaa..fc358fee 100644 --- a/src/dom/implementation.zig +++ b/src/dom/implementation.zig @@ -8,11 +8,14 @@ const checkCases = jsruntime.test_utils.checkCases; const Document = @import("document.zig").Document; const DocumentType = @import("document_type.zig").DocumentType; +const DOMException = @import("exceptions.zig").DOMException; // WEB IDL https://dom.spec.whatwg.org/#domimplementation pub const DOMImplementation = struct { pub const mem_guarantied = true; + pub const Exception = DOMException; + pub fn _createDocumentType( _: *DOMImplementation, alloc: std.mem.Allocator, @@ -29,7 +32,7 @@ pub const DOMImplementation = struct { const csystemId = try alloc.dupeZ(u8, systemId); defer alloc.free(csystemId); - return parser.domImplementationCreateDocumentType(cqname, cpublicId, csystemId); + return try parser.domImplementationCreateDocumentType(cqname, cpublicId, csystemId); } pub fn _createDocument( @@ -51,11 +54,11 @@ pub const DOMImplementation = struct { defer alloc.free(cqname.?); } - return parser.domImplementationCreateDocument(cnamespace, cqname, doctype); + return try parser.domImplementationCreateDocument(cnamespace, cqname, doctype); } - pub fn _createHTMLDocument(_: *DOMImplementation, title: ?[]const u8) *parser.Document { - return parser.domImplementationCreateHTMLDocument(title); + pub fn _createHTMLDocument(_: *DOMImplementation, title: ?[]const u8) !*parser.Document { + return try parser.domImplementationCreateHTMLDocument(title); } pub fn _hasFeature(_: *DOMImplementation) bool { diff --git a/src/netsurf.zig b/src/netsurf.zig index e6fd09a9..a7d0a22f 100644 --- a/src/netsurf.zig +++ b/src/netsurf.zig @@ -889,7 +889,11 @@ pub inline fn documentTypeGetSystemId(dt: *DocumentType) ![]const u8 { } // DOMImplementation -pub inline fn domImplementationCreateDocument(namespace: ?[:0]const u8, qname: ?[:0]const u8, doctype: ?*DocumentType) *Document { +pub inline fn domImplementationCreateDocument( + namespace: ?[:0]const u8, + qname: ?[:0]const u8, + doctype: ?*DocumentType, +) !*Document { var doc: ?*Document = undefined; var ptrnamespace: [*c]const u8 = null; @@ -902,7 +906,7 @@ pub inline fn domImplementationCreateDocument(namespace: ?[:0]const u8, qname: ? ptrqname = qn.ptr; } - _ = c.dom_implementation_create_document( + const err = c.dom_implementation_create_document( c.DOM_IMPLEMENTATION_XML, ptrnamespace, ptrqname, @@ -911,18 +915,24 @@ pub inline fn domImplementationCreateDocument(namespace: ?[:0]const u8, qname: ? null, &doc, ); + try DOMErr(err); return doc.?; } -pub inline fn domImplementationCreateDocumentType(qname: [:0]const u8, publicId: [:0]const u8, systemId: [:0]const u8) *DocumentType { +pub inline fn domImplementationCreateDocumentType( + qname: [:0]const u8, + publicId: [:0]const u8, + systemId: [:0]const u8, +) !*DocumentType { var dt: ?*DocumentType = undefined; - _ = c.dom_implementation_create_document_type(qname.ptr, publicId.ptr, systemId.ptr, &dt); + const err = c.dom_implementation_create_document_type(qname.ptr, publicId.ptr, systemId.ptr, &dt); + try DOMErr(err); return dt.?; } -pub inline fn domImplementationCreateHTMLDocument(title: ?[]const u8) *Document { +pub inline fn domImplementationCreateHTMLDocument(title: ?[]const u8) !*Document { var doc: ?*Document = undefined; - _ = c.dom_implementation_create_document( + const err = c.dom_implementation_create_document( c.DOM_IMPLEMENTATION_HTML, null, null, @@ -931,6 +941,7 @@ pub inline fn domImplementationCreateHTMLDocument(title: ?[]const u8) *Document null, &doc, ); + try DOMErr(err); // TODO set title _ = title; return doc.?; diff --git a/vendor/jsruntime-lib b/vendor/jsruntime-lib index bca65e09..d63b0a59 160000 --- a/vendor/jsruntime-lib +++ b/vendor/jsruntime-lib @@ -1 +1 @@ -Subproject commit bca65e098513e17d5389d090ae952cf97ecd1d14 +Subproject commit d63b0a592f51e7743723a47e9faa49a7e8e61f26