From 7fc6f290e7fb13ced69dc5faeb7741e74adb6fa1 Mon Sep 17 00:00:00 2001 From: Francis Bouvier Date: Tue, 26 Sep 2023 16:23:11 +0200 Subject: [PATCH 01/17] node: add cloneNode method Signed-off-by: Francis Bouvier --- src/dom/node.zig | 16 ++++++++++++++++ src/netsurf.zig | 6 ++++++ 2 files changed, 22 insertions(+) diff --git a/src/dom/node.zig b/src/dom/node.zig index 0a08680a..60f88a1e 100644 --- a/src/dom/node.zig +++ b/src/dom/node.zig @@ -129,6 +129,12 @@ pub const Node = struct { const res = parser.nodeAppendChild(self, child); return Node.toInterface(res); } + + pub fn _cloneNode(self: *parser.Node, deep: ?bool) Union { + const is_deep = if (deep) |deep_set| deep_set else false; + const clone = parser.nodeCloneNode(self, is_deep); + return Node.toInterface(clone); + } }; pub const Types = generate.Tuple(.{ @@ -253,4 +259,14 @@ pub fn testExecFn( .{ .src = "content.appendChild(link).toString()", .ex = "[object HTMLAnchorElement]" }, }; try checkCases(js_env, &node_append_child); + + var node_clone = [_]Case{ + .{ .src = "let clone = link.cloneNode()", .ex = "undefined" }, + .{ .src = "clone.toString()", .ex = "[object HTMLAnchorElement]" }, + .{ .src = "clone.parentNode === null", .ex = "true" }, + .{ .src = "clone.firstChild === null", .ex = "true" }, + .{ .src = "let clone_deep = link.cloneNode(true)", .ex = "undefined" }, + .{ .src = "clone_deep.firstChild.nodeName === '#text'", .ex = "true" }, + }; + try checkCases(js_env, &node_clone); } diff --git a/src/netsurf.zig b/src/netsurf.zig index 423b5733..705c47b9 100644 --- a/src/netsurf.zig +++ b/src/netsurf.zig @@ -340,6 +340,12 @@ pub fn nodeAppendChild(node: *Node, child: *Node) *Node { return res.?; } +pub fn nodeCloneNode(node: *Node, is_deep: bool) *Node { + var res: ?*Node = undefined; + _ = nodeVtable(node).dom_node_clone_node.?(node, is_deep, &res); + return res.?; +} + // CharacterData pub const CharacterData = c.dom_characterdata; From a0751e07e3d2185021df69940cab48c6f9f73407 Mon Sep 17 00:00:00 2001 From: Francis Bouvier Date: Tue, 26 Sep 2023 17:16:39 +0200 Subject: [PATCH 02/17] node: add compareDocumentPosition method (NOT IMPLEMENTED) Signed-off-by: Francis Bouvier --- src/dom/node.zig | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/dom/node.zig b/src/dom/node.zig index 60f88a1e..c2b65100 100644 --- a/src/dom/node.zig +++ b/src/dom/node.zig @@ -135,6 +135,12 @@ pub const Node = struct { const clone = parser.nodeCloneNode(self, is_deep); return Node.toInterface(clone); } + + pub fn _compareDocumentPosition(self: *parser.Node, other: *parser.Node) void { + _ = other; + _ = self; + @panic("Not implemented node.compareDocumentPosition()"); + } }; pub const Types = generate.Tuple(.{ From 70a66a95dadb16e9d07a5cdbc3d5521c7cd5d347 Mon Sep 17 00:00:00 2001 From: Francis Bouvier Date: Tue, 26 Sep 2023 17:32:13 +0200 Subject: [PATCH 03/17] node: add contains method Signed-off-by: Francis Bouvier --- src/dom/node.zig | 10 ++++++++++ src/netsurf.zig | 6 ++++++ 2 files changed, 16 insertions(+) diff --git a/src/dom/node.zig b/src/dom/node.zig index c2b65100..6a7e92b7 100644 --- a/src/dom/node.zig +++ b/src/dom/node.zig @@ -141,6 +141,10 @@ pub const Node = struct { _ = self; @panic("Not implemented node.compareDocumentPosition()"); } + + pub fn _contains(self: *parser.Node, other: *parser.Node) bool { + return parser.nodeContains(self, other); + } }; pub const Types = generate.Tuple(.{ @@ -275,4 +279,10 @@ pub fn testExecFn( .{ .src = "clone_deep.firstChild.nodeName === '#text'", .ex = "true" }, }; try checkCases(js_env, &node_clone); + + var node_contains = [_]Case{ + .{ .src = "link.contains(text)", .ex = "true" }, + .{ .src = "text.contains(link)", .ex = "false" }, + }; + try checkCases(js_env, &node_contains); } diff --git a/src/netsurf.zig b/src/netsurf.zig index 705c47b9..320cbf32 100644 --- a/src/netsurf.zig +++ b/src/netsurf.zig @@ -346,6 +346,12 @@ pub fn nodeCloneNode(node: *Node, is_deep: bool) *Node { return res.?; } +pub fn nodeContains(node: *Node, other: *Node) bool { + var res: bool = undefined; + _ = c._dom_node_contains(node, other, &res); + return res; +} + // CharacterData pub const CharacterData = c.dom_characterdata; From 97b2435a13f251bbd53f1b93d0a07d0f05ad9e41 Mon Sep 17 00:00:00 2001 From: Francis Bouvier Date: Tue, 26 Sep 2023 17:43:44 +0200 Subject: [PATCH 04/17] node: add getRootnode method (NOT IMPLEMENTED) Signed-off-by: Francis Bouvier --- src/dom/node.zig | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/dom/node.zig b/src/dom/node.zig index 6a7e92b7..8c142164 100644 --- a/src/dom/node.zig +++ b/src/dom/node.zig @@ -145,6 +145,11 @@ pub const Node = struct { pub fn _contains(self: *parser.Node, other: *parser.Node) bool { return parser.nodeContains(self, other); } + + pub fn _getRootNode(self: *parser.Node) void { + _ = self; + @panic("Not implemented node.getRootNode()"); + } }; pub const Types = generate.Tuple(.{ From 1e352c48accdb54775b4a31306cc0ec4f451aff4 Mon Sep 17 00:00:00 2001 From: Francis Bouvier Date: Tue, 26 Sep 2023 17:55:21 +0200 Subject: [PATCH 05/17] node: add hasChildnodes method Signed-off-by: Francis Bouvier --- src/dom/node.zig | 10 ++++++++++ src/netsurf.zig | 6 ++++++ 2 files changed, 16 insertions(+) diff --git a/src/dom/node.zig b/src/dom/node.zig index 8c142164..444a505b 100644 --- a/src/dom/node.zig +++ b/src/dom/node.zig @@ -150,6 +150,10 @@ pub const Node = struct { _ = self; @panic("Not implemented node.getRootNode()"); } + + pub fn _hasChildNodes(self: *parser.Node) bool { + return parser.nodeHasChildNodes(self); + } }; pub const Types = generate.Tuple(.{ @@ -290,4 +294,10 @@ pub fn testExecFn( .{ .src = "text.contains(link)", .ex = "false" }, }; try checkCases(js_env, &node_contains); + + var node_has_child_nodes = [_]Case{ + .{ .src = "link.hasChildNodes()", .ex = "true" }, + .{ .src = "text.hasChildNodes()", .ex = "false" }, + }; + try checkCases(js_env, &node_has_child_nodes); } diff --git a/src/netsurf.zig b/src/netsurf.zig index 320cbf32..f0677554 100644 --- a/src/netsurf.zig +++ b/src/netsurf.zig @@ -352,6 +352,12 @@ pub fn nodeContains(node: *Node, other: *Node) bool { return res; } +pub fn nodeHasChildNodes(node: *Node) bool { + var res: bool = undefined; + _ = nodeVtable(node).dom_node_has_child_nodes.?(node, &res); + return res; +} + // CharacterData pub const CharacterData = c.dom_characterdata; From f3a99af670ea6bfe0dc9fc32968d5d19e60c7f36 Mon Sep 17 00:00:00 2001 From: Francis Bouvier Date: Tue, 26 Sep 2023 21:20:54 +0200 Subject: [PATCH 06/17] node: add insertBefore method Signed-off-by: Francis Bouvier --- src/dom/node.zig | 11 +++++++++++ src/netsurf.zig | 6 ++++++ 2 files changed, 17 insertions(+) diff --git a/src/dom/node.zig b/src/dom/node.zig index 444a505b..26e971e8 100644 --- a/src/dom/node.zig +++ b/src/dom/node.zig @@ -154,6 +154,10 @@ pub const Node = struct { pub fn _hasChildNodes(self: *parser.Node) bool { return parser.nodeHasChildNodes(self); } + + pub fn _insertBefore(self: *parser.Node, new_node: *parser.Node, ref_node: *parser.Node) *parser.Node { + return parser.nodeInsertBefore(self, new_node, ref_node); + } }; pub const Types = generate.Tuple(.{ @@ -300,4 +304,11 @@ pub fn testExecFn( .{ .src = "text.hasChildNodes()", .ex = "false" }, }; try checkCases(js_env, &node_has_child_nodes); + + var node_insert_before = [_]Case{ + .{ .src = "let insertBefore = document.createElement('a')", .ex = "undefined" }, + .{ .src = "link.insertBefore(insertBefore, text) !== undefined", .ex = "true" }, + .{ .src = "link.firstChild.localName === 'a'", .ex = "true" }, + }; + try checkCases(js_env, &node_insert_before); } diff --git a/src/netsurf.zig b/src/netsurf.zig index f0677554..9e9a3070 100644 --- a/src/netsurf.zig +++ b/src/netsurf.zig @@ -358,6 +358,12 @@ pub fn nodeHasChildNodes(node: *Node) bool { return res; } +pub fn nodeInsertBefore(node: *Node, new_node: *Node, ref_node: *Node) *Node { + var res: ?*Node = undefined; + _ = nodeVtable(node).dom_node_insert_before.?(node, new_node, ref_node, &res); + return res.?; +} + // CharacterData pub const CharacterData = c.dom_characterdata; From a07d9829ded122e9d46879aadb714b5568d2ae8f Mon Sep 17 00:00:00 2001 From: Francis Bouvier Date: Tue, 26 Sep 2023 21:34:46 +0200 Subject: [PATCH 07/17] node: add isDefaultnamespace (TEST NOT WORKING) Signed-off-by: Francis Bouvier --- src/dom/node.zig | 12 ++++++++++++ src/netsurf.zig | 7 +++++++ 2 files changed, 19 insertions(+) diff --git a/src/dom/node.zig b/src/dom/node.zig index 26e971e8..9430c2e9 100644 --- a/src/dom/node.zig +++ b/src/dom/node.zig @@ -158,6 +158,11 @@ pub const Node = struct { pub fn _insertBefore(self: *parser.Node, new_node: *parser.Node, ref_node: *parser.Node) *parser.Node { return parser.nodeInsertBefore(self, new_node, ref_node); } + + pub fn _isDefaultNamespace(self: *parser.Node, namespace: []const u8) bool { + // TODO: namespace is not an optional parameter, but can be null. + return parser.nodeIsDefaultNamespace(self, namespace); + } }; pub const Types = generate.Tuple(.{ @@ -311,4 +316,11 @@ pub fn testExecFn( .{ .src = "link.firstChild.localName === 'a'", .ex = "true" }, }; try checkCases(js_env, &node_insert_before); + + var node_is_default_namespace = [_]Case{ + // TODO: does not seems to work + // .{ .src = "link.isDefaultNamespace('')", .ex = "true" }, + .{ .src = "link.isDefaultNamespace('false')", .ex = "false" }, + }; + try checkCases(js_env, &node_is_default_namespace); } diff --git a/src/netsurf.zig b/src/netsurf.zig index 9e9a3070..4b110337 100644 --- a/src/netsurf.zig +++ b/src/netsurf.zig @@ -364,6 +364,13 @@ pub fn nodeInsertBefore(node: *Node, new_node: *Node, ref_node: *Node) *Node { return res.?; } +pub fn nodeIsDefaultNamespace(node: *Node, namespace: []const u8) bool { + const s = stringFromData(namespace); + var res: bool = undefined; + _ = nodeVtable(node).dom_node_is_default_namespace.?(node, s, &res); + return res; +} + // CharacterData pub const CharacterData = c.dom_characterdata; From 012622fc5ff8ba3270837797f9fb1cf3062ff240 Mon Sep 17 00:00:00 2001 From: Francis Bouvier Date: Tue, 26 Sep 2023 21:41:09 +0200 Subject: [PATCH 08/17] node: add isEqualNode method (TEST NOT WORKING) Signed-off-by: Francis Bouvier --- src/dom/node.zig | 15 +++++++++++++++ src/netsurf.zig | 6 ++++++ 2 files changed, 21 insertions(+) diff --git a/src/dom/node.zig b/src/dom/node.zig index 9430c2e9..15976b73 100644 --- a/src/dom/node.zig +++ b/src/dom/node.zig @@ -163,6 +163,11 @@ pub const Node = struct { // TODO: namespace is not an optional parameter, but can be null. return parser.nodeIsDefaultNamespace(self, namespace); } + + pub fn _isEqualNode(self: *parser.Node, other: *parser.Node) bool { + // TODO: other is not an optional parameter, but can be null. + return parser.nodeIsEqualNode(self, other); + } }; pub const Types = generate.Tuple(.{ @@ -323,4 +328,14 @@ pub fn testExecFn( .{ .src = "link.isDefaultNamespace('false')", .ex = "false" }, }; try checkCases(js_env, &node_is_default_namespace); + + var node_is_equal_node = [_]Case{ + .{ .src = "let equal1 = document.createElement('a')", .ex = "undefined" }, + .{ .src = "let equal2 = document.createElement('a')", .ex = "undefined" }, + .{ .src = "equal1.textContent = 'is equal'", .ex = "is equal" }, + .{ .src = "equal2.textContent = 'is equal'", .ex = "is equal" }, + // TODO: does not seems to work + // .{ .src = "equal1.isEqualNode(equal2)", .ex = "true" }, + }; + try checkCases(js_env, &node_is_equal_node); } diff --git a/src/netsurf.zig b/src/netsurf.zig index 4b110337..201c8990 100644 --- a/src/netsurf.zig +++ b/src/netsurf.zig @@ -371,6 +371,12 @@ pub fn nodeIsDefaultNamespace(node: *Node, namespace: []const u8) bool { return res; } +pub fn nodeIsEqualNode(node: *Node, other: *Node) bool { + var res: bool = undefined; + _ = nodeVtable(node).dom_node_is_equal.?(node, other, &res); + return res; +} + // CharacterData pub const CharacterData = c.dom_characterdata; From 08ded87e0272d80efb7a3c60006cef26399d7e0c Mon Sep 17 00:00:00 2001 From: Francis Bouvier Date: Wed, 27 Sep 2023 11:08:37 +0200 Subject: [PATCH 09/17] node: add removechild method Signed-off-by: Francis Bouvier --- src/dom/node.zig | 11 +++++++++++ src/netsurf.zig | 6 ++++++ 2 files changed, 17 insertions(+) diff --git a/src/dom/node.zig b/src/dom/node.zig index 15976b73..1876709b 100644 --- a/src/dom/node.zig +++ b/src/dom/node.zig @@ -168,6 +168,11 @@ pub const Node = struct { // TODO: other is not an optional parameter, but can be null. return parser.nodeIsEqualNode(self, other); } + + pub fn _removeChild(self: *parser.Node, child: *parser.Node) Union { + const res = parser.nodeRemoveChild(self, child); + return Node.toInterface(res); + } }; pub const Types = generate.Tuple(.{ @@ -338,4 +343,10 @@ pub fn testExecFn( // .{ .src = "equal1.isEqualNode(equal2)", .ex = "true" }, }; try checkCases(js_env, &node_is_equal_node); + + var node_remove_child = [_]Case{ + .{ .src = "content.removeChild(append) !== undefined", .ex = "true" }, + .{ .src = "content.lastChild.__proto__.constructor.name !== 'HTMLHeadingElement'", .ex = "true" }, + }; + try checkCases(js_env, &node_remove_child); } diff --git a/src/netsurf.zig b/src/netsurf.zig index 201c8990..e153984f 100644 --- a/src/netsurf.zig +++ b/src/netsurf.zig @@ -377,6 +377,12 @@ pub fn nodeIsEqualNode(node: *Node, other: *Node) bool { return res; } +pub fn nodeRemoveChild(node: *Node, child: *Node) *Node { + var res: ?*Node = undefined; + _ = nodeVtable(node).dom_node_remove_child.?(node, child, &res); + return res.?; +} + // CharacterData pub const CharacterData = c.dom_characterdata; From 2e3d1220f6e622e66962d7456612a33b6b704f8e Mon Sep 17 00:00:00 2001 From: Francis Bouvier Date: Wed, 27 Sep 2023 11:13:53 +0200 Subject: [PATCH 10/17] node: add replaceChild method Signed-off-by: Francis Bouvier --- src/dom/node.zig | 11 +++++++++++ src/netsurf.zig | 6 ++++++ 2 files changed, 17 insertions(+) diff --git a/src/dom/node.zig b/src/dom/node.zig index 1876709b..4a85e23a 100644 --- a/src/dom/node.zig +++ b/src/dom/node.zig @@ -173,6 +173,11 @@ pub const Node = struct { const res = parser.nodeRemoveChild(self, child); return Node.toInterface(res); } + + pub fn _replaceChild(self: *parser.Node, new_child: *parser.Node, old_child: *parser.Node) Union { + const res = parser.nodeReplaceChild(self, new_child, old_child); + return Node.toInterface(res); + } }; pub const Types = generate.Tuple(.{ @@ -349,4 +354,10 @@ pub fn testExecFn( .{ .src = "content.lastChild.__proto__.constructor.name !== 'HTMLHeadingElement'", .ex = "true" }, }; try checkCases(js_env, &node_remove_child); + + var node_replace_child = [_]Case{ + .{ .src = "let replace = document.createElement('div')", .ex = "undefined" }, + .{ .src = "link.replaceChild(replace, insertBefore) !== undefined", .ex = "true" }, + }; + try checkCases(js_env, &node_replace_child); } diff --git a/src/netsurf.zig b/src/netsurf.zig index e153984f..0e353998 100644 --- a/src/netsurf.zig +++ b/src/netsurf.zig @@ -383,6 +383,12 @@ pub fn nodeRemoveChild(node: *Node, child: *Node) *Node { return res.?; } +pub fn nodeReplaceChild(node: *Node, new_child: *Node, old_child: *Node) *Node { + var res: ?*Node = undefined; + _ = nodeVtable(node).dom_node_replace_child.?(node, new_child, old_child, &res); + return res.?; +} + // CharacterData pub const CharacterData = c.dom_characterdata; From 9b544db2a906a46775b6bc288f72828d5bb6bb1f Mon Sep 17 00:00:00 2001 From: Francis Bouvier Date: Wed, 27 Sep 2023 14:55:36 +0200 Subject: [PATCH 11/17] node: add normalize method (NO TEST) Signed-off-by: Francis Bouvier --- src/dom/node.zig | 10 ++++++++++ src/netsurf.zig | 4 ++++ 2 files changed, 14 insertions(+) diff --git a/src/dom/node.zig b/src/dom/node.zig index 4a85e23a..c64ae630 100644 --- a/src/dom/node.zig +++ b/src/dom/node.zig @@ -169,6 +169,10 @@ pub const Node = struct { return parser.nodeIsEqualNode(self, other); } + pub fn _normalize(self: *parser.Node) void { + return parser.nodeNormalize(self); + } + pub fn _removeChild(self: *parser.Node, child: *parser.Node) Union { const res = parser.nodeRemoveChild(self, child); return Node.toInterface(res); @@ -349,6 +353,12 @@ pub fn testExecFn( }; try checkCases(js_env, &node_is_equal_node); + var node_normalize = [_]Case{ + // TODO: no test + .{ .src = "link.normalize()", .ex = "undefined" }, + }; + try checkCases(js_env, &node_normalize); + var node_remove_child = [_]Case{ .{ .src = "content.removeChild(append) !== undefined", .ex = "true" }, .{ .src = "content.lastChild.__proto__.constructor.name !== 'HTMLHeadingElement'", .ex = "true" }, diff --git a/src/netsurf.zig b/src/netsurf.zig index 0e353998..d78474eb 100644 --- a/src/netsurf.zig +++ b/src/netsurf.zig @@ -377,6 +377,10 @@ pub fn nodeIsEqualNode(node: *Node, other: *Node) bool { return res; } +pub fn nodeNormalize(node: *Node) void { + _ = nodeVtable(node).dom_node_normalize.?(node); +} + pub fn nodeRemoveChild(node: *Node, child: *Node) *Node { var res: ?*Node = undefined; _ = nodeVtable(node).dom_node_remove_child.?(node, child, &res); From 24dc25391e0e82ed2896cc8f761b6dcac865a128 Mon Sep 17 00:00:00 2001 From: Francis Bouvier Date: Thu, 28 Sep 2023 17:49:07 +0200 Subject: [PATCH 12/17] node: add isSameNode method Signed-off-by: Francis Bouvier --- src/dom/node.zig | 11 +++++++++++ src/netsurf.zig | 6 ++++++ 2 files changed, 17 insertions(+) diff --git a/src/dom/node.zig b/src/dom/node.zig index c64ae630..1ff19242 100644 --- a/src/dom/node.zig +++ b/src/dom/node.zig @@ -169,6 +169,12 @@ pub const Node = struct { return parser.nodeIsEqualNode(self, other); } + pub fn _isSameNode(self: *parser.Node, other: *parser.Node) bool { + // TODO: other is not an optional parameter, but can be null. + // NOTE: there is no need to use isSameNode(); instead use the === strict equality operator + return parser.nodeIsSameNode(self, other); + } + pub fn _normalize(self: *parser.Node) void { return parser.nodeNormalize(self); } @@ -353,6 +359,11 @@ pub fn testExecFn( }; try checkCases(js_env, &node_is_equal_node); + var node_is_same_node = [_]Case{ + .{ .src = "document.body.isSameNode(document.body)", .ex = "true" }, + }; + try checkCases(js_env, &node_is_same_node); + var node_normalize = [_]Case{ // TODO: no test .{ .src = "link.normalize()", .ex = "undefined" }, diff --git a/src/netsurf.zig b/src/netsurf.zig index d78474eb..422476b3 100644 --- a/src/netsurf.zig +++ b/src/netsurf.zig @@ -377,6 +377,12 @@ pub fn nodeIsEqualNode(node: *Node, other: *Node) bool { return res; } +pub fn nodeIsSameNode(node: *Node, other: *Node) bool { + var res: bool = undefined; + _ = nodeVtable(node).dom_node_is_same.?(node, other, &res); + return res; +} + pub fn nodeNormalize(node: *Node) void { _ = nodeVtable(node).dom_node_normalize.?(node); } From 8c0279bd1bc96305e2ba0675693de334d0471ee5 Mon Sep 17 00:00:00 2001 From: Francis Bouvier Date: Thu, 28 Sep 2023 18:17:04 +0200 Subject: [PATCH 13/17] node: add lookupPrefix method (NOT TESTED) Signed-off-by: Francis Bouvier --- src/dom/node.zig | 5 +++++ src/netsurf.zig | 15 +++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/dom/node.zig b/src/dom/node.zig index 1ff19242..904119e0 100644 --- a/src/dom/node.zig +++ b/src/dom/node.zig @@ -175,6 +175,11 @@ pub const Node = struct { return parser.nodeIsSameNode(self, other); } + pub fn _lookupPrefix(self: *parser.Node, namespace: ?[]const u8) ?[]const u8 { + // TODO: other is not an optional parameter, but can be null. + return parser.nodeLookupPrefix(self, namespace); + } + pub fn _normalize(self: *parser.Node) void { return parser.nodeNormalize(self); } diff --git a/src/netsurf.zig b/src/netsurf.zig index 422476b3..6bf5ea54 100644 --- a/src/netsurf.zig +++ b/src/netsurf.zig @@ -383,6 +383,21 @@ pub fn nodeIsSameNode(node: *Node, other: *Node) bool { return res; } +pub fn nodeLookupPrefix(node: *Node, namespace: ?[]const u8) ?[]const u8 { + if (namespace == null) { + return null; + } + if (std.mem.eql(u8, namespace.?, "")) { + return null; + } + var s: ?*String = undefined; + _ = nodeVtable(node).dom_node_lookup_prefix.?(node, stringFromData(namespace.?), &s); + if (s == null) { + return null; + } + return stringToData(s.?); +} + pub fn nodeNormalize(node: *Node) void { _ = nodeVtable(node).dom_node_normalize.?(node); } From 09ddfd2a09be1741becb9d8ff644d6cb5e650903 Mon Sep 17 00:00:00 2001 From: Francis Bouvier Date: Thu, 28 Sep 2023 18:22:39 +0200 Subject: [PATCH 14/17] node: add lookupNamespaceURI method (NOT TESTED) Signed-off-by: Francis Bouvier --- src/dom/node.zig | 5 +++++ src/netsurf.zig | 9 +++++++++ 2 files changed, 14 insertions(+) diff --git a/src/dom/node.zig b/src/dom/node.zig index 904119e0..3d3ea43c 100644 --- a/src/dom/node.zig +++ b/src/dom/node.zig @@ -180,6 +180,11 @@ pub const Node = struct { return parser.nodeLookupPrefix(self, namespace); } + pub fn _lookupNamespaceURI(self: *parser.Node, prefix: ?[]const u8) ?[]const u8 { + // TODO: other is not an optional parameter, but can be null. + return parser.nodeLookupNamespaceURI(self, prefix); + } + pub fn _normalize(self: *parser.Node) void { return parser.nodeNormalize(self); } diff --git a/src/netsurf.zig b/src/netsurf.zig index 6bf5ea54..4cf6184b 100644 --- a/src/netsurf.zig +++ b/src/netsurf.zig @@ -398,6 +398,15 @@ pub fn nodeLookupPrefix(node: *Node, namespace: ?[]const u8) ?[]const u8 { return stringToData(s.?); } +pub fn nodeLookupNamespaceURI(node: *Node, prefix: ?[]const u8) ?[]const u8 { + var s: ?*String = undefined; + _ = nodeVtable(node).dom_node_lookup_namespace.?(node, stringFromData(prefix.?), &s); + if (s == null) { + return null; + } + return stringToData(s.?); +} + pub fn nodeNormalize(node: *Node) void { _ = nodeVtable(node).dom_node_normalize.?(node); } From e59309e392e726510d04021876f5693b949833fb Mon Sep 17 00:00:00 2001 From: Francis Bouvier Date: Fri, 29 Sep 2023 13:38:07 +0200 Subject: [PATCH 15/17] Replace panic by std.log.err for NOT IMPLEMENTED Signed-off-by: Francis Bouvier --- src/dom/node.zig | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/dom/node.zig b/src/dom/node.zig index 3d3ea43c..7e26c032 100644 --- a/src/dom/node.zig +++ b/src/dom/node.zig @@ -137,9 +137,10 @@ pub const Node = struct { } pub fn _compareDocumentPosition(self: *parser.Node, other: *parser.Node) void { + // TODO _ = other; _ = self; - @panic("Not implemented node.compareDocumentPosition()"); + std.log.err("Not implemented {s}", .{"node.compareDocumentPosition()"}); } pub fn _contains(self: *parser.Node, other: *parser.Node) bool { @@ -147,8 +148,9 @@ pub const Node = struct { } pub fn _getRootNode(self: *parser.Node) void { + // TODO _ = self; - @panic("Not implemented node.getRootNode()"); + std.log.err("Not implemented {s}", .{"node.getRootNode()"}); } pub fn _hasChildNodes(self: *parser.Node) bool { From bbcd9d8dcf955171f4c70c5a56c67ada6d052336 Mon Sep 17 00:00:00 2001 From: Francis Bouvier Date: Fri, 29 Sep 2023 13:39:41 +0200 Subject: [PATCH 16/17] Use orelse Signed-off-by: Francis Bouvier --- src/dom/node.zig | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/dom/node.zig b/src/dom/node.zig index 7e26c032..533f5b92 100644 --- a/src/dom/node.zig +++ b/src/dom/node.zig @@ -131,8 +131,7 @@ pub const Node = struct { } pub fn _cloneNode(self: *parser.Node, deep: ?bool) Union { - const is_deep = if (deep) |deep_set| deep_set else false; - const clone = parser.nodeCloneNode(self, is_deep); + const clone = parser.nodeCloneNode(self, deep orelse false); return Node.toInterface(clone); } From 4de6ad02f5d706a19ca10f81ab4ab861f71e7201 Mon Sep 17 00:00:00 2001 From: Francis Bouvier Date: Fri, 29 Sep 2023 13:42:39 +0200 Subject: [PATCH 17/17] node: move arg check in API declaration for nodeLookupPrefix method Signed-off-by: Francis Bouvier --- src/dom/node.zig | 6 ++++++ src/netsurf.zig | 10 ++-------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/dom/node.zig b/src/dom/node.zig index 533f5b92..1ddb9982 100644 --- a/src/dom/node.zig +++ b/src/dom/node.zig @@ -178,6 +178,12 @@ pub const Node = struct { pub fn _lookupPrefix(self: *parser.Node, namespace: ?[]const u8) ?[]const u8 { // TODO: other is not an optional parameter, but can be null. + if (namespace == null) { + return null; + } + if (std.mem.eql(u8, namespace.?, "")) { + return null; + } return parser.nodeLookupPrefix(self, namespace); } diff --git a/src/netsurf.zig b/src/netsurf.zig index 4cf6184b..7ee98dfc 100644 --- a/src/netsurf.zig +++ b/src/netsurf.zig @@ -383,15 +383,9 @@ pub fn nodeIsSameNode(node: *Node, other: *Node) bool { return res; } -pub fn nodeLookupPrefix(node: *Node, namespace: ?[]const u8) ?[]const u8 { - if (namespace == null) { - return null; - } - if (std.mem.eql(u8, namespace.?, "")) { - return null; - } +pub fn nodeLookupPrefix(node: *Node, namespace: []const u8) ?[]const u8 { var s: ?*String = undefined; - _ = nodeVtable(node).dom_node_lookup_prefix.?(node, stringFromData(namespace.?), &s); + _ = nodeVtable(node).dom_node_lookup_prefix.?(node, stringFromData(namespace), &s); if (s == null) { return null; }