From 8f851beda182d0a901445190266d33df129b98a9 Mon Sep 17 00:00:00 2001 From: Karl Seguin Date: Fri, 2 May 2025 16:30:49 +0800 Subject: [PATCH] add Element.matches web api --- src/browser/dom/element.zig | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/browser/dom/element.zig b/src/browser/dom/element.zig index 3aeac4bd..8984d251 100644 --- a/src/browser/dom/element.zig +++ b/src/browser/dom/element.zig @@ -355,7 +355,12 @@ pub const Element = struct { return state.renderer.height(); } - pub fn deinit(_: *parser.Element, _: std.mem.Allocator) void {} + pub fn _matches(self: *parser.Element, selectors: []const u8, state: *SessionState) !bool { + const cssParse = @import("../css/css.zig").parse; + const CssNodeWrap = @import("../css/libdom.zig").Node; + const s = try cssParse(state.call_arena, selectors, .{}); + return s.match(CssNodeWrap{ .node = parser.elementToNode(self) }); + } }; // Tests @@ -518,4 +523,13 @@ test "Browser.DOM.Element" { .{ "document.getElementById('para').clientWidth", "2" }, .{ "document.getElementById('para').clientHeight", "1" }, }, .{}); + + try runner.testCases(&.{ + .{ "const el = document.createElement('div');", "undefined" }, + .{ "el.id = 'matches'; el.className = 'ok';", "ok" }, + .{ "el.matches('#matches')", "true" }, + .{ "el.matches('.ok')", "true" }, + .{ "el.matches('#9000')", "false" }, + .{ "el.matches('.notok')", "false" }, + }, .{}); }