Make CSSConditionRule's conditionText readonly (#30768)

As per https://github.com/w3c/csswg-drafts/issues/6819

This will be needed for https://phabricator.services.mozilla.com/D179060

The test was created by Mozilla, but was not correctly synced into WPT.
This commit is contained in:
Oriol Brufau 2023-11-23 11:29:16 +01:00 committed by GitHub
parent 604d785bad
commit b5bd416f7c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 36 additions and 98 deletions

View file

@ -50,15 +50,4 @@ impl CSSConditionRuleMethods for CSSConditionRule {
unreachable!() unreachable!()
} }
} }
/// <https://drafts.csswg.org/css-conditional-3/#dom-cssconditionrule-conditiontext>
fn SetConditionText(&self, text: DOMString) {
if let Some(rule) = self.downcast::<CSSMediaRule>() {
rule.set_condition_text(text)
} else if let Some(rule) = self.downcast::<CSSSupportsRule>() {
rule.set_condition_text(text)
} else {
unreachable!()
}
}
} }

View file

@ -2,17 +2,13 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this * License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
use cssparser::{Parser, ParserInput};
use dom_struct::dom_struct; use dom_struct::dom_struct;
use servo_arc::Arc; use servo_arc::Arc;
use style::media_queries::MediaList as StyleMediaList;
use style::parser::ParserContext;
use style::shared_lock::{Locked, ToCssWithGuard}; use style::shared_lock::{Locked, ToCssWithGuard};
use style::stylesheets::{CssRuleType, MediaRule, Origin}; use style::stylesheets::MediaRule;
use style_traits::{ParsingMode, ToCss}; use style_traits::ToCss;
use crate::dom::bindings::codegen::Bindings::CSSMediaRuleBinding::CSSMediaRuleMethods; use crate::dom::bindings::codegen::Bindings::CSSMediaRuleBinding::CSSMediaRuleMethods;
use crate::dom::bindings::codegen::Bindings::WindowBinding::Window_Binding::WindowMethods;
use crate::dom::bindings::reflector::{reflect_dom_object, DomObject}; use crate::dom::bindings::reflector::{reflect_dom_object, DomObject};
use crate::dom::bindings::root::{DomRoot, MutNullableDom}; use crate::dom::bindings::root::{DomRoot, MutNullableDom};
use crate::dom::bindings::str::DOMString; use crate::dom::bindings::str::DOMString;
@ -75,37 +71,6 @@ impl CSSMediaRule {
let list = rule.media_queries.read_with(&guard); let list = rule.media_queries.read_with(&guard);
list.to_css_string().into() list.to_css_string().into()
} }
/// <https://drafts.csswg.org/css-conditional-3/#the-cssmediarule-interface>
pub fn set_condition_text(&self, text: DOMString) {
let mut input = ParserInput::new(&text);
let mut input = Parser::new(&mut input);
let global = self.global();
let window = global.as_window();
let url = window.get_url();
let quirks_mode = window.Document().quirks_mode();
let context = ParserContext::new(
Origin::Author,
&url,
Some(CssRuleType::Media),
ParsingMode::DEFAULT,
quirks_mode,
window.css_error_reporter(),
None,
);
let new_medialist = StyleMediaList::parse(&context, &mut input);
let mut guard = self.cssconditionrule.shared_lock().write();
// Clone an Arc because we cant borrow `guard` twice at the same time.
// FIXME(SimonSapin): allow access to multiple objects with one write guard?
// Would need a set of usize pointer addresses or something,
// the same object is not accessed more than once.
let mqs = Arc::clone(&self.mediarule.write_with(&mut guard).media_queries);
*mqs.write_with(&mut guard) = new_medialist;
}
} }
impl SpecificCSSRule for CSSMediaRule { impl SpecificCSSRule for CSSMediaRule {

View file

@ -2,17 +2,13 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this * License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
use cssparser::{Parser, ParserInput};
use dom_struct::dom_struct; use dom_struct::dom_struct;
use servo_arc::Arc; use servo_arc::Arc;
use style::parser::ParserContext;
use style::shared_lock::{Locked, ToCssWithGuard}; use style::shared_lock::{Locked, ToCssWithGuard};
use style::stylesheets::supports_rule::SupportsCondition; use style::stylesheets::SupportsRule;
use style::stylesheets::{CssRuleType, Origin, SupportsRule}; use style_traits::ToCss;
use style_traits::{ParsingMode, ToCss};
use crate::dom::bindings::codegen::Bindings::WindowBinding::Window_Binding::WindowMethods; use crate::dom::bindings::reflector::reflect_dom_object;
use crate::dom::bindings::reflector::{reflect_dom_object, DomObject};
use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::root::DomRoot;
use crate::dom::bindings::str::DOMString; use crate::dom::bindings::str::DOMString;
use crate::dom::cssconditionrule::CSSConditionRule; use crate::dom::cssconditionrule::CSSConditionRule;
@ -62,42 +58,6 @@ impl CSSSupportsRule {
let rule = self.supportsrule.read_with(&guard); let rule = self.supportsrule.read_with(&guard);
rule.condition.to_css_string().into() rule.condition.to_css_string().into()
} }
/// <https://drafts.csswg.org/css-conditional-3/#the-csssupportsrule-interface>
pub fn set_condition_text(&self, text: DOMString) {
let mut input = ParserInput::new(&text);
let mut input = Parser::new(&mut input);
let cond = SupportsCondition::parse(&mut input);
if let Ok(cond) = cond {
let global = self.global();
let win = global.as_window();
let url = win.Document().url();
let quirks_mode = win.Document().quirks_mode();
let context = ParserContext::new(
Origin::Author,
&url,
Some(CssRuleType::Supports),
ParsingMode::DEFAULT,
quirks_mode,
None,
None,
);
let enabled = {
let namespaces = self
.cssconditionrule
.parent_stylesheet()
.style_stylesheet()
.contents
.namespaces
.read();
cond.eval(&context, &namespaces)
};
let mut guard = self.cssconditionrule.shared_lock().write();
let rule = self.supportsrule.write_with(&mut guard);
rule.condition = cond;
rule.enabled = enabled;
}
}
} }
impl SpecificCSSRule for CSSSupportsRule { impl SpecificCSSRule for CSSSupportsRule {

View file

@ -5,5 +5,5 @@
// https://drafts.csswg.org/css-conditional/#cssconditionrule // https://drafts.csswg.org/css-conditional/#cssconditionrule
[Abstract, Exposed=Window] [Abstract, Exposed=Window]
interface CSSConditionRule : CSSGroupingRule { interface CSSConditionRule : CSSGroupingRule {
attribute DOMString conditionText; readonly attribute DOMString conditionText;
}; };

View file

@ -1,6 +1,3 @@
[idlharness.html] [idlharness.html]
[css-conditional IDL tests] [css-conditional IDL tests]
expected: FAIL expected: FAIL
[CSSConditionRule interface: attribute conditionText]
expected: FAIL

View file

@ -555189,6 +555189,13 @@
{} {}
] ]
], ],
"CSSConditionRule-conditionText.html": [
"bccfc3135a4c80695b90638c42268f8a35d7f2fd",
[
null,
{}
]
],
"CSSContainerRule.tentative.html": [ "CSSContainerRule.tentative.html": [
"4e01c0b47003a413c0853ba96011d10962ad00a5", "4e01c0b47003a413c0853ba96011d10962ad00a5",
[ [

View file

@ -1,3 +0,0 @@
[idlharness.html]
[CSSConditionRule interface: attribute conditionText]
expected: FAIL

View file

@ -0,0 +1,23 @@
<!doctype html>
<title>CSSConditionRule.conditionText</title>
<link rel="author" title="Emilio Cobos Álvarez" href="mailto:emilio@crisal.io">
<link rel="help" href="https://drafts.csswg.org/css-conditional-3/#cssconditionrule">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<style>
@media not all {
:root { color: lime }
}
</style>
<script>
test(function(t) {
let rule = document.styleSheets[0].cssRules[0];
assert_true(rule instanceof CSSConditionRule);
assert_equals(rule.conditionText, "not all");
rule.conditionText = 1;
assert_equals(rule.conditionText, "not all");
rule.conditionText = "all";
assert_equals(rule.conditionText, "not all");
assert_not_equals(getComputedStyle(document.documentElement).color, "rgb(0, 255, 0)");
});
</script>