From 4a4602137b5448a9e5fce8f09d079fd8b0f0f688 Mon Sep 17 00:00:00 2001 From: Pierre Tachoire Date: Tue, 25 Nov 2025 11:46:54 +0100 Subject: [PATCH 1/2] element: add prefix and localName accessors --- .../tests/document/create_element_ns.html | 8 ++++++++ src/browser/webapi/Element.zig | 20 +++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/src/browser/tests/document/create_element_ns.html b/src/browser/tests/document/create_element_ns.html index c14a2773..5a75c359 100644 --- a/src/browser/tests/document/create_element_ns.html +++ b/src/browser/tests/document/create_element_ns.html @@ -28,5 +28,13 @@ const regularDiv = document.createElement('div'); testing.expectEqual('DIV', regularDiv.tagName); + testing.expectEqual('div', regularDiv.localName); + testing.expectEqual(null, regularDiv.prefix); testing.expectEqual('http://www.w3.org/1999/xhtml', regularDiv.namespaceURI); + + const custom = document.createElementNS('test', 'te:ST'); + testing.expectEqual('TE:ST', custom.tagName); // Should be te:ST + testing.expectEqual('te', custom.prefix); + testing.expectEqual('ST', custom.localName); + testing.expectEqual('http://www.w3.org/1999/xhtml', custom.namespaceURI); // Should be test diff --git a/src/browser/webapi/Element.zig b/src/browser/webapi/Element.zig index 023da510..81427e0b 100644 --- a/src/browser/webapi/Element.zig +++ b/src/browser/webapi/Element.zig @@ -913,6 +913,26 @@ pub const JsApi = struct { return buf.written(); } + pub const prefix = bridge.accessor(_prefix, null, .{}); + fn _prefix(self: *Element) ?[]const u8 { + const name = self.getTagNameLower(); + if (std.mem.indexOfPos(u8, name, 0, ":")) |pos| { + return name[0..pos]; + } + + return null; + } + + pub const localName = bridge.accessor(_localName, null, .{}); + fn _localName(self: *Element) []const u8 { + const name = self.getTagNameLower(); + if (std.mem.indexOfPos(u8, name, 0, ":")) |pos| { + return name[pos + 1 ..]; + } + + return name; + } + pub const id = bridge.accessor(Element.getId, Element.setId, .{}); pub const className = bridge.accessor(Element.getClassName, Element.setClassName, .{}); pub const classList = bridge.accessor(Element.getClassList, null, .{}); From a0fa232a3a3852bc163fbbce081784644b36aaef Mon Sep 17 00:00:00 2001 From: Pierre Tachoire Date: Tue, 25 Nov 2025 12:12:00 +0100 Subject: [PATCH 2/2] element: upper case only the suffix part of the tagname --- src/browser/tests/document/create_element_ns.html | 2 +- src/browser/webapi/Element.zig | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/browser/tests/document/create_element_ns.html b/src/browser/tests/document/create_element_ns.html index 5a75c359..46773ebc 100644 --- a/src/browser/tests/document/create_element_ns.html +++ b/src/browser/tests/document/create_element_ns.html @@ -33,7 +33,7 @@ testing.expectEqual('http://www.w3.org/1999/xhtml', regularDiv.namespaceURI); const custom = document.createElementNS('test', 'te:ST'); - testing.expectEqual('TE:ST', custom.tagName); // Should be te:ST + testing.expectEqual('te:ST', custom.tagName); testing.expectEqual('te', custom.prefix); testing.expectEqual('ST', custom.localName); testing.expectEqual('http://www.w3.org/1999/xhtml', custom.namespaceURI); // Should be test diff --git a/src/browser/webapi/Element.zig b/src/browser/webapi/Element.zig index 81427e0b..c1608425 100644 --- a/src/browser/webapi/Element.zig +++ b/src/browser/webapi/Element.zig @@ -767,7 +767,15 @@ fn upperTagName(tag_name: *String, buf: []u8) []const u8 { log.info(.dom, "tag.long.name", .{ .name = tag_name.str() }); return tag_name.str(); } - return std.ascii.upperString(buf, tag_name.str()); + const tag = tag_name.str(); + // If the tag_name has a prefix, we must uppercase only the suffix part. + // example: te:st should be returned as te:ST. + if (std.mem.indexOfPos(u8, tag, 0, ":")) |pos| { + @memcpy(buf[0 .. pos + 1], tag[0 .. pos + 1]); + _ = std.ascii.upperString(buf[pos..tag.len], tag[pos..tag.len]); + return buf[0..tag.len]; + } + return std.ascii.upperString(buf, tag); } pub fn getTag(self: *const Element) Tag {