From b2df0c1541ad2de9845dd5b4672b54518135f5d5 Mon Sep 17 00:00:00 2001 From: Pierre Tachoire Date: Mon, 22 Apr 2024 12:27:08 +0200 Subject: [PATCH] dom: implement document fragment constructor --- src/dom/document_fragment.zig | 33 ++++++++++++++++++++++++++------- src/run_tests.zig | 2 ++ 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/src/dom/document_fragment.zig b/src/dom/document_fragment.zig index 7cd1d27b..da21798e 100644 --- a/src/dom/document_fragment.zig +++ b/src/dom/document_fragment.zig @@ -20,20 +20,39 @@ const std = @import("std"); const parser = @import("../netsurf.zig"); +const jsruntime = @import("jsruntime"); +const Case = jsruntime.test_utils.Case; +const checkCases = jsruntime.test_utils.checkCases; + const Node = @import("node.zig").Node; +const UserContext = @import("../user_context.zig").UserContext; + // WEB IDL https://dom.spec.whatwg.org/#documentfragment pub const DocumentFragment = struct { pub const Self = parser.DocumentFragment; pub const prototype = *Node; pub const mem_guarantied = true; - // TODO add constructor, but I need to associate the new DocumentFragment - // with the current document global object... - // > The new DocumentFragment() constructor steps are to set this’s node - // > document to current global object’s associated Document. - // https://dom.spec.whatwg.org/#dom-documentfragment-documentfragment - pub fn constructor() !*parser.DocumentFragment { - return error.NotImplemented; + pub fn constructor(userctx: UserContext) !*parser.DocumentFragment { + if (userctx.document == null) return parser.DOMError.NotSupported; + + return parser.documentCreateDocumentFragment( + parser.documentHTMLToDocument(userctx.document.?), + ); } }; + +// Tests +// ----- + +pub fn testExecFn( + _: std.mem.Allocator, + js_env: *jsruntime.Env, +) anyerror!void { + var constructor = [_]Case{ + .{ .src = "const dc = new DocumentFragment()", .ex = "undefined" }, + .{ .src = "dc.constructor.name", .ex = "DocumentFragment" }, + }; + try checkCases(js_env, &constructor); +} diff --git a/src/run_tests.zig b/src/run_tests.zig index 49313cbf..5eb470be 100644 --- a/src/run_tests.zig +++ b/src/run_tests.zig @@ -47,6 +47,7 @@ const AttrTestExecFn = @import("dom/attribute.zig").testExecFn; const EventTargetTestExecFn = @import("dom/event_target.zig").testExecFn; const ProcessingInstructionTestExecFn = @import("dom/processing_instruction.zig").testExecFn; const CommentTestExecFn = @import("dom/comment.zig").testExecFn; +const DocumentFragmentTestExecFn = @import("dom/document_fragment.zig").testExecFn; const EventTestExecFn = @import("events/event.zig").testExecFn; const XHRTestExecFn = xhr.testExecFn; const ProgressEventTestExecFn = @import("xhr/progress_event.zig").testExecFn; @@ -116,6 +117,7 @@ fn testsAllExecFn( NodeListTestExecFn, AttrTestExecFn, CommentTestExecFn, + DocumentFragmentTestExecFn, EventTargetTestExecFn, EventTestExecFn, XHRTestExecFn,