mirror of
https://github.com/servo/servo.git
synced 2025-06-06 16:45:39 +00:00
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:
parent
604d785bad
commit
b5bd416f7c
8 changed files with 36 additions and 98 deletions
|
@ -50,15 +50,4 @@ impl CSSConditionRuleMethods for CSSConditionRule {
|
|||
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!()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,17 +2,13 @@
|
|||
* 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/. */
|
||||
|
||||
use cssparser::{Parser, ParserInput};
|
||||
use dom_struct::dom_struct;
|
||||
use servo_arc::Arc;
|
||||
use style::media_queries::MediaList as StyleMediaList;
|
||||
use style::parser::ParserContext;
|
||||
use style::shared_lock::{Locked, ToCssWithGuard};
|
||||
use style::stylesheets::{CssRuleType, MediaRule, Origin};
|
||||
use style_traits::{ParsingMode, ToCss};
|
||||
use style::stylesheets::MediaRule;
|
||||
use style_traits::ToCss;
|
||||
|
||||
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::root::{DomRoot, MutNullableDom};
|
||||
use crate::dom::bindings::str::DOMString;
|
||||
|
@ -75,37 +71,6 @@ impl CSSMediaRule {
|
|||
let list = rule.media_queries.read_with(&guard);
|
||||
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 can’t 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 {
|
||||
|
|
|
@ -2,17 +2,13 @@
|
|||
* 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/. */
|
||||
|
||||
use cssparser::{Parser, ParserInput};
|
||||
use dom_struct::dom_struct;
|
||||
use servo_arc::Arc;
|
||||
use style::parser::ParserContext;
|
||||
use style::shared_lock::{Locked, ToCssWithGuard};
|
||||
use style::stylesheets::supports_rule::SupportsCondition;
|
||||
use style::stylesheets::{CssRuleType, Origin, SupportsRule};
|
||||
use style_traits::{ParsingMode, ToCss};
|
||||
use style::stylesheets::SupportsRule;
|
||||
use style_traits::ToCss;
|
||||
|
||||
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;
|
||||
use crate::dom::bindings::root::DomRoot;
|
||||
use crate::dom::bindings::str::DOMString;
|
||||
use crate::dom::cssconditionrule::CSSConditionRule;
|
||||
|
@ -62,42 +58,6 @@ impl CSSSupportsRule {
|
|||
let rule = self.supportsrule.read_with(&guard);
|
||||
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 {
|
||||
|
|
|
@ -5,5 +5,5 @@
|
|||
// https://drafts.csswg.org/css-conditional/#cssconditionrule
|
||||
[Abstract, Exposed=Window]
|
||||
interface CSSConditionRule : CSSGroupingRule {
|
||||
attribute DOMString conditionText;
|
||||
readonly attribute DOMString conditionText;
|
||||
};
|
||||
|
|
|
@ -1,6 +1,3 @@
|
|||
[idlharness.html]
|
||||
[css-conditional IDL tests]
|
||||
expected: FAIL
|
||||
|
||||
[CSSConditionRule interface: attribute conditionText]
|
||||
expected: FAIL
|
||||
|
|
|
@ -555189,6 +555189,13 @@
|
|||
{}
|
||||
]
|
||||
],
|
||||
"CSSConditionRule-conditionText.html": [
|
||||
"bccfc3135a4c80695b90638c42268f8a35d7f2fd",
|
||||
[
|
||||
null,
|
||||
{}
|
||||
]
|
||||
],
|
||||
"CSSContainerRule.tentative.html": [
|
||||
"4e01c0b47003a413c0853ba96011d10962ad00a5",
|
||||
[
|
||||
|
|
|
@ -1,3 +0,0 @@
|
|||
[idlharness.html]
|
||||
[CSSConditionRule interface: attribute conditionText]
|
||||
expected: FAIL
|
|
@ -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>
|
Loading…
Add table
Add a link
Reference in a new issue