From d1f8555c1eba1a370b8b3b9ea7e47ba74ae0d0cd Mon Sep 17 00:00:00 2001 From: Pierre Tachoire Date: Wed, 13 Dec 2023 13:38:24 +0100 Subject: [PATCH] element: implement parenteNode accessors --- src/dom/element.zig | 29 ++++++++++ .../wpt/dom/Element-childElement-null-svg.svg | 20 +++++++ .../dom/Element-childElement-null-xhtml.xhtml | 20 +++++++ tests/wpt/dom/Element-childElement-null.html | 15 +++++ ...ment-childElementCount-dynamic-add-svg.svg | 22 +++++++ ...-childElementCount-dynamic-add-xhtml.xhtml | 22 +++++++ ...Element-childElementCount-dynamic-add.html | 17 ++++++ ...t-childElementCount-dynamic-remove-svg.svg | 22 +++++++ ...ildElementCount-dynamic-remove-xhtml.xhtml | 22 +++++++ ...ment-childElementCount-dynamic-remove.html | 17 ++++++ .../Element-childElementCount-nochild-svg.svg | 19 ++++++ ...ment-childElementCount-nochild-xhtml.xhtml | 19 ++++++ .../Element-childElementCount-nochild.html | 14 +++++ .../wpt/dom/Element-childElementCount-svg.svg | 25 ++++++++ .../dom/Element-childElementCount-xhtml.xhtml | 25 ++++++++ tests/wpt/dom/Element-childElementCount.html | 20 +++++++ tests/wpt/dom/Element-children.html | 58 +++++++++++++++++++ ...ement-firstElementChild-entity-xhtml.xhtml | 27 +++++++++ .../dom/Element-firstElementChild-entity.svg | 26 +++++++++ ...lement-firstElementChild-namespace-svg.svg | 26 +++++++++ ...nt-firstElementChild-namespace-xhtml.xhtml | 28 +++++++++ .../Element-firstElementChild-namespace.html | 21 +++++++ .../wpt/dom/Element-firstElementChild-svg.svg | 23 ++++++++ .../dom/Element-firstElementChild-xhtml.xhtml | 23 ++++++++ tests/wpt/dom/Element-firstElementChild.html | 18 ++++++ .../wpt/dom/Element-lastElementChild-svg.svg | 22 +++++++ .../dom/Element-lastElementChild-xhtml.xhtml | 22 +++++++ tests/wpt/dom/Element-lastElementChild.html | 17 ++++++ 28 files changed, 639 insertions(+) create mode 100644 tests/wpt/dom/Element-childElement-null-svg.svg create mode 100644 tests/wpt/dom/Element-childElement-null-xhtml.xhtml create mode 100644 tests/wpt/dom/Element-childElement-null.html create mode 100644 tests/wpt/dom/Element-childElementCount-dynamic-add-svg.svg create mode 100644 tests/wpt/dom/Element-childElementCount-dynamic-add-xhtml.xhtml create mode 100644 tests/wpt/dom/Element-childElementCount-dynamic-add.html create mode 100644 tests/wpt/dom/Element-childElementCount-dynamic-remove-svg.svg create mode 100644 tests/wpt/dom/Element-childElementCount-dynamic-remove-xhtml.xhtml create mode 100644 tests/wpt/dom/Element-childElementCount-dynamic-remove.html create mode 100644 tests/wpt/dom/Element-childElementCount-nochild-svg.svg create mode 100644 tests/wpt/dom/Element-childElementCount-nochild-xhtml.xhtml create mode 100644 tests/wpt/dom/Element-childElementCount-nochild.html create mode 100644 tests/wpt/dom/Element-childElementCount-svg.svg create mode 100644 tests/wpt/dom/Element-childElementCount-xhtml.xhtml create mode 100644 tests/wpt/dom/Element-childElementCount.html create mode 100644 tests/wpt/dom/Element-children.html create mode 100644 tests/wpt/dom/Element-firstElementChild-entity-xhtml.xhtml create mode 100644 tests/wpt/dom/Element-firstElementChild-entity.svg create mode 100644 tests/wpt/dom/Element-firstElementChild-namespace-svg.svg create mode 100644 tests/wpt/dom/Element-firstElementChild-namespace-xhtml.xhtml create mode 100644 tests/wpt/dom/Element-firstElementChild-namespace.html create mode 100644 tests/wpt/dom/Element-firstElementChild-svg.svg create mode 100644 tests/wpt/dom/Element-firstElementChild-xhtml.xhtml create mode 100644 tests/wpt/dom/Element-firstElementChild.html create mode 100644 tests/wpt/dom/Element-lastElementChild-svg.svg create mode 100644 tests/wpt/dom/Element-lastElementChild-xhtml.xhtml create mode 100644 tests/wpt/dom/Element-lastElementChild.html diff --git a/src/dom/element.zig b/src/dom/element.zig index c696c61f..1a506681 100644 --- a/src/dom/element.zig +++ b/src/dom/element.zig @@ -157,6 +157,26 @@ pub const Element = struct { return try collection.HTMLCollectionChildren(parser.elementToNode(self), false); } + pub fn get_firstElementChild(self: *parser.Element) !?Union { + var children = try get_children(self); + return try children._item(0); + } + + pub fn get_lastElementChild(self: *parser.Element) !?Union { + // TODO we could check the last child node first, if it's an element, + // we can return it directly instead of looping twice over the + // children. + var children = try get_children(self); + const ln = try children.get_length(); + if (ln == 0) return null; + return try children._item(ln - 1); + } + + pub fn get_childElementCount(self: *parser.Element) !u32 { + var children = try get_children(self); + return try children.get_length(); + } + pub fn deinit(_: *parser.Element, _: std.mem.Allocator) void {} }; @@ -228,4 +248,13 @@ pub fn testExecFn( .{ .src = "b.hasAttribute('foo')", .ex = "false" }, }; try checkCases(js_env, &toggleAttr); + + var parentNode = [_]Case{ + .{ .src = "let c = document.getElementById('content')", .ex = "undefined" }, + .{ .src = "c.children.length", .ex = "3" }, + .{ .src = "c.firstElementChild.nodeName", .ex = "A" }, + .{ .src = "c.lastElementChild.nodeName", .ex = "P" }, + .{ .src = "c.childElementCount", .ex = "3" }, + }; + try checkCases(js_env, &parentNode); } diff --git a/tests/wpt/dom/Element-childElement-null-svg.svg b/tests/wpt/dom/Element-childElement-null-svg.svg new file mode 100644 index 00000000..38848287 --- /dev/null +++ b/tests/wpt/dom/Element-childElement-null-svg.svg @@ -0,0 +1,20 @@ + + +Null test + + + +Test of firstElementChild and lastChildElement returning null +Test + + +test(function() { + var parentEl = document.getElementById("parentEl") + assert_equals(parentEl.firstElementChild, null) + assert_equals(parentEl.lastElementChild, null) +}) + + diff --git a/tests/wpt/dom/Element-childElement-null-xhtml.xhtml b/tests/wpt/dom/Element-childElement-null-xhtml.xhtml new file mode 100644 index 00000000..daedab6d --- /dev/null +++ b/tests/wpt/dom/Element-childElement-null-xhtml.xhtml @@ -0,0 +1,20 @@ + + + +Null Test + + + + +

Test of firstElementChild and lastChildElement returning null

+
+

Test.

+ + + diff --git a/tests/wpt/dom/Element-childElement-null.html b/tests/wpt/dom/Element-childElement-null.html new file mode 100644 index 00000000..1863a41d --- /dev/null +++ b/tests/wpt/dom/Element-childElement-null.html @@ -0,0 +1,15 @@ + + +Null test + + +

Test of firstElementChild and lastChildElement returning null

+
+

Test.

+ diff --git a/tests/wpt/dom/Element-childElementCount-dynamic-add-svg.svg b/tests/wpt/dom/Element-childElementCount-dynamic-add-svg.svg new file mode 100644 index 00000000..d149f1ea --- /dev/null +++ b/tests/wpt/dom/Element-childElementCount-dynamic-add-svg.svg @@ -0,0 +1,22 @@ + + +Dynamic Adding of Elements + + + +Test of Dynamic Adding of Elements +The result of this test is +unknown. + + +test(function() { + var parentEl = document.getElementById("parentEl"); + var newChild = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + parentEl.appendChild(newChild); + assert_equals(parentEl.childElementCount, 2) +}) + + diff --git a/tests/wpt/dom/Element-childElementCount-dynamic-add-xhtml.xhtml b/tests/wpt/dom/Element-childElementCount-dynamic-add-xhtml.xhtml new file mode 100644 index 00000000..c97ed196 --- /dev/null +++ b/tests/wpt/dom/Element-childElementCount-dynamic-add-xhtml.xhtml @@ -0,0 +1,22 @@ + + + +Dynamic Adding of Elements + + + + +

Test of Dynamic Adding of Elements

+
+

The result of this test is +logged above.

+ + + diff --git a/tests/wpt/dom/Element-childElementCount-dynamic-add.html b/tests/wpt/dom/Element-childElementCount-dynamic-add.html new file mode 100644 index 00000000..3e7490b2 --- /dev/null +++ b/tests/wpt/dom/Element-childElementCount-dynamic-add.html @@ -0,0 +1,17 @@ + + +Dynamic Adding of Elements + + +

Test of Dynamic Adding of Elements

+
+

The result of this test is +logged above.

+ diff --git a/tests/wpt/dom/Element-childElementCount-dynamic-remove-svg.svg b/tests/wpt/dom/Element-childElementCount-dynamic-remove-svg.svg new file mode 100644 index 00000000..bf99de65 --- /dev/null +++ b/tests/wpt/dom/Element-childElementCount-dynamic-remove-svg.svg @@ -0,0 +1,22 @@ + + +Dynamic Removal of Elements + + + +Test of Dynamic Removal of Elements +The result of this test is +unknown. + + +test(function() { + var parentEl = document.getElementById("parentEl"); + var lec = parentEl.lastElementChild; + parentEl.removeChild(lec); + assert_equals(parentEl.childElementCount, 1) +}) + + diff --git a/tests/wpt/dom/Element-childElementCount-dynamic-remove-xhtml.xhtml b/tests/wpt/dom/Element-childElementCount-dynamic-remove-xhtml.xhtml new file mode 100644 index 00000000..f0009b0a --- /dev/null +++ b/tests/wpt/dom/Element-childElementCount-dynamic-remove-xhtml.xhtml @@ -0,0 +1,22 @@ + + + +Dynamic Removal of Elements + + + + +

Test of Removal Adding of Elements

+
+

The result of this test is +logged above.

+ + + diff --git a/tests/wpt/dom/Element-childElementCount-dynamic-remove.html b/tests/wpt/dom/Element-childElementCount-dynamic-remove.html new file mode 100644 index 00000000..3f7e7c7e --- /dev/null +++ b/tests/wpt/dom/Element-childElementCount-dynamic-remove.html @@ -0,0 +1,17 @@ + + +Dynamic Removal of Elements + + +

Test of Dynamic Removal of Elements

+
+

The result of this test is +unknown.

+ diff --git a/tests/wpt/dom/Element-childElementCount-nochild-svg.svg b/tests/wpt/dom/Element-childElementCount-nochild-svg.svg new file mode 100644 index 00000000..8ba57436 --- /dev/null +++ b/tests/wpt/dom/Element-childElementCount-nochild-svg.svg @@ -0,0 +1,19 @@ + + +childElementCount + + + +Test of childElementCount with No Child Element Nodes +Test + + +test(function() { + var parentEl = document.getElementById("parentEl") + assert_equals(parentEl.childElementCount, 0) +}) + + diff --git a/tests/wpt/dom/Element-childElementCount-nochild-xhtml.xhtml b/tests/wpt/dom/Element-childElementCount-nochild-xhtml.xhtml new file mode 100644 index 00000000..f567a20c --- /dev/null +++ b/tests/wpt/dom/Element-childElementCount-nochild-xhtml.xhtml @@ -0,0 +1,19 @@ + + + +childElementCount without Child Element Nodes + + + + +

Test of childElementCount with No Child Element Nodes

+
+

Test.

+ + + diff --git a/tests/wpt/dom/Element-childElementCount-nochild.html b/tests/wpt/dom/Element-childElementCount-nochild.html new file mode 100644 index 00000000..fb52fb20 --- /dev/null +++ b/tests/wpt/dom/Element-childElementCount-nochild.html @@ -0,0 +1,14 @@ + + +childElementCount without Child Element Nodes + + +

Test of childElementCount with No Child Element Nodes

+
+

Test.

+ diff --git a/tests/wpt/dom/Element-childElementCount-svg.svg b/tests/wpt/dom/Element-childElementCount-svg.svg new file mode 100644 index 00000000..ff93eff6 --- /dev/null +++ b/tests/wpt/dom/Element-childElementCount-svg.svg @@ -0,0 +1,25 @@ + + +childElementCount + + + +Test of childElementCount +The result of this test is +unknown. + + + + + + +test(function() { + var parentEl = document.getElementById("parentEl") + assert_true("childElementCount" in parentEl) + assert_equals(parentEl.childElementCount, 3) +}) + + diff --git a/tests/wpt/dom/Element-childElementCount-xhtml.xhtml b/tests/wpt/dom/Element-childElementCount-xhtml.xhtml new file mode 100644 index 00000000..6b719ff7 --- /dev/null +++ b/tests/wpt/dom/Element-childElementCount-xhtml.xhtml @@ -0,0 +1,25 @@ + + + +childElementCount + + + + +

Test of childElementCount

+
+

The result of this test is +unknown. + + + +

+ + + diff --git a/tests/wpt/dom/Element-childElementCount.html b/tests/wpt/dom/Element-childElementCount.html new file mode 100644 index 00000000..8cfe567f --- /dev/null +++ b/tests/wpt/dom/Element-childElementCount.html @@ -0,0 +1,20 @@ + + +childElementCount + + +

Test of childElementCount

+
+

The result of this test is +given above. + + + +

+ diff --git a/tests/wpt/dom/Element-children.html b/tests/wpt/dom/Element-children.html new file mode 100644 index 00000000..c0210f96 --- /dev/null +++ b/tests/wpt/dom/Element-children.html @@ -0,0 +1,58 @@ + +HTMLCollection edge cases + + +
+
+ diff --git a/tests/wpt/dom/Element-firstElementChild-entity-xhtml.xhtml b/tests/wpt/dom/Element-firstElementChild-entity-xhtml.xhtml new file mode 100644 index 00000000..f28005e9 --- /dev/null +++ b/tests/wpt/dom/Element-firstElementChild-entity-xhtml.xhtml @@ -0,0 +1,27 @@ + +unknown."> +]> + + +Entity References + + + + +

Test of Entity References

+
+

The result of this test is &tree;

+ + + diff --git a/tests/wpt/dom/Element-firstElementChild-entity.svg b/tests/wpt/dom/Element-firstElementChild-entity.svg new file mode 100644 index 00000000..3a20ea79 --- /dev/null +++ b/tests/wpt/dom/Element-firstElementChild-entity.svg @@ -0,0 +1,26 @@ + +unknown."> +]> + +Entity References + + + +Test of Entity References +The result of this test is &tree; + + +test(function() { + var parentEl = document.getElementById("parentEl") + var fec = parentEl.firstElementChild; + assert_true(!!fec) + assert_equals(fec.nodeType, 1) + assert_equals(fec.getAttribute("id"), "first_element_child") +}) + + diff --git a/tests/wpt/dom/Element-firstElementChild-namespace-svg.svg b/tests/wpt/dom/Element-firstElementChild-namespace-svg.svg new file mode 100644 index 00000000..d42c0877 --- /dev/null +++ b/tests/wpt/dom/Element-firstElementChild-namespace-svg.svg @@ -0,0 +1,26 @@ + + +firstElementChild with namespaces + + + +Test of firstElementChild with namespaces + + + + + +test(function() { + var parentEl = document.getElementById("parentEl"); + var fec = parentEl.firstElementChild; + assert_true(!!fec) + assert_equals(fec.nodeType, 1) + assert_equals(fec.getAttribute("id"), "first_element_child") + assert_equals(fec.localName, "dill") +}) + + diff --git a/tests/wpt/dom/Element-firstElementChild-namespace-xhtml.xhtml b/tests/wpt/dom/Element-firstElementChild-namespace-xhtml.xhtml new file mode 100644 index 00000000..29441d27 --- /dev/null +++ b/tests/wpt/dom/Element-firstElementChild-namespace-xhtml.xhtml @@ -0,0 +1,28 @@ + + + +firstElementChild with namespaces + + + + +

Test of firstElementChild with namespaces

+
+ +
+
+

The result of this test is +logged above.

+ + + diff --git a/tests/wpt/dom/Element-firstElementChild-namespace.html b/tests/wpt/dom/Element-firstElementChild-namespace.html new file mode 100644 index 00000000..629deab3 --- /dev/null +++ b/tests/wpt/dom/Element-firstElementChild-namespace.html @@ -0,0 +1,21 @@ + + +firstElementChild with namespaces + + +

Test of firstElementChild with namespaces

+
+

The result of this test is a unknown.

+ diff --git a/tests/wpt/dom/Element-firstElementChild-svg.svg b/tests/wpt/dom/Element-firstElementChild-svg.svg new file mode 100644 index 00000000..359c5b82 --- /dev/null +++ b/tests/wpt/dom/Element-firstElementChild-svg.svg @@ -0,0 +1,23 @@ + + +firstElementChild + + + +Test of firstElementChild +The result of this test is +unknown. + + +test(function() { + var parentEl = document.getElementById("parentEl"); + var fec = parentEl.firstElementChild; + assert_true(!!fec) + assert_equals(fec.nodeType, 1) + assert_equals(fec.getAttribute("id"), "first_element_child") +}) + + diff --git a/tests/wpt/dom/Element-firstElementChild-xhtml.xhtml b/tests/wpt/dom/Element-firstElementChild-xhtml.xhtml new file mode 100644 index 00000000..302052b0 --- /dev/null +++ b/tests/wpt/dom/Element-firstElementChild-xhtml.xhtml @@ -0,0 +1,23 @@ + + + +firstElementChild + + + + +

Test of firstElementChild

+
+

The result of this test is +logged above.

+ + + diff --git a/tests/wpt/dom/Element-firstElementChild.html b/tests/wpt/dom/Element-firstElementChild.html new file mode 100644 index 00000000..12a0c594 --- /dev/null +++ b/tests/wpt/dom/Element-firstElementChild.html @@ -0,0 +1,18 @@ + + +firstElementChild + + +

Test of firstElementChild

+
+

The result of this test is +logged above.

+ diff --git a/tests/wpt/dom/Element-lastElementChild-svg.svg b/tests/wpt/dom/Element-lastElementChild-svg.svg new file mode 100644 index 00000000..1cec4a13 --- /dev/null +++ b/tests/wpt/dom/Element-lastElementChild-svg.svg @@ -0,0 +1,22 @@ + + +lastElementChild + + + +Test of lastElementChild +The result of this test is not known. + + +test(function() { + var parentEl = document.getElementById("parentEl"); + var lec = parentEl.lastElementChild; + assert_true(!!lec) + assert_equals(lec.nodeType, 1) + assert_equals(lec.getAttribute("id"), "last_element_child") +}) + + diff --git a/tests/wpt/dom/Element-lastElementChild-xhtml.xhtml b/tests/wpt/dom/Element-lastElementChild-xhtml.xhtml new file mode 100644 index 00000000..3150b92a --- /dev/null +++ b/tests/wpt/dom/Element-lastElementChild-xhtml.xhtml @@ -0,0 +1,22 @@ + + + +firstElementChild + + + + +

Test of firstElementChild

+
+

The result of this test is logged above.

+ + + diff --git a/tests/wpt/dom/Element-lastElementChild.html b/tests/wpt/dom/Element-lastElementChild.html new file mode 100644 index 00000000..de7aebdf --- /dev/null +++ b/tests/wpt/dom/Element-lastElementChild.html @@ -0,0 +1,17 @@ + + +lastElementChild + + +

Test of lastElementChild

+
+

The result of this test is logged above.

+