mirror of
https://github.com/servo/servo.git
synced 2025-08-03 04:30:10 +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
|
@ -24,7 +24,7 @@ no_jsmanaged_fields!(RulesSource);
|
|||
#[dom_struct]
|
||||
pub struct CSSRuleList {
|
||||
reflector_: Reflector,
|
||||
sheet: JS<CSSStyleSheet>,
|
||||
sheet: MutNullableHeap<JS<CSSStyleSheet>>,
|
||||
#[ignore_heap_size_of = "Arc"]
|
||||
rules: RulesSource,
|
||||
dom_rules: DOMRefCell<Vec<MutNullableHeap<JS<CSSRule>>>>
|
||||
|
@ -37,7 +37,7 @@ pub enum RulesSource {
|
|||
|
||||
impl CSSRuleList {
|
||||
#[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 {
|
||||
RulesSource::Rules(ref rules) => {
|
||||
rules.0.read().iter().map(|_| MutNullableHeap::new(None)).collect()
|
||||
|
@ -49,14 +49,15 @@ impl CSSRuleList {
|
|||
|
||||
CSSRuleList {
|
||||
reflector_: Reflector::new(),
|
||||
sheet: JS::from_ref(sheet),
|
||||
sheet: MutNullableHeap::new(sheet),
|
||||
rules: rules,
|
||||
dom_rules: DOMRefCell::new(dom_rules),
|
||||
}
|
||||
}
|
||||
|
||||
#[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),
|
||||
window,
|
||||
CSSRuleListBinding::Wrap)
|
||||
|
@ -132,7 +133,9 @@ impl CSSRuleList {
|
|||
};
|
||||
|
||||
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(),
|
||||
index, MutNullableHeap::new(Some(&*dom_rule)));
|
||||
Ok((idx))
|
||||
|
@ -174,15 +177,17 @@ impl CSSRuleListMethods for CSSRuleList {
|
|||
fn Item(&self, idx: u32) -> Option<Root<CSSRule>> {
|
||||
self.dom_rules.borrow().get(idx as usize).map(|rule| {
|
||||
rule.or_init(|| {
|
||||
let sheet = self.sheet.get();
|
||||
let sheet = sheet.as_ref().map(|sheet| &**sheet);
|
||||
match self.rules {
|
||||
RulesSource::Rules(ref rules) => {
|
||||
CSSRule::new_specific(self.global().as_window(),
|
||||
&self.sheet,
|
||||
sheet,
|
||||
rules.0.read()[idx as usize].clone())
|
||||
}
|
||||
RulesSource::Keyframes(ref rules) => {
|
||||
Root::upcast(CSSKeyframeRule::new(self.global().as_window(),
|
||||
&self.sheet,
|
||||
sheet,
|
||||
rules.read()
|
||||
.keyframes[idx as usize]
|
||||
.clone()))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue