From f3e1204fa1eef0cdc46d1d220a96bd7a67ad1f0b Mon Sep 17 00:00:00 2001 From: Karl Seguin Date: Mon, 9 Mar 2026 13:44:17 +0800 Subject: [PATCH 1/8] Throw exception, as expected, on empty input to DOMParser.parseFromString https://github.com/lightpanda-io/browser/issues/1738 --- src/browser/tests/domparser.html | 14 +++++++++++--- src/browser/webapi/DOMParser.zig | 9 +++++---- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/browser/tests/domparser.html b/src/browser/tests/domparser.html index 70fd6ff9..24d34e89 100644 --- a/src/browser/tests/domparser.html +++ b/src/browser/tests/domparser.html @@ -4,9 +4,17 @@ diff --git a/src/browser/webapi/DOMParser.zig b/src/browser/webapi/DOMParser.zig index e2a0a438..9e27e9c7 100644 --- a/src/browser/webapi/DOMParser.zig +++ b/src/browser/webapi/DOMParser.zig @@ -90,15 +90,16 @@ pub fn parseFromString( return pe.err; } - // If first node is a `ProcessingInstruction`, skip it. const first_child = doc_node.firstChild() orelse { - // Parsing should fail if there aren't any nodes. - unreachable; + // Empty XML or no root element - this is a parse error. + // TODO: Return a document with a element per spec. + return error.JsException; }; + // If first node is a `ProcessingInstruction`, skip it. if (first_child.getNodeType() == 7) { // We're sure that firstChild exist, this cannot fail. - _ = doc_node.removeChild(first_child, page) catch unreachable; + _ = try doc_node.removeChild(first_child, page); } return doc.asDocument(); From 5568340b9a7948e7990cdfd7c58a1b7f311ca1c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adri=C3=A0=20Arrufat?= Date: Mon, 9 Mar 2026 18:48:38 +0900 Subject: [PATCH 2/8] build: add code formatting check --- build.zig | 11 +++++++++++ build.zig.zon | 1 - 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/build.zig b/build.zig index 7e3a2817..d4eabcea 100644 --- a/build.zig +++ b/build.zig @@ -52,6 +52,17 @@ pub fn build(b: *Build) !void { mod.addImport("lightpanda", mod); // allow circular "lightpanda" import mod.addImport("build_config", opts.createModule()); + // Format check + const fmt_step = b.step("fmt", "Check code formatting"); + const fmt = b.addFmt(.{ + .paths = &.{ "src", "build.zig", "build.zig.zon" }, + .check = true, + }); + fmt_step.dependOn(&fmt.step); + + // Set default behavior + b.default_step.dependOn(fmt_step); + try linkV8(b, mod, enable_asan, enable_tsan, prebuilt_v8_path); try linkCurl(b, mod); try linkHtml5Ever(b, mod); diff --git a/build.zig.zon b/build.zig.zon index b7525c77..eb3812a8 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -7,7 +7,6 @@ .v8 = .{ .url = "https://github.com/lightpanda-io/zig-v8-fork/archive/refs/tags/v0.3.1.tar.gz", .hash = "v8-0.0.0-xddH64J7BAC81mkf6G9RbEJxS-W3TIRl5iFnShwbqCqy", - }, //.v8 = .{ .path = "../zig-v8-fork" }, .brotli = .{ From 183643547b6e35106abf8501b058add754933a79 Mon Sep 17 00:00:00 2001 From: Karl Seguin Date: Mon, 9 Mar 2026 18:06:22 +0800 Subject: [PATCH 3/8] document.applets should always return an empty collection Add a new .empty mode to HTMLCollection. Fixes WPT /shadow-dom/leaktests/html-collection.html --- src/browser/tests/legacy/html/document.html | 3 ++- src/browser/webapi/HTMLDocument.zig | 5 ++--- src/browser/webapi/collections.zig | 5 +++-- src/browser/webapi/collections/HTMLCollection.zig | 8 ++++++++ 4 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/browser/tests/legacy/html/document.html b/src/browser/tests/legacy/html/document.html index 7abb0b03..01e5d76a 100644 --- a/src/browser/tests/legacy/html/document.html +++ b/src/browser/tests/legacy/html/document.html @@ -6,6 +6,7 @@ +