From c77e4e4e69ee50e971f781d03a43cb7ef862a9ec Mon Sep 17 00:00:00 2001 From: cybai Date: Wed, 19 Apr 2023 18:03:57 +0900 Subject: [PATCH] Fix checking for empty set for getElementsByClassName Because empty set with `.all(predicate)` will always return `true`, it will result in always filtering wrong elements when the classes is empty set. Thus, we return earlier with `always_empty` HTMLCollection in the mpety classes case so that we can avoid filtering on empty sets. --- components/script/dom/htmlcollection.rs | 6 ++++++ .../nodes/getElementsByClassName-empty-set.html.ini | 10 ---------- 2 files changed, 6 insertions(+), 10 deletions(-) delete mode 100644 tests/wpt/metadata/dom/nodes/getElementsByClassName-empty-set.html.ini diff --git a/components/script/dom/htmlcollection.rs b/components/script/dom/htmlcollection.rs index d5198b94986..f1eb1fdd706 100644 --- a/components/script/dom/htmlcollection.rs +++ b/components/script/dom/htmlcollection.rs @@ -252,11 +252,17 @@ impl HTMLCollection { let case_sensitivity = document_from_node(elem) .quirks_mode() .classes_and_ids_case_sensitivity(); + self.classes .iter() .all(|class| elem.has_class(class, case_sensitivity)) } } + + if classes.is_empty() { + return HTMLCollection::always_empty(window, root); + } + let filter = ClassNameFilter { classes: classes }; HTMLCollection::create(window, root, Box::new(filter)) } diff --git a/tests/wpt/metadata/dom/nodes/getElementsByClassName-empty-set.html.ini b/tests/wpt/metadata/dom/nodes/getElementsByClassName-empty-set.html.ini deleted file mode 100644 index 88cb5872361..00000000000 --- a/tests/wpt/metadata/dom/nodes/getElementsByClassName-empty-set.html.ini +++ /dev/null @@ -1,10 +0,0 @@ -[getElementsByClassName-empty-set.html] - [Passing a space to getElementsByClassName should return an empty HTMLCollection] - expected: FAIL - - [Passing three spaces to getElementsByClassName should return an empty HTMLCollection] - expected: FAIL - - [Passing an empty string to getElementsByClassName should return an empty HTMLCollection] - expected: FAIL -