mirror of
https://github.com/servo/servo.git
synced 2025-08-03 20:50:07 +01:00
Pass CSS loader to Servo for insertRule.
This commit is contained in:
parent
975043d0ce
commit
a097a293b5
3 changed files with 29 additions and 8 deletions
|
@ -92,7 +92,10 @@ impl CSSRuleList {
|
||||||
let parent_stylesheet = self.parent_stylesheet.style_stylesheet();
|
let parent_stylesheet = self.parent_stylesheet.style_stylesheet();
|
||||||
let new_rule = {
|
let new_rule = {
|
||||||
let mut guard = parent_stylesheet.shared_lock.write();
|
let mut guard = parent_stylesheet.shared_lock.write();
|
||||||
css_rules.write_with(&mut guard).insert_rule(rule, parent_stylesheet, index, nested)?
|
// FIXME We should probably pass in a proper StylesheetLoader.
|
||||||
|
// See servo/servo#16240
|
||||||
|
css_rules.write_with(&mut guard).insert_rule(rule, parent_stylesheet,
|
||||||
|
index, nested, None)?
|
||||||
// Drop `guard` here,
|
// Drop `guard` here,
|
||||||
// CSSRule::new_specific re-acquires the lock for @support and @media.
|
// CSSRule::new_specific re-acquires the lock for @support and @media.
|
||||||
};
|
};
|
||||||
|
|
|
@ -106,7 +106,12 @@ impl CssRules {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// https://drafts.csswg.org/cssom/#insert-a-css-rule
|
/// https://drafts.csswg.org/cssom/#insert-a-css-rule
|
||||||
pub fn insert_rule(&mut self, rule: &str, parent_stylesheet: &Stylesheet, index: usize, nested: bool)
|
pub fn insert_rule(&mut self,
|
||||||
|
rule: &str,
|
||||||
|
parent_stylesheet: &Stylesheet,
|
||||||
|
index: usize,
|
||||||
|
nested: bool,
|
||||||
|
loader: Option<&StylesheetLoader>)
|
||||||
-> Result<CssRule, RulesMutateError> {
|
-> Result<CssRule, RulesMutateError> {
|
||||||
// Step 1, 2
|
// Step 1, 2
|
||||||
if index > self.0.len() {
|
if index > self.0.len() {
|
||||||
|
@ -126,7 +131,8 @@ impl CssRules {
|
||||||
// XXXManishearth should we also store the namespace map?
|
// XXXManishearth should we also store the namespace map?
|
||||||
let (new_rule, new_state) =
|
let (new_rule, new_state) =
|
||||||
try!(CssRule::parse(&rule, parent_stylesheet,
|
try!(CssRule::parse(&rule, parent_stylesheet,
|
||||||
ParserContextExtraData::default(), state));
|
ParserContextExtraData::default(),
|
||||||
|
state, loader));
|
||||||
|
|
||||||
// Step 5
|
// Step 5
|
||||||
// Computes the maximum allowed parser state at a given index.
|
// Computes the maximum allowed parser state at a given index.
|
||||||
|
@ -343,7 +349,8 @@ impl CssRule {
|
||||||
pub fn parse(css: &str,
|
pub fn parse(css: &str,
|
||||||
parent_stylesheet: &Stylesheet,
|
parent_stylesheet: &Stylesheet,
|
||||||
extra_data: ParserContextExtraData,
|
extra_data: ParserContextExtraData,
|
||||||
state: Option<State>)
|
state: Option<State>,
|
||||||
|
loader: Option<&StylesheetLoader>)
|
||||||
-> Result<(Self, State), SingleRuleParseError> {
|
-> Result<(Self, State), SingleRuleParseError> {
|
||||||
let error_reporter = MemoryHoleReporter;
|
let error_reporter = MemoryHoleReporter;
|
||||||
let mut namespaces = parent_stylesheet.namespaces.write();
|
let mut namespaces = parent_stylesheet.namespaces.write();
|
||||||
|
@ -359,7 +366,7 @@ impl CssRule {
|
||||||
stylesheet_origin: parent_stylesheet.origin,
|
stylesheet_origin: parent_stylesheet.origin,
|
||||||
context: context,
|
context: context,
|
||||||
shared_lock: &parent_stylesheet.shared_lock,
|
shared_lock: &parent_stylesheet.shared_lock,
|
||||||
loader: None,
|
loader: loader,
|
||||||
state: Cell::new(state),
|
state: Cell::new(state),
|
||||||
namespaces: &mut namespaces,
|
namespaces: &mut namespaces,
|
||||||
};
|
};
|
||||||
|
|
|
@ -510,13 +510,24 @@ pub extern "C" fn Servo_CssRules_ListTypes(rules: ServoCssRulesBorrowed,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "C" fn Servo_CssRules_InsertRule(rules: ServoCssRulesBorrowed, sheet: RawServoStyleSheetBorrowed,
|
pub extern "C" fn Servo_CssRules_InsertRule(rules: ServoCssRulesBorrowed,
|
||||||
rule: *const nsACString, index: u32, nested: bool,
|
sheet: RawServoStyleSheetBorrowed,
|
||||||
|
rule: *const nsACString,
|
||||||
|
index: u32,
|
||||||
|
nested: bool,
|
||||||
|
loader: *mut Loader,
|
||||||
|
gecko_stylesheet: *mut ServoStyleSheet,
|
||||||
rule_type: *mut u16) -> nsresult {
|
rule_type: *mut u16) -> nsresult {
|
||||||
let sheet = Stylesheet::as_arc(&sheet);
|
let sheet = Stylesheet::as_arc(&sheet);
|
||||||
|
let loader = if loader.is_null() {
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
Some(StylesheetLoader::new(loader, gecko_stylesheet))
|
||||||
|
};
|
||||||
|
let loader = loader.as_ref().map(|loader| loader as &StyleStylesheetLoader);
|
||||||
let rule = unsafe { rule.as_ref().unwrap().as_str_unchecked() };
|
let rule = unsafe { rule.as_ref().unwrap().as_str_unchecked() };
|
||||||
write_locked_arc(rules, |rules: &mut CssRules| {
|
write_locked_arc(rules, |rules: &mut CssRules| {
|
||||||
match rules.insert_rule(rule, sheet, index as usize, nested) {
|
match rules.insert_rule(rule, sheet, index as usize, nested, loader) {
|
||||||
Ok(new_rule) => {
|
Ok(new_rule) => {
|
||||||
*unsafe { rule_type.as_mut().unwrap() } = new_rule.rule_type() as u16;
|
*unsafe { rule_type.as_mut().unwrap() } = new_rule.rule_type() as u16;
|
||||||
nsresult::NS_OK
|
nsresult::NS_OK
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue