diff --git a/src/browser/tests/document/get_elements_by_class_name.html b/src/browser/tests/document/get_elements_by_class_name.html
index 3e291dce4..78001db89 100644
--- a/src/browser/tests/document/get_elements_by_class_name.html
+++ b/src/browser/tests/document/get_elements_by_class_name.html
@@ -15,6 +15,8 @@
nested2
+overlap1
+
@@ -96,3 +98,10 @@
testing.expectEqual('nested1', nested[0].textContent);
testing.expectEqual('nested2', nested[1].textContent);
+
+
diff --git a/src/browser/webapi/selector/Selector.zig b/src/browser/webapi/selector/Selector.zig
index 71658419b..d8746da67 100644
--- a/src/browser/webapi/selector/Selector.zig
+++ b/src/browser/webapi/selector/Selector.zig
@@ -187,37 +187,23 @@ pub fn classAttributeContains(class_attr: []const u8, class_name: []const u8) bo
}
pub fn classAttributeContainsCase(class_attr: []const u8, class_name: []const u8, case_insensitive: bool) bool {
- if (class_name.len == 0 or class_name.len > class_attr.len) {
+ if (class_name.len == 0) {
return false;
}
- var search = class_attr;
- while (true) {
- const pos = (if (case_insensitive)
- std.ascii.indexOfIgnoreCase(search, class_name)
- else
- std.mem.indexOf(u8, search, class_name)) orelse break;
-
- const is_start = pos == 0 or isClassWhitespace(search[pos - 1]);
- const end = pos + class_name.len;
- const is_end = end == search.len or isClassWhitespace(search[end]);
-
- if (is_start and is_end) return true;
-
- search = search[pos + 1 ..];
+ var it = std.mem.tokenizeAny(u8, class_attr, &[_]u8{ '\t', '\n', 0x0C, '\r', ' ' });
+ while (it.next()) |token| {
+ if (case_insensitive) {
+ if (std.ascii.eqlIgnoreCase(token, class_name)) {
+ return true;
+ }
+ } else if (std.mem.eql(u8, token, class_name)) {
+ return true;
+ }
}
return false;
}
-// The class attribute tokens are separated by ASCII whitespace (which,
-// unlike std.ascii.isWhitespace, does not include vertical tab).
-fn isClassWhitespace(c: u8) bool {
- return switch (c) {
- '\t', '\n', 0x0C, '\r', ' ' => true,
- else => false,
- };
-}
-
pub const Part = union(enum) {
id: []const u8,
class: []const u8,