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 @@ + + 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 @@ + + +
+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 @@ + + +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 @@ + + 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 @@ + + + +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 @@ + + +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 @@ + + 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 @@ + + + +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 @@ + + +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 @@ + + 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 @@ + + + +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 @@ + + +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 @@ + + 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 @@ + + + +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 @@ + + +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 @@ + +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."> +]> + 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 @@ + + 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 @@ + + + +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 @@ + + +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 @@ + + 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 @@ + + + +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 @@ + + +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 @@ + + 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 @@ + + + +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 @@ + + +The result of this test is logged above.
+