mirror of
https://github.com/servo/servo.git
synced 2025-07-24 15:50:21 +01:00
Make parent stylesheet optional for CSSRules
This commit is contained in:
parent
52a3a71be3
commit
53c99662bc
11 changed files with 41 additions and 32 deletions
|
@ -22,7 +22,7 @@ pub struct CSSFontFaceRule {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl CSSFontFaceRule {
|
impl CSSFontFaceRule {
|
||||||
fn new_inherited(parent: &CSSStyleSheet, fontfacerule: Arc<RwLock<FontFaceRule>>) -> CSSFontFaceRule {
|
fn new_inherited(parent: Option<&CSSStyleSheet>, fontfacerule: Arc<RwLock<FontFaceRule>>) -> CSSFontFaceRule {
|
||||||
CSSFontFaceRule {
|
CSSFontFaceRule {
|
||||||
cssrule: CSSRule::new_inherited(parent),
|
cssrule: CSSRule::new_inherited(parent),
|
||||||
fontfacerule: fontfacerule,
|
fontfacerule: fontfacerule,
|
||||||
|
@ -30,7 +30,7 @@ impl CSSFontFaceRule {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(unrooted_must_root)]
|
#[allow(unrooted_must_root)]
|
||||||
pub fn new(window: &Window, parent: &CSSStyleSheet,
|
pub fn new(window: &Window, parent: Option<&CSSStyleSheet>,
|
||||||
fontfacerule: Arc<RwLock<FontFaceRule>>) -> Root<CSSFontFaceRule> {
|
fontfacerule: Arc<RwLock<FontFaceRule>>) -> Root<CSSFontFaceRule> {
|
||||||
reflect_dom_object(box CSSFontFaceRule::new_inherited(parent, fontfacerule),
|
reflect_dom_object(box CSSFontFaceRule::new_inherited(parent, fontfacerule),
|
||||||
window,
|
window,
|
||||||
|
|
|
@ -15,14 +15,14 @@ pub struct CSSGroupingRule {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl CSSGroupingRule {
|
impl CSSGroupingRule {
|
||||||
pub fn new_inherited(parent: &CSSStyleSheet) -> CSSGroupingRule {
|
pub fn new_inherited(parent: Option<&CSSStyleSheet>) -> CSSGroupingRule {
|
||||||
CSSGroupingRule {
|
CSSGroupingRule {
|
||||||
cssrule: CSSRule::new_inherited(parent),
|
cssrule: CSSRule::new_inherited(parent),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(unrooted_must_root)]
|
#[allow(unrooted_must_root)]
|
||||||
pub fn new(window: &Window, parent: &CSSStyleSheet) -> Root<CSSGroupingRule> {
|
pub fn new(window: &Window, parent: Option<&CSSStyleSheet>) -> Root<CSSGroupingRule> {
|
||||||
reflect_dom_object(box CSSGroupingRule::new_inherited(parent),
|
reflect_dom_object(box CSSGroupingRule::new_inherited(parent),
|
||||||
window,
|
window,
|
||||||
CSSGroupingRuleBinding::Wrap)
|
CSSGroupingRuleBinding::Wrap)
|
||||||
|
|
|
@ -21,7 +21,7 @@ pub struct CSSKeyframeRule {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl CSSKeyframeRule {
|
impl CSSKeyframeRule {
|
||||||
fn new_inherited(parent: &CSSStyleSheet, keyframerule: Arc<RwLock<Keyframe>>) -> CSSKeyframeRule {
|
fn new_inherited(parent: Option<&CSSStyleSheet>, keyframerule: Arc<RwLock<Keyframe>>) -> CSSKeyframeRule {
|
||||||
CSSKeyframeRule {
|
CSSKeyframeRule {
|
||||||
cssrule: CSSRule::new_inherited(parent),
|
cssrule: CSSRule::new_inherited(parent),
|
||||||
keyframerule: keyframerule,
|
keyframerule: keyframerule,
|
||||||
|
@ -29,7 +29,7 @@ impl CSSKeyframeRule {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(unrooted_must_root)]
|
#[allow(unrooted_must_root)]
|
||||||
pub fn new(window: &Window, parent: &CSSStyleSheet,
|
pub fn new(window: &Window, parent: Option<&CSSStyleSheet>,
|
||||||
keyframerule: Arc<RwLock<Keyframe>>) -> Root<CSSKeyframeRule> {
|
keyframerule: Arc<RwLock<Keyframe>>) -> Root<CSSKeyframeRule> {
|
||||||
reflect_dom_object(box CSSKeyframeRule::new_inherited(parent, keyframerule),
|
reflect_dom_object(box CSSKeyframeRule::new_inherited(parent, keyframerule),
|
||||||
window,
|
window,
|
||||||
|
|
|
@ -27,7 +27,7 @@ pub struct CSSKeyframesRule {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl CSSKeyframesRule {
|
impl CSSKeyframesRule {
|
||||||
fn new_inherited(parent: &CSSStyleSheet, keyframesrule: Arc<RwLock<KeyframesRule>>) -> CSSKeyframesRule {
|
fn new_inherited(parent: Option<&CSSStyleSheet>, keyframesrule: Arc<RwLock<KeyframesRule>>) -> CSSKeyframesRule {
|
||||||
CSSKeyframesRule {
|
CSSKeyframesRule {
|
||||||
cssrule: CSSRule::new_inherited(parent),
|
cssrule: CSSRule::new_inherited(parent),
|
||||||
keyframesrule: keyframesrule,
|
keyframesrule: keyframesrule,
|
||||||
|
@ -36,7 +36,7 @@ impl CSSKeyframesRule {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(unrooted_must_root)]
|
#[allow(unrooted_must_root)]
|
||||||
pub fn new(window: &Window, parent: &CSSStyleSheet,
|
pub fn new(window: &Window, parent: Option<&CSSStyleSheet>,
|
||||||
keyframesrule: Arc<RwLock<KeyframesRule>>) -> Root<CSSKeyframesRule> {
|
keyframesrule: Arc<RwLock<KeyframesRule>>) -> Root<CSSKeyframesRule> {
|
||||||
reflect_dom_object(box CSSKeyframesRule::new_inherited(parent, keyframesrule),
|
reflect_dom_object(box CSSKeyframesRule::new_inherited(parent, keyframesrule),
|
||||||
window,
|
window,
|
||||||
|
@ -44,10 +44,13 @@ impl CSSKeyframesRule {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn rulelist(&self) -> Root<CSSRuleList> {
|
fn rulelist(&self) -> Root<CSSRuleList> {
|
||||||
self.rulelist.or_init(|| CSSRuleList::new(self.global().as_window(),
|
self.rulelist.or_init(|| {
|
||||||
// temporary unwrap
|
let sheet = self.upcast::<CSSRule>().GetParentStyleSheet();
|
||||||
&self.upcast::<CSSRule>().GetParentStyleSheet().unwrap(),
|
let sheet = sheet.as_ref().map(|s| &**s);
|
||||||
RulesSource::Keyframes(self.keyframesrule.clone())))
|
CSSRuleList::new(self.global().as_window(),
|
||||||
|
sheet,
|
||||||
|
RulesSource::Keyframes(self.keyframesrule.clone()))
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,7 @@ pub struct CSSMediaRule {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl CSSMediaRule {
|
impl CSSMediaRule {
|
||||||
fn new_inherited(parent: &CSSStyleSheet, mediarule: Arc<RwLock<MediaRule>>) -> CSSMediaRule {
|
fn new_inherited(parent: Option<&CSSStyleSheet>, mediarule: Arc<RwLock<MediaRule>>) -> CSSMediaRule {
|
||||||
CSSMediaRule {
|
CSSMediaRule {
|
||||||
cssrule: CSSGroupingRule::new_inherited(parent),
|
cssrule: CSSGroupingRule::new_inherited(parent),
|
||||||
mediarule: mediarule,
|
mediarule: mediarule,
|
||||||
|
@ -31,7 +31,7 @@ impl CSSMediaRule {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(unrooted_must_root)]
|
#[allow(unrooted_must_root)]
|
||||||
pub fn new(window: &Window, parent: &CSSStyleSheet,
|
pub fn new(window: &Window, parent: Option<&CSSStyleSheet>,
|
||||||
mediarule: Arc<RwLock<MediaRule>>) -> Root<CSSMediaRule> {
|
mediarule: Arc<RwLock<MediaRule>>) -> Root<CSSMediaRule> {
|
||||||
reflect_dom_object(box CSSMediaRule::new_inherited(parent, mediarule),
|
reflect_dom_object(box CSSMediaRule::new_inherited(parent, mediarule),
|
||||||
window,
|
window,
|
||||||
|
|
|
@ -22,7 +22,7 @@ pub struct CSSNamespaceRule {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl CSSNamespaceRule {
|
impl CSSNamespaceRule {
|
||||||
fn new_inherited(parent: &CSSStyleSheet, namespacerule: Arc<RwLock<NamespaceRule>>) -> CSSNamespaceRule {
|
fn new_inherited(parent: Option<&CSSStyleSheet>, namespacerule: Arc<RwLock<NamespaceRule>>) -> CSSNamespaceRule {
|
||||||
CSSNamespaceRule {
|
CSSNamespaceRule {
|
||||||
cssrule: CSSRule::new_inherited(parent),
|
cssrule: CSSRule::new_inherited(parent),
|
||||||
namespacerule: namespacerule,
|
namespacerule: namespacerule,
|
||||||
|
@ -30,7 +30,7 @@ impl CSSNamespaceRule {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(unrooted_must_root)]
|
#[allow(unrooted_must_root)]
|
||||||
pub fn new(window: &Window, parent: &CSSStyleSheet,
|
pub fn new(window: &Window, parent: Option<&CSSStyleSheet>,
|
||||||
namespacerule: Arc<RwLock<NamespaceRule>>) -> Root<CSSNamespaceRule> {
|
namespacerule: Arc<RwLock<NamespaceRule>>) -> Root<CSSNamespaceRule> {
|
||||||
reflect_dom_object(box CSSNamespaceRule::new_inherited(parent, namespacerule),
|
reflect_dom_object(box CSSNamespaceRule::new_inherited(parent, namespacerule),
|
||||||
window,
|
window,
|
||||||
|
|
|
@ -28,15 +28,15 @@ pub struct CSSRule {
|
||||||
|
|
||||||
impl CSSRule {
|
impl CSSRule {
|
||||||
#[allow(unrooted_must_root)]
|
#[allow(unrooted_must_root)]
|
||||||
pub fn new_inherited(parent: &CSSStyleSheet) -> CSSRule {
|
pub fn new_inherited(parent: Option<&CSSStyleSheet>) -> CSSRule {
|
||||||
CSSRule {
|
CSSRule {
|
||||||
reflector_: Reflector::new(),
|
reflector_: Reflector::new(),
|
||||||
parent: MutNullableHeap::new(Some(parent)),
|
parent: MutNullableHeap::new(parent),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(unrooted_must_root)]
|
#[allow(unrooted_must_root)]
|
||||||
pub fn new(window: &Window, parent: &CSSStyleSheet) -> Root<CSSRule> {
|
pub fn new(window: &Window, parent: Option<&CSSStyleSheet>) -> Root<CSSRule> {
|
||||||
reflect_dom_object(box CSSRule::new_inherited(parent),
|
reflect_dom_object(box CSSRule::new_inherited(parent),
|
||||||
window,
|
window,
|
||||||
CSSRuleBinding::Wrap)
|
CSSRuleBinding::Wrap)
|
||||||
|
@ -64,7 +64,7 @@ impl CSSRule {
|
||||||
|
|
||||||
// Given a StyleCssRule, create a new instance of a derived class of
|
// Given a StyleCssRule, create a new instance of a derived class of
|
||||||
// CSSRule based on which rule it is
|
// CSSRule based on which rule it is
|
||||||
pub fn new_specific(window: &Window, parent: &CSSStyleSheet,
|
pub fn new_specific(window: &Window, parent: Option<&CSSStyleSheet>,
|
||||||
rule: StyleCssRule) -> Root<CSSRule> {
|
rule: StyleCssRule) -> Root<CSSRule> {
|
||||||
// be sure to update the match in as_specific when this is updated
|
// be sure to update the match in as_specific when this is updated
|
||||||
match rule {
|
match rule {
|
||||||
|
@ -81,6 +81,7 @@ impl CSSRule {
|
||||||
pub fn disown(&self) {
|
pub fn disown(&self) {
|
||||||
self.parent.set(None);
|
self.parent.set(None);
|
||||||
// should set parent rule to None when we add parent rule support
|
// should set parent rule to None when we add parent rule support
|
||||||
|
// Should we disown children as well? (https://github.com/w3c/csswg-drafts/issues/722)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,7 @@ no_jsmanaged_fields!(RulesSource);
|
||||||
#[dom_struct]
|
#[dom_struct]
|
||||||
pub struct CSSRuleList {
|
pub struct CSSRuleList {
|
||||||
reflector_: Reflector,
|
reflector_: Reflector,
|
||||||
sheet: JS<CSSStyleSheet>,
|
sheet: MutNullableHeap<JS<CSSStyleSheet>>,
|
||||||
#[ignore_heap_size_of = "Arc"]
|
#[ignore_heap_size_of = "Arc"]
|
||||||
rules: RulesSource,
|
rules: RulesSource,
|
||||||
dom_rules: DOMRefCell<Vec<MutNullableHeap<JS<CSSRule>>>>
|
dom_rules: DOMRefCell<Vec<MutNullableHeap<JS<CSSRule>>>>
|
||||||
|
@ -37,7 +37,7 @@ pub enum RulesSource {
|
||||||
|
|
||||||
impl CSSRuleList {
|
impl CSSRuleList {
|
||||||
#[allow(unrooted_must_root)]
|
#[allow(unrooted_must_root)]
|
||||||
pub fn new_inherited(sheet: &CSSStyleSheet, rules: RulesSource) -> CSSRuleList {
|
pub fn new_inherited(sheet: Option<&CSSStyleSheet>, rules: RulesSource) -> CSSRuleList {
|
||||||
let dom_rules = match rules {
|
let dom_rules = match rules {
|
||||||
RulesSource::Rules(ref rules) => {
|
RulesSource::Rules(ref rules) => {
|
||||||
rules.0.read().iter().map(|_| MutNullableHeap::new(None)).collect()
|
rules.0.read().iter().map(|_| MutNullableHeap::new(None)).collect()
|
||||||
|
@ -49,14 +49,15 @@ impl CSSRuleList {
|
||||||
|
|
||||||
CSSRuleList {
|
CSSRuleList {
|
||||||
reflector_: Reflector::new(),
|
reflector_: Reflector::new(),
|
||||||
sheet: JS::from_ref(sheet),
|
sheet: MutNullableHeap::new(sheet),
|
||||||
rules: rules,
|
rules: rules,
|
||||||
dom_rules: DOMRefCell::new(dom_rules),
|
dom_rules: DOMRefCell::new(dom_rules),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(unrooted_must_root)]
|
#[allow(unrooted_must_root)]
|
||||||
pub fn new(window: &Window, sheet: &CSSStyleSheet, rules: RulesSource) -> Root<CSSRuleList> {
|
pub fn new(window: &Window, sheet: Option<&CSSStyleSheet>,
|
||||||
|
rules: RulesSource) -> Root<CSSRuleList> {
|
||||||
reflect_dom_object(box CSSRuleList::new_inherited(sheet, rules),
|
reflect_dom_object(box CSSRuleList::new_inherited(sheet, rules),
|
||||||
window,
|
window,
|
||||||
CSSRuleListBinding::Wrap)
|
CSSRuleListBinding::Wrap)
|
||||||
|
@ -132,7 +133,9 @@ impl CSSRuleList {
|
||||||
};
|
};
|
||||||
|
|
||||||
insert(&mut css_rules.0.write(), index, new_rule.clone());
|
insert(&mut css_rules.0.write(), index, new_rule.clone());
|
||||||
let dom_rule = CSSRule::new_specific(&window, &self.sheet, new_rule);
|
let sheet = self.sheet.get();
|
||||||
|
let sheet = sheet.as_ref().map(|sheet| &**sheet);
|
||||||
|
let dom_rule = CSSRule::new_specific(&window, sheet, new_rule);
|
||||||
insert(&mut self.dom_rules.borrow_mut(),
|
insert(&mut self.dom_rules.borrow_mut(),
|
||||||
index, MutNullableHeap::new(Some(&*dom_rule)));
|
index, MutNullableHeap::new(Some(&*dom_rule)));
|
||||||
Ok((idx))
|
Ok((idx))
|
||||||
|
@ -174,15 +177,17 @@ impl CSSRuleListMethods for CSSRuleList {
|
||||||
fn Item(&self, idx: u32) -> Option<Root<CSSRule>> {
|
fn Item(&self, idx: u32) -> Option<Root<CSSRule>> {
|
||||||
self.dom_rules.borrow().get(idx as usize).map(|rule| {
|
self.dom_rules.borrow().get(idx as usize).map(|rule| {
|
||||||
rule.or_init(|| {
|
rule.or_init(|| {
|
||||||
|
let sheet = self.sheet.get();
|
||||||
|
let sheet = sheet.as_ref().map(|sheet| &**sheet);
|
||||||
match self.rules {
|
match self.rules {
|
||||||
RulesSource::Rules(ref rules) => {
|
RulesSource::Rules(ref rules) => {
|
||||||
CSSRule::new_specific(self.global().as_window(),
|
CSSRule::new_specific(self.global().as_window(),
|
||||||
&self.sheet,
|
sheet,
|
||||||
rules.0.read()[idx as usize].clone())
|
rules.0.read()[idx as usize].clone())
|
||||||
}
|
}
|
||||||
RulesSource::Keyframes(ref rules) => {
|
RulesSource::Keyframes(ref rules) => {
|
||||||
Root::upcast(CSSKeyframeRule::new(self.global().as_window(),
|
Root::upcast(CSSKeyframeRule::new(self.global().as_window(),
|
||||||
&self.sheet,
|
sheet,
|
||||||
rules.read()
|
rules.read()
|
||||||
.keyframes[idx as usize]
|
.keyframes[idx as usize]
|
||||||
.clone()))
|
.clone()))
|
||||||
|
|
|
@ -22,7 +22,7 @@ pub struct CSSStyleRule {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl CSSStyleRule {
|
impl CSSStyleRule {
|
||||||
fn new_inherited(parent: &CSSStyleSheet, stylerule: Arc<RwLock<StyleRule>>) -> CSSStyleRule {
|
fn new_inherited(parent: Option<&CSSStyleSheet>, stylerule: Arc<RwLock<StyleRule>>) -> CSSStyleRule {
|
||||||
CSSStyleRule {
|
CSSStyleRule {
|
||||||
cssrule: CSSRule::new_inherited(parent),
|
cssrule: CSSRule::new_inherited(parent),
|
||||||
stylerule: stylerule,
|
stylerule: stylerule,
|
||||||
|
@ -30,7 +30,7 @@ impl CSSStyleRule {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(unrooted_must_root)]
|
#[allow(unrooted_must_root)]
|
||||||
pub fn new(window: &Window, parent: &CSSStyleSheet,
|
pub fn new(window: &Window, parent: Option<&CSSStyleSheet>,
|
||||||
stylerule: Arc<RwLock<StyleRule>>) -> Root<CSSStyleRule> {
|
stylerule: Arc<RwLock<StyleRule>>) -> Root<CSSStyleRule> {
|
||||||
reflect_dom_object(box CSSStyleRule::new_inherited(parent, stylerule),
|
reflect_dom_object(box CSSStyleRule::new_inherited(parent, stylerule),
|
||||||
window,
|
window,
|
||||||
|
|
|
@ -44,7 +44,7 @@ impl CSSStyleSheet {
|
||||||
|
|
||||||
fn rulelist(&self) -> Root<CSSRuleList> {
|
fn rulelist(&self) -> Root<CSSRuleList> {
|
||||||
self.rulelist.or_init(|| CSSRuleList::new(self.global().as_window(),
|
self.rulelist.or_init(|| CSSRuleList::new(self.global().as_window(),
|
||||||
self,
|
Some(self),
|
||||||
RulesSource::Rules(self.style_stylesheet
|
RulesSource::Rules(self.style_stylesheet
|
||||||
.rules.clone())))
|
.rules.clone())))
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,7 +22,7 @@ pub struct CSSViewportRule {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl CSSViewportRule {
|
impl CSSViewportRule {
|
||||||
fn new_inherited(parent: &CSSStyleSheet, viewportrule: Arc<RwLock<ViewportRule>>) -> CSSViewportRule {
|
fn new_inherited(parent: Option<&CSSStyleSheet>, viewportrule: Arc<RwLock<ViewportRule>>) -> CSSViewportRule {
|
||||||
CSSViewportRule {
|
CSSViewportRule {
|
||||||
cssrule: CSSRule::new_inherited(parent),
|
cssrule: CSSRule::new_inherited(parent),
|
||||||
viewportrule: viewportrule,
|
viewportrule: viewportrule,
|
||||||
|
@ -30,7 +30,7 @@ impl CSSViewportRule {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(unrooted_must_root)]
|
#[allow(unrooted_must_root)]
|
||||||
pub fn new(window: &Window, parent: &CSSStyleSheet,
|
pub fn new(window: &Window, parent: Option<&CSSStyleSheet>,
|
||||||
viewportrule: Arc<RwLock<ViewportRule>>) -> Root<CSSViewportRule> {
|
viewportrule: Arc<RwLock<ViewportRule>>) -> Root<CSSViewportRule> {
|
||||||
reflect_dom_object(box CSSViewportRule::new_inherited(parent, viewportrule),
|
reflect_dom_object(box CSSViewportRule::new_inherited(parent, viewportrule),
|
||||||
window,
|
window,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue