From 9c8d1082a32d92ea5c3002ead776d4f063ad991b Mon Sep 17 00:00:00 2001 From: Francis Bouvier Date: Thu, 28 Sep 2023 19:36:18 +0200 Subject: [PATCH 01/10] 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 { From 51f12714967daa973b5331bf9a44a345a8c3d831 Mon Sep 17 00:00:00 2001 From: Francis Bouvier Date: Thu, 28 Sep 2023 19:48:42 +0200 Subject: [PATCH 02/10] characterdata: add length getter Signed-off-by: Francis Bouvier --- src/dom/character_data.zig | 11 +++++++++++ src/netsurf.zig | 6 ++++++ 2 files changed, 17 insertions(+) diff --git a/src/dom/character_data.zig b/src/dom/character_data.zig index cf53136c..fefd77f7 100644 --- a/src/dom/character_data.zig +++ b/src/dom/character_data.zig @@ -19,6 +19,12 @@ pub const CharacterData = struct { // JS funcs // -------- + // Read attributes + + pub fn get_length(self: *parser.CharacterData) u32 { + return parser.characterDataLength(self); + } + // Read/Write attributes pub fn get_data(self: *parser.CharacterData) []const u8 { @@ -58,4 +64,9 @@ pub fn testExecFn( .{ .src = "cdata_t.data = 'OK'", .ex = "OK" }, }; try checkCases(js_env, &set_data); + + var get_length = [_]Case{ + .{ .src = "cdata_t.length === 2", .ex = "true" }, + }; + try checkCases(js_env, &get_length); } diff --git a/src/netsurf.zig b/src/netsurf.zig index 8409cf2f..26eac06e 100644 --- a/src/netsurf.zig +++ b/src/netsurf.zig @@ -435,6 +435,12 @@ pub fn characterDataSetData(cdata: *CharacterData, data: []const u8) void { _ = characterDataVtable(cdata).dom_characterdata_set_data.?(cdata, s); } +pub fn characterDataLength(cdata: *CharacterData) u32 { + var n: u32 = undefined; + _ = characterDataVtable(cdata).dom_characterdata_get_length.?(cdata, &n); + return n; +} + // Text pub const Text = c.dom_text; From 2d6f4979468d144f9fc8fd83dc271422a7435ecc Mon Sep 17 00:00:00 2001 From: Francis Bouvier Date: Mon, 2 Oct 2023 16:47:48 +0200 Subject: [PATCH 03/10] Restart doc at each test suite Signed-off-by: Francis Bouvier --- src/run_tests.zig | 35 +++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/src/run_tests.zig b/src/run_tests.zig index 85aab7a5..bb036659 100644 --- a/src/run_tests.zig +++ b/src/run_tests.zig @@ -12,23 +12,42 @@ const characterDataTestExecFn = @import("dom/character_data.zig").testExecFn; var doc: *parser.DocumentHTML = undefined; -fn testsExecFn( +fn testExecFn( alloc: std.mem.Allocator, js_env: *jsruntime.Env, comptime apis: []jsruntime.API, + comptime execFn: jsruntime.ContextExecFn, ) !void { // start JS env js_env.start(apis); defer js_env.stop(); + // document + doc = try parser.documentHTMLParseFromFileAlloc(std.testing.allocator, "test.html"); + defer parser.documentHTMLClose(doc); + // add document object try js_env.addObject(apis, doc, "document"); - // run tests - try docTestExecFn(alloc, js_env, apis); - try nodeTestExecFn(alloc, js_env, apis); - try characterDataTestExecFn(alloc, js_env, apis); + // run test + try execFn(alloc, js_env, apis); +} + +fn testsAllExecFn( + alloc: std.mem.Allocator, + js_env: *jsruntime.Env, + comptime apis: []jsruntime.API, +) !void { + const testFns = [_]jsruntime.ContextExecFn{ + docTestExecFn, + nodeTestExecFn, + characterDataTestExecFn, + }; + + inline for (testFns) |testFn| { + try testExecFn(alloc, js_env, apis, testFn); + } } test { @@ -40,10 +59,6 @@ test { // generate APIs const apis = jsruntime.compile(DOM.Interfaces); - // document - doc = try parser.documentHTMLParseFromFileAlloc(std.testing.allocator, "test.html"); - defer parser.documentHTMLClose(doc); - // create JS vm const vm = jsruntime.VM.init(); defer vm.deinit(); @@ -52,5 +67,5 @@ test { var arena_alloc = std.heap.ArenaAllocator.init(bench_alloc.allocator()); defer arena_alloc.deinit(); - try jsruntime.loadEnv(&arena_alloc, testsExecFn, apis); + try jsruntime.loadEnv(&arena_alloc, testsAllExecFn, apis); } From 202ee1646d7f0e60bc80f006f9ae02cc7b090d55 Mon Sep 17 00:00:00 2001 From: Francis Bouvier Date: Mon, 2 Oct 2023 17:25:32 +0200 Subject: [PATCH 04/10] characterdata: add nextElementSibling getter Signed-off-by: Francis Bouvier --- src/dom/character_data.zig | 31 +++++++++++++++++++++++++------ src/netsurf.zig | 19 +++++++++++++++++++ 2 files changed, 44 insertions(+), 6 deletions(-) diff --git a/src/dom/character_data.zig b/src/dom/character_data.zig index fefd77f7..81797c07 100644 --- a/src/dom/character_data.zig +++ b/src/dom/character_data.zig @@ -10,6 +10,7 @@ const parser = @import("../netsurf.zig"); const Node = @import("node.zig").Node; const Comment = @import("comment.zig").Comment; const Text = @import("text.zig").Text; +const HTMLElem = @import("../html/elements.zig"); pub const CharacterData = struct { pub const Self = parser.CharacterData; @@ -25,6 +26,14 @@ pub const CharacterData = struct { return parser.characterDataLength(self); } + pub fn get_nextElementSibling(self: *parser.CharacterData) ?HTMLElem.Union { + const res = parser.nodeNextElementSibling(parser.characterDataToNode(self)); + if (res == null) { + return null; + } + return HTMLElem.toInterface(HTMLElem.Union, res.?); + } + // Read/Write attributes pub fn get_data(self: *parser.CharacterData) []const u8 { @@ -53,20 +62,30 @@ pub fn testExecFn( comptime _: []jsruntime.API, ) !void { var get_data = [_]Case{ - .{ .src = "let cdata_t = document.getElementById('link').firstChild", .ex = "undefined" }, - .{ .src = "cdata_t.data", .ex = "OK" }, + .{ .src = "let link = document.getElementById('link')", .ex = "undefined" }, + .{ .src = "let cdata = link.firstChild", .ex = "undefined" }, + .{ .src = "cdata.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" }, + .{ .src = "cdata.data = 'OK modified'", .ex = "OK modified" }, + .{ .src = "cdata.data === 'OK modified'", .ex = "true" }, + .{ .src = "cdata.data = 'OK'", .ex = "OK" }, }; try checkCases(js_env, &set_data); var get_length = [_]Case{ - .{ .src = "cdata_t.length === 2", .ex = "true" }, + .{ .src = "cdata.length === 2", .ex = "true" }, }; try checkCases(js_env, &get_length); + + var get_next_elem_sibling = [_]Case{ + .{ .src = "cdata.nextElementSibling === null", .ex = "true" }, + // create a next element + .{ .src = "let next = document.createElement('a')", .ex = "undefined" }, + .{ .src = "link.appendChild(next, cdata) !== undefined", .ex = "true" }, + .{ .src = "cdata.nextElementSibling.localName === 'a' ", .ex = "true" }, + }; + try checkCases(js_env, &get_next_elem_sibling); } diff --git a/src/netsurf.zig b/src/netsurf.zig index 26eac06e..f6a7285a 100644 --- a/src/netsurf.zig +++ b/src/netsurf.zig @@ -267,6 +267,21 @@ pub fn nodeNextSibling(node: *Node) ?*Node { return res; } +pub fn nodeNextElementSibling(node: *Node) ?*Element { + var n = node; + while (true) { + const next = nodeNextSibling(n); + if (next == null) { + return null; + } + if (nodeType(next.?) == .element) { + return @as(*Element, @ptrCast(next.?)); + } + n = next.?; + } + return null; +} + pub fn nodePreviousSibling(node: *Node) ?*Node { var res: ?*Node = undefined; _ = nodeVtable(node).dom_node_get_previous_sibling.?(node, &res); @@ -424,6 +439,10 @@ fn characterDataVtable(data: *CharacterData) c.dom_characterdata_vtable { return getVtable(c.dom_characterdata_vtable, CharacterData, data); } +pub inline fn characterDataToNode(cdata: *CharacterData) *Node { + return @as(*Node, @ptrCast(cdata)); +} + pub fn characterDataData(cdata: *CharacterData) []const u8 { var s: ?*String = undefined; _ = characterDataVtable(cdata).dom_characterdata_get_data.?(cdata, &s); From 7406b6d06c222fe66f10cb2c62c14fbf8d8321e0 Mon Sep 17 00:00:00 2001 From: Francis Bouvier Date: Mon, 2 Oct 2023 17:29:27 +0200 Subject: [PATCH 05/10] characterdata: add previouselementSibling getter Signed-off-by: Francis Bouvier --- src/dom/character_data.zig | 17 +++++++++++++++++ src/netsurf.zig | 25 ++++++++++++++++++++----- 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/src/dom/character_data.zig b/src/dom/character_data.zig index 81797c07..b19325a0 100644 --- a/src/dom/character_data.zig +++ b/src/dom/character_data.zig @@ -34,6 +34,14 @@ pub const CharacterData = struct { return HTMLElem.toInterface(HTMLElem.Union, res.?); } + pub fn get_previousElementSibling(self: *parser.CharacterData) ?HTMLElem.Union { + const res = parser.nodePreviousElementSibling(parser.characterDataToNode(self)); + if (res == null) { + return null; + } + return HTMLElem.toInterface(HTMLElem.Union, res.?); + } + // Read/Write attributes pub fn get_data(self: *parser.CharacterData) []const u8 { @@ -88,4 +96,13 @@ pub fn testExecFn( .{ .src = "cdata.nextElementSibling.localName === 'a' ", .ex = "true" }, }; try checkCases(js_env, &get_next_elem_sibling); + + var get_prev_elem_sibling = [_]Case{ + .{ .src = "cdata.previousElementSibling === null", .ex = "true" }, + // create a prev element + .{ .src = "let prev = document.createElement('div')", .ex = "undefined" }, + .{ .src = "link.insertBefore(prev, cdata) !== undefined", .ex = "true" }, + .{ .src = "cdata.previousElementSibling.localName === 'div' ", .ex = "true" }, + }; + try checkCases(js_env, &get_prev_elem_sibling); } diff --git a/src/netsurf.zig b/src/netsurf.zig index f6a7285a..c244c5c3 100644 --- a/src/netsurf.zig +++ b/src/netsurf.zig @@ -270,14 +270,14 @@ pub fn nodeNextSibling(node: *Node) ?*Node { pub fn nodeNextElementSibling(node: *Node) ?*Element { var n = node; while (true) { - const next = nodeNextSibling(n); - if (next == null) { + const res = nodeNextSibling(n); + if (res == null) { return null; } - if (nodeType(next.?) == .element) { - return @as(*Element, @ptrCast(next.?)); + if (nodeType(res.?) == .element) { + return @as(*Element, @ptrCast(res.?)); } - n = next.?; + n = res.?; } return null; } @@ -288,6 +288,21 @@ pub fn nodePreviousSibling(node: *Node) ?*Node { return res; } +pub fn nodePreviousElementSibling(node: *Node) ?*Element { + var n = node; + while (true) { + const res = nodePreviousSibling(n); + if (res == null) { + return null; + } + if (nodeType(res.?) == .element) { + return @as(*Element, @ptrCast(res.?)); + } + n = res.?; + } + return null; +} + pub fn nodeParentNode(node: *Node) ?*Node { var res: ?*Node = undefined; _ = nodeVtable(node).dom_node_get_parent_node.?(node, &res); From 7c1eca3b7460b3a780e1e63c65b5829c18f52f01 Mon Sep 17 00:00:00 2001 From: Francis Bouvier Date: Mon, 9 Oct 2023 14:24:15 +0200 Subject: [PATCH 06/10] characterdata: add appendData method Signed-off-by: Francis Bouvier --- src/dom/character_data.zig | 13 +++++++++++++ src/netsurf.zig | 5 +++++ 2 files changed, 18 insertions(+) diff --git a/src/dom/character_data.zig b/src/dom/character_data.zig index b19325a0..10ed9133 100644 --- a/src/dom/character_data.zig +++ b/src/dom/character_data.zig @@ -51,6 +51,13 @@ pub const CharacterData = struct { pub fn set_data(self: *parser.CharacterData, data: []const u8) void { return parser.characterDataSetData(self, data); } + + // JS methods + // ---------- + + pub fn _appendData(self: *parser.CharacterData, data: []const u8) void { + return parser.characterDataAppendData(self, data); + } }; pub const Types = generate.Tuple(.{ @@ -105,4 +112,10 @@ pub fn testExecFn( .{ .src = "cdata.previousElementSibling.localName === 'div' ", .ex = "true" }, }; try checkCases(js_env, &get_prev_elem_sibling); + + var append_data = [_]Case{ + .{ .src = "cdata.appendData(' modified')", .ex = "undefined" }, + .{ .src = "cdata.data === 'OK modified' ", .ex = "true" }, + }; + try checkCases(js_env, &append_data); } diff --git a/src/netsurf.zig b/src/netsurf.zig index c244c5c3..409f98b0 100644 --- a/src/netsurf.zig +++ b/src/netsurf.zig @@ -475,6 +475,11 @@ pub fn characterDataLength(cdata: *CharacterData) u32 { return n; } +pub fn characterDataAppendData(cdata: *CharacterData, data: []const u8) void { + const s = stringFromData(data); + _ = characterDataVtable(cdata).dom_characterdata_append_data.?(cdata, s); +} + // Text pub const Text = c.dom_text; From be716e591dce72ef60ced2d0349d58559f06b3cc Mon Sep 17 00:00:00 2001 From: Francis Bouvier Date: Mon, 9 Oct 2023 14:29:37 +0200 Subject: [PATCH 07/10] characterdata: add deleteData method Signed-off-by: Francis Bouvier --- src/dom/character_data.zig | 10 ++++++++++ src/netsurf.zig | 4 ++++ 2 files changed, 14 insertions(+) diff --git a/src/dom/character_data.zig b/src/dom/character_data.zig index 10ed9133..dea3f031 100644 --- a/src/dom/character_data.zig +++ b/src/dom/character_data.zig @@ -58,6 +58,10 @@ pub const CharacterData = struct { pub fn _appendData(self: *parser.CharacterData, data: []const u8) void { return parser.characterDataAppendData(self, data); } + + pub fn _deleteData(self: *parser.CharacterData, offset: u32, count: u32) void { + return parser.characterDataDeleteData(self, offset, count); + } }; pub const Types = generate.Tuple(.{ @@ -118,4 +122,10 @@ pub fn testExecFn( .{ .src = "cdata.data === 'OK modified' ", .ex = "true" }, }; try checkCases(js_env, &append_data); + + var delete_data = [_]Case{ + .{ .src = "cdata.deleteData('OK'.length, ' modified'.length)", .ex = "undefined" }, + .{ .src = "cdata.data", .ex = "OK" }, + }; + try checkCases(js_env, &delete_data); } diff --git a/src/netsurf.zig b/src/netsurf.zig index 409f98b0..c4306b07 100644 --- a/src/netsurf.zig +++ b/src/netsurf.zig @@ -480,6 +480,10 @@ pub fn characterDataAppendData(cdata: *CharacterData, data: []const u8) void { _ = characterDataVtable(cdata).dom_characterdata_append_data.?(cdata, s); } +pub fn characterDataDeleteData(cdata: *CharacterData, offset: u32, count: u32) void { + _ = characterDataVtable(cdata).dom_characterdata_delete_data.?(cdata, offset, count); +} + // Text pub const Text = c.dom_text; From 7951498ab5818216d2ace75580f0ff4a7a832f13 Mon Sep 17 00:00:00 2001 From: Francis Bouvier Date: Mon, 9 Oct 2023 14:34:37 +0200 Subject: [PATCH 08/10] characterdata: add insertData method Signed-off-by: Francis Bouvier --- src/dom/character_data.zig | 12 +++++++++++- src/netsurf.zig | 5 +++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/dom/character_data.zig b/src/dom/character_data.zig index dea3f031..ca8c1d7b 100644 --- a/src/dom/character_data.zig +++ b/src/dom/character_data.zig @@ -62,6 +62,10 @@ pub const CharacterData = struct { pub fn _deleteData(self: *parser.CharacterData, offset: u32, count: u32) void { return parser.characterDataDeleteData(self, offset, count); } + + pub fn _insertData(self: *parser.CharacterData, offset: u32, data: []const u8) void { + return parser.characterDataInsertData(self, offset, data); + } }; pub const Types = generate.Tuple(.{ @@ -125,7 +129,13 @@ pub fn testExecFn( var delete_data = [_]Case{ .{ .src = "cdata.deleteData('OK'.length, ' modified'.length)", .ex = "undefined" }, - .{ .src = "cdata.data", .ex = "OK" }, + .{ .src = "cdata.data == 'OK'", .ex = "true" }, }; try checkCases(js_env, &delete_data); + + var insert_data = [_]Case{ + .{ .src = "cdata.insertData('OK'.length-1, 'modified')", .ex = "undefined" }, + .{ .src = "cdata.data == 'OmodifiedK'", .ex = "true" }, + }; + try checkCases(js_env, &insert_data); } diff --git a/src/netsurf.zig b/src/netsurf.zig index c4306b07..a96310b5 100644 --- a/src/netsurf.zig +++ b/src/netsurf.zig @@ -484,6 +484,11 @@ pub fn characterDataDeleteData(cdata: *CharacterData, offset: u32, count: u32) v _ = characterDataVtable(cdata).dom_characterdata_delete_data.?(cdata, offset, count); } +pub fn characterDataInsertData(cdata: *CharacterData, offset: u32, data: []const u8) void { + const s = stringFromData(data); + _ = characterDataVtable(cdata).dom_characterdata_insert_data.?(cdata, offset, s); +} + // Text pub const Text = c.dom_text; From 8438393affaf5f9c2c0237ca32dafac8833f4dd0 Mon Sep 17 00:00:00 2001 From: Francis Bouvier Date: Mon, 9 Oct 2023 14:37:45 +0200 Subject: [PATCH 09/10] characterdata: add replaceData method Signed-off-by: Francis Bouvier --- src/dom/character_data.zig | 10 ++++++++++ src/netsurf.zig | 5 +++++ 2 files changed, 15 insertions(+) diff --git a/src/dom/character_data.zig b/src/dom/character_data.zig index ca8c1d7b..37c3f50b 100644 --- a/src/dom/character_data.zig +++ b/src/dom/character_data.zig @@ -66,6 +66,10 @@ pub const CharacterData = struct { pub fn _insertData(self: *parser.CharacterData, offset: u32, data: []const u8) void { return parser.characterDataInsertData(self, offset, data); } + + pub fn _replaceData(self: *parser.CharacterData, offset: u32, count: u32, data: []const u8) void { + return parser.characterDataReplaceData(self, offset, count, data); + } }; pub const Types = generate.Tuple(.{ @@ -138,4 +142,10 @@ pub fn testExecFn( .{ .src = "cdata.data == 'OmodifiedK'", .ex = "true" }, }; try checkCases(js_env, &insert_data); + + var replace_data = [_]Case{ + .{ .src = "cdata.replaceData('OK'.length-1, 'modified'.length, 'replaced')", .ex = "undefined" }, + .{ .src = "cdata.data == 'OreplacedK'", .ex = "true" }, + }; + try checkCases(js_env, &replace_data); } diff --git a/src/netsurf.zig b/src/netsurf.zig index a96310b5..f12e3d78 100644 --- a/src/netsurf.zig +++ b/src/netsurf.zig @@ -489,6 +489,11 @@ pub fn characterDataInsertData(cdata: *CharacterData, offset: u32, data: []const _ = characterDataVtable(cdata).dom_characterdata_insert_data.?(cdata, offset, s); } +pub fn characterDataReplaceData(cdata: *CharacterData, offset: u32, count: u32, data: []const u8) void { + const s = stringFromData(data); + _ = characterDataVtable(cdata).dom_characterdata_replace_data.?(cdata, offset, count, s); +} + // Text pub const Text = c.dom_text; From 6955285ed5dadd5b82664b4fc2c1be8b7c3dc300 Mon Sep 17 00:00:00 2001 From: Francis Bouvier Date: Mon, 9 Oct 2023 14:42:18 +0200 Subject: [PATCH 10/10] characterdata: add substringData method Signed-off-by: Francis Bouvier --- src/dom/character_data.zig | 10 ++++++++++ src/netsurf.zig | 6 ++++++ 2 files changed, 16 insertions(+) diff --git a/src/dom/character_data.zig b/src/dom/character_data.zig index 37c3f50b..1346a2d4 100644 --- a/src/dom/character_data.zig +++ b/src/dom/character_data.zig @@ -70,6 +70,10 @@ pub const CharacterData = struct { pub fn _replaceData(self: *parser.CharacterData, offset: u32, count: u32, data: []const u8) void { return parser.characterDataReplaceData(self, offset, count, data); } + + pub fn _substringData(self: *parser.CharacterData, offset: u32, count: u32) []const u8 { + return parser.characterDataSubstringData(self, offset, count); + } }; pub const Types = generate.Tuple(.{ @@ -148,4 +152,10 @@ pub fn testExecFn( .{ .src = "cdata.data == 'OreplacedK'", .ex = "true" }, }; try checkCases(js_env, &replace_data); + + var substring_data = [_]Case{ + .{ .src = "cdata.substringData('OK'.length-1, 'replaced'.length) == 'replaced'", .ex = "true" }, + .{ .src = "cdata.substringData('OK'.length-1, 0) == ''", .ex = "true" }, + }; + try checkCases(js_env, &substring_data); } diff --git a/src/netsurf.zig b/src/netsurf.zig index f12e3d78..866346b2 100644 --- a/src/netsurf.zig +++ b/src/netsurf.zig @@ -494,6 +494,12 @@ pub fn characterDataReplaceData(cdata: *CharacterData, offset: u32, count: u32, _ = characterDataVtable(cdata).dom_characterdata_replace_data.?(cdata, offset, count, s); } +pub fn characterDataSubstringData(cdata: *CharacterData, offset: u32, count: u32) []const u8 { + var s: ?*String = undefined; + _ = characterDataVtable(cdata).dom_characterdata_substring_data.?(cdata, offset, count, &s); + return stringToData(s.?); +} + // Text pub const Text = c.dom_text;