From 9c8d1082a32d92ea5c3002ead776d4f063ad991b Mon Sep 17 00:00:00 2001 From: Francis Bouvier Date: Thu, 28 Sep 2023 19:36:18 +0200 Subject: [PATCH] characterdata: add data getter and setter Signed-off-by: Francis Bouvier --- src/dom/character_data.zig | 41 ++++++++++++++++++++++++++++++++++++++ src/netsurf.zig | 15 ++++++++++++++ src/run_tests.zig | 3 +++ 3 files changed, 59 insertions(+) diff --git a/src/dom/character_data.zig b/src/dom/character_data.zig index 0f39a94d..cf53136c 100644 --- a/src/dom/character_data.zig +++ b/src/dom/character_data.zig @@ -1,4 +1,10 @@ +const std = @import("std"); + +const jsruntime = @import("jsruntime"); +const Case = jsruntime.test_utils.Case; +const checkCases = jsruntime.test_utils.checkCases; const generate = @import("../generate.zig"); + const parser = @import("../netsurf.zig"); const Node = @import("node.zig").Node; @@ -9,6 +15,19 @@ pub const CharacterData = struct { pub const Self = parser.CharacterData; pub const prototype = *Node; pub const mem_guarantied = true; + + // JS funcs + // -------- + + // Read/Write attributes + + pub fn get_data(self: *parser.CharacterData) []const u8 { + return parser.characterDataData(self); + } + + pub fn set_data(self: *parser.CharacterData, data: []const u8) void { + return parser.characterDataSetData(self, data); + } }; pub const Types = generate.Tuple(.{ @@ -18,3 +37,25 @@ pub const Types = generate.Tuple(.{ const Generated = generate.Union.compile(Types); pub const Union = Generated._union; pub const Tags = Generated._enum; + +// Tests +// ----- + +pub fn testExecFn( + _: std.mem.Allocator, + js_env: *jsruntime.Env, + comptime _: []jsruntime.API, +) !void { + var get_data = [_]Case{ + .{ .src = "let cdata_t = document.getElementById('link').firstChild", .ex = "undefined" }, + .{ .src = "cdata_t.data", .ex = "OK" }, + }; + try checkCases(js_env, &get_data); + + var set_data = [_]Case{ + .{ .src = "cdata_t.data = 'OK modified'", .ex = "OK modified" }, + .{ .src = "cdata_t.data === 'OK modified'", .ex = "true" }, + .{ .src = "cdata_t.data = 'OK'", .ex = "OK" }, + }; + try checkCases(js_env, &set_data); +} diff --git a/src/netsurf.zig b/src/netsurf.zig index 9ec0714e..8409cf2f 100644 --- a/src/netsurf.zig +++ b/src/netsurf.zig @@ -420,6 +420,21 @@ pub fn nodeReplaceChild(node: *Node, new_child: *Node, old_child: *Node) *Node { // CharacterData pub const CharacterData = c.dom_characterdata; +fn characterDataVtable(data: *CharacterData) c.dom_characterdata_vtable { + return getVtable(c.dom_characterdata_vtable, CharacterData, data); +} + +pub fn characterDataData(cdata: *CharacterData) []const u8 { + var s: ?*String = undefined; + _ = characterDataVtable(cdata).dom_characterdata_get_data.?(cdata, &s); + return stringToData(s.?); +} + +pub fn characterDataSetData(cdata: *CharacterData, data: []const u8) void { + const s = stringFromData(data); + _ = characterDataVtable(cdata).dom_characterdata_set_data.?(cdata, s); +} + // Text pub const Text = c.dom_text; diff --git a/src/run_tests.zig b/src/run_tests.zig index 775c7004..85aab7a5 100644 --- a/src/run_tests.zig +++ b/src/run_tests.zig @@ -5,8 +5,10 @@ const generate = @import("generate.zig"); const parser = @import("netsurf.zig"); const DOM = @import("dom.zig"); + const docTestExecFn = @import("html/document.zig").testExecFn; const nodeTestExecFn = @import("dom/node.zig").testExecFn; +const characterDataTestExecFn = @import("dom/character_data.zig").testExecFn; var doc: *parser.DocumentHTML = undefined; @@ -26,6 +28,7 @@ fn testsExecFn( // run tests try docTestExecFn(alloc, js_env, apis); try nodeTestExecFn(alloc, js_env, apis); + try characterDataTestExecFn(alloc, js_env, apis); } test {