mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-08-07 00:29:15 +00:00
LibWeb: Throw error in insertRule
when rule violates constraints
This commit is contained in:
parent
6144154e4f
commit
ef7ba02842
Notes:
github-actions[bot]
2025-06-23 11:53:57 +00:00
Author: https://github.com/Calme1709
Commit: ef7ba02842
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/5158
Reviewed-by: https://github.com/AtkinsSJ ✅
Reviewed-by: https://github.com/tcl3
3 changed files with 125 additions and 1 deletions
|
@ -90,7 +90,48 @@ WebIDL::ExceptionOr<unsigned> CSSRuleList::insert_a_css_rule(Variant<StringView,
|
|||
if (!new_rule)
|
||||
return WebIDL::SyntaxError::create(realm(), "Unable to parse CSS rule."_string);
|
||||
|
||||
// FIXME: 6. If new rule cannot be inserted into list at the zero-index position index due to constraints specified by CSS, then throw a HierarchyRequestError exception. [CSS21]
|
||||
auto has_rule_of_type_other_than_specified_before_index = [&](Vector<CSSRule::Type> types, size_t index) {
|
||||
for (size_t i = 0; i < index; i++) {
|
||||
if (!any_of(types, [&](auto type) { return m_rules[i]->type() == type; }))
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
auto has_rule_of_type_at_or_after_index = [&](CSSRule::Type type, size_t index) {
|
||||
for (size_t i = index; i < m_rules.size(); i++) {
|
||||
if (m_rules[i]->type() == type)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
// 6. If new rule cannot be inserted into list at the zero-indexed position index due to constraints specified by CSS, then throw a HierarchyRequestError exception. [CSS21]
|
||||
// "Any @import rules must precede all other valid at-rules and style rules in a style sheet
|
||||
// (ignoring @charset and @layer statement rules) and must not have any other valid at-rules
|
||||
// or style rules between it and previous @import rules, or else the @import rule is invalid."
|
||||
// https://drafts.csswg.org/css-cascade-5/#at-import
|
||||
//
|
||||
// "Any @namespace rules must follow all @charset and @import rules and precede all other
|
||||
// non-ignored at-rules and style rules in a style sheet.
|
||||
|
||||
auto rule_is_disallowed = false;
|
||||
switch (new_rule->type()) {
|
||||
case CSSRule::Type::LayerStatement:
|
||||
break;
|
||||
case CSSRule::Type::Import:
|
||||
rule_is_disallowed = has_rule_of_type_other_than_specified_before_index({ CSSRule::Type::Import, CSSRule::Type::LayerStatement }, index);
|
||||
break;
|
||||
case CSSRule::Type::Namespace:
|
||||
rule_is_disallowed = has_rule_of_type_at_or_after_index(CSSRule::Type::Import, index) || has_rule_of_type_other_than_specified_before_index({ CSSRule::Type::Import, CSSRule::Type::Namespace, CSSRule::Type::LayerStatement }, index);
|
||||
break;
|
||||
default:
|
||||
rule_is_disallowed = has_rule_of_type_at_or_after_index(CSSRule::Type::Import, index) || has_rule_of_type_at_or_after_index(CSSRule::Type::Namespace, index);
|
||||
break;
|
||||
}
|
||||
|
||||
if (rule_is_disallowed)
|
||||
return WebIDL::HierarchyRequestError::create(realm(), "Cannot insert rule at specified index."_string);
|
||||
|
||||
// 7. If new rule is an @namespace at-rule, and list contains anything other than @import at-rules, and @namespace at-rules, throw an InvalidStateError exception.
|
||||
if (new_rule->type() == CSSRule::Type::Namespace && any_of(m_rules, [](auto existing_rule) { return existing_rule->type() != CSSRule::Type::Import && existing_rule->type() != CSSRule::Type::Namespace; }))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue