Fix InsertRule to use the right CssRuleTypes (#32125)

`CSSRule::Type()` returns an u16 for CSSOM. `InsertRule()` was
incorrectly using this to create a `CssRuleTypes`.

Instead of `CssRuleTypes::from_bits(rule_type)`, it should be something
like `CssRuleTypes::from_bits(1 << rule_type)`.

However, that would only work when `Type()` provides an actual value,
which per https://drafts.csswg.org/cssom/#dom-cssrule-type only happens
for old rule types. New rule types just return 0.

Therefore, this patch changes the signature of `SpecificCSSRule::ty()`
to return the actual `CssRuleType`, and then `CSSRule::Type()` can zero
it out when necessary.

The fix is only relevant for CSS Nesting, which is currently disabled on
Servo, so no test is necessary.

<!-- Please describe your changes on the following line: -->


---
<!-- Thank you for contributing to Servo! Please replace each `[ ]` by
`[X]` when the step is complete, and replace `___` with appropriate
data: -->
- [X] `./mach build -d` does not report any errors
- [X] `./mach test-tidy` does not report any errors
- [X] These changes do not require tests because the fix is only
relevant for CSS Nesting, which is currently disabled

<!-- Also, please make sure that "Allow edits from maintainers" checkbox
is checked, so that we can help you if you get stuck somewhere along the
way.-->

<!-- Pull requests that do not address these steps are welcome, but they
will require additional verification as part of the review process. -->
This commit is contained in:
Oriol Brufau 2024-04-22 09:06:36 +02:00 committed by GitHub
parent 67f239d1ba
commit f9e154af55
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
12 changed files with 42 additions and 41 deletions

View file

@ -6,7 +6,7 @@ use std::cell::Cell;
use dom_struct::dom_struct;
use style::shared_lock::SharedRwLock;
use style::stylesheets::CssRule as StyleCssRule;
use style::stylesheets::{CssRule as StyleCssRule, CssRuleType};
use crate::dom::bindings::codegen::Bindings::CSSRuleBinding::CSSRuleMethods;
use crate::dom::bindings::inheritance::Castable;
@ -147,7 +147,14 @@ impl CSSRule {
impl CSSRuleMethods for CSSRule {
// https://drafts.csswg.org/cssom/#dom-cssrule-type
fn Type(&self) -> u16 {
self.as_specific().ty()
let rule_type = self.as_specific().ty() as u16;
// Per https://drafts.csswg.org/cssom/#dom-cssrule-type for constants > 15
// we return 0.
if rule_type > 15 {
0
} else {
rule_type
}
}
// https://drafts.csswg.org/cssom/#dom-cssrule-parentstylesheet
@ -171,7 +178,7 @@ impl CSSRuleMethods for CSSRule {
}
pub trait SpecificCSSRule {
fn ty(&self) -> u16;
fn ty(&self) -> CssRuleType;
fn get_css(&self) -> DOMString;
/// Remove parentStylesheet from all transitive children
fn deparent_children(&self) {