diff --git a/src/dom/html_collection.zig b/src/dom/html_collection.zig
index cb54c032..7b3be82c 100644
--- a/src/dom/html_collection.zig
+++ b/src/dom/html_collection.zig
@@ -63,18 +63,13 @@ pub const HTMLCollection = struct {
/// _get_length computes the collection's length dynamically according to
/// the current root structure.
// TODO: nodes retrieved must be de-referenced.
- pub fn get_length(self: *HTMLCollection) u32 {
+ pub fn get_length(self: *HTMLCollection, allocator: std.mem.Allocator) !u32 {
var len: u32 = 0;
var node: *parser.Node = self.root;
var ntype: parser.NodeType = undefined;
- // FIXME using a fixed length buffer here avoid the need of an allocator
- // to get an upper case match value. But if the match value (a tag
- // name) is greater than 128 chars, the code will panic.
- // ascii.upperString asserts the buffer size is greater or equals than
- // the given string.
- var buffer: [128]u8 = undefined;
- const imatch = std.ascii.upperString(&buffer, self.match);
+ const imatch = try std.ascii.allocUpperString(allocator, self.match);
+ defer allocator.free(imatch);
var is_wildcard = std.mem.eql(u8, self.match, "*");
@@ -92,7 +87,7 @@ pub const HTMLCollection = struct {
return len;
}
- pub fn _item(self: *HTMLCollection, index: u32) ?*parser.Element {
+ pub fn _item(self: *HTMLCollection, allocator: std.mem.Allocator, index: u32) !?*parser.Element {
var i: u32 = 0;
var node: *parser.Node = self.root;
var ntype: parser.NodeType = undefined;
@@ -105,13 +100,8 @@ pub const HTMLCollection = struct {
node = self.cur_node;
}
- // FIXME using a fixed length buffer here avoid the need of an allocator
- // to get an upper case match value. But if the match value (a tag
- // name) is greater than 128 chars, the code will panic.
- // ascii.upperString asserts the buffer size is greater or equals than
- // the given string.
- var buffer: [128]u8 = undefined;
- const imatch = std.ascii.upperString(&buffer, self.match);
+ const imatch = try std.ascii.allocUpperString(allocator, self.match);
+ defer allocator.free(imatch);
while (true) {
ntype = parser.nodeType(node);
@@ -136,7 +126,7 @@ pub const HTMLCollection = struct {
return null;
}
- pub fn _namedItem(self: *HTMLCollection, name: []const u8) ?*parser.Element {
+ pub fn _namedItem(self: *HTMLCollection, allocator: std.mem.Allocator, name: []const u8) !?*parser.Element {
if (name.len == 0) {
return null;
}
@@ -146,13 +136,8 @@ pub const HTMLCollection = struct {
var is_wildcard = std.mem.eql(u8, self.match, "*");
- // FIXME using a fixed length buffer here avoid the need of an allocator
- // to get an upper case match value. But if the match value (a tag
- // name) is greater than 128 chars, the code will panic.
- // ascii.upperString asserts the buffer size is greater or equals than
- // the given string.
- var buffer: [128]u8 = undefined;
- const imatch = std.ascii.upperString(&buffer, self.match);
+ const imatch = try std.ascii.allocUpperString(allocator, self.match);
+ defer allocator.free(imatch);
while (true) {
ntype = parser.nodeType(node);
@@ -192,6 +177,8 @@ pub fn testExecFn(
var getElementsByTagName = [_]Case{
.{ .src = "let getElementsByTagName = document.getElementsByTagName('p')", .ex = "undefined" },
.{ .src = "getElementsByTagName.length", .ex = "2" },
+ .{ .src = "let getElementsByTagNameCI = document.getElementsByTagName('P')", .ex = "undefined" },
+ .{ .src = "getElementsByTagNameCI.length", .ex = "2" },
.{ .src = "getElementsByTagName.item(0).localName", .ex = "p" },
.{ .src = "getElementsByTagName.item(1).localName", .ex = "p" },
.{ .src = "let getElementsByTagNameAll = document.getElementsByTagName('*')", .ex = "undefined" },