mirror of
https://github.com/servo/servo.git
synced 2025-06-20 23:28:59 +01:00
style: Add a way to update an empty stylesheet for @import.
We'll update the empty stylesheet we've created when instantiating the ImportRule when the stylesheet finishes loading.
This commit is contained in:
parent
a42cfae153
commit
ca93a2dcec
2 changed files with 92 additions and 33 deletions
|
@ -297,4 +297,8 @@ impl MediaList {
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn is_empty(&self) -> bool {
|
||||||
|
self.media_queries.is_empty()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,6 +56,12 @@ pub struct Namespaces {
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct CssRules(pub Vec<CssRule>);
|
pub struct CssRules(pub Vec<CssRule>);
|
||||||
|
|
||||||
|
impl CssRules {
|
||||||
|
pub fn is_empty(&self) -> bool {
|
||||||
|
self.0.is_empty()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub enum RulesMutateError {
|
pub enum RulesMutateError {
|
||||||
Syntax,
|
Syntax,
|
||||||
IndexSize,
|
IndexSize,
|
||||||
|
@ -106,7 +112,8 @@ impl CssRules {
|
||||||
|
|
||||||
// Step 3, 4
|
// Step 3, 4
|
||||||
// XXXManishearth should we also store the namespace map?
|
// XXXManishearth should we also store the namespace map?
|
||||||
let (new_rule, new_state) = try!(CssRule::parse(&rule, parent_stylesheet,
|
let (new_rule, new_state) =
|
||||||
|
try!(CssRule::parse(&rule, parent_stylesheet,
|
||||||
ParserContextExtraData::default(), state));
|
ParserContextExtraData::default(), state));
|
||||||
|
|
||||||
// Step 5
|
// Step 5
|
||||||
|
@ -464,34 +471,67 @@ impl Stylesheet {
|
||||||
environment_encoding: Option<EncodingRef>,
|
environment_encoding: Option<EncodingRef>,
|
||||||
origin: Origin,
|
origin: Origin,
|
||||||
media: MediaList,
|
media: MediaList,
|
||||||
|
stylesheet_loader: Option<&StylesheetLoader>,
|
||||||
error_reporter: Box<ParseErrorReporter + Send>,
|
error_reporter: Box<ParseErrorReporter + Send>,
|
||||||
extra_data: ParserContextExtraData)
|
extra_data: ParserContextExtraData)
|
||||||
-> Stylesheet {
|
-> Stylesheet {
|
||||||
let (string, _) = decode_stylesheet_bytes(
|
let (string, _) = decode_stylesheet_bytes(
|
||||||
bytes, protocol_encoding_label, environment_encoding);
|
bytes, protocol_encoding_label, environment_encoding);
|
||||||
Stylesheet::from_str(&string, base_url, origin, media, error_reporter, extra_data)
|
Stylesheet::from_str(&string,
|
||||||
|
base_url,
|
||||||
|
origin,
|
||||||
|
media,
|
||||||
|
stylesheet_loader,
|
||||||
|
error_reporter,
|
||||||
|
extra_data)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn from_str(css: &str, base_url: ServoUrl, origin: Origin, media: MediaList,
|
pub fn update_from_bytes(existing: &Stylesheet,
|
||||||
|
bytes: &[u8],
|
||||||
|
protocol_encoding_label: Option<&str>,
|
||||||
|
environment_encoding: Option<EncodingRef>,
|
||||||
|
stylesheet_loader: Option<&StylesheetLoader>,
|
||||||
error_reporter: Box<ParseErrorReporter + Send>,
|
error_reporter: Box<ParseErrorReporter + Send>,
|
||||||
extra_data: ParserContextExtraData) -> Stylesheet {
|
extra_data: ParserContextExtraData) {
|
||||||
let mut namespaces = Namespaces::default();
|
assert!(existing.rules.read().is_empty());
|
||||||
let mut rules = vec![];
|
let (string, _) = decode_stylesheet_bytes(
|
||||||
let dirty_on_viewport_size_change;
|
bytes, protocol_encoding_label, environment_encoding);
|
||||||
{
|
Self::update_from_str(existing,
|
||||||
|
&string,
|
||||||
|
stylesheet_loader,
|
||||||
|
error_reporter,
|
||||||
|
extra_data)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn update_from_str(existing: &Stylesheet,
|
||||||
|
css: &str,
|
||||||
|
stylesheet_loader: Option<&StylesheetLoader>,
|
||||||
|
error_reporter: Box<ParseErrorReporter + Send>,
|
||||||
|
extra_data: ParserContextExtraData) {
|
||||||
|
let mut rules = existing.rules.write();
|
||||||
|
let mut namespaces = existing.namespaces.write();
|
||||||
|
|
||||||
|
assert!(rules.is_empty());
|
||||||
|
|
||||||
|
let mut input = Parser::new(css);
|
||||||
let rule_parser = TopLevelRuleParser {
|
let rule_parser = TopLevelRuleParser {
|
||||||
stylesheet_origin: origin,
|
stylesheet_origin: existing.origin,
|
||||||
namespaces: &mut namespaces,
|
namespaces: &mut namespaces,
|
||||||
context: ParserContext::new_with_extra_data(origin, &base_url, error_reporter, extra_data),
|
loader: stylesheet_loader,
|
||||||
|
context: ParserContext::new_with_extra_data(existing.origin,
|
||||||
|
&existing.base_url,
|
||||||
|
error_reporter,
|
||||||
|
extra_data),
|
||||||
state: Cell::new(State::Start),
|
state: Cell::new(State::Start),
|
||||||
};
|
};
|
||||||
let mut input = Parser::new(css);
|
|
||||||
input.look_for_viewport_percentages();
|
input.look_for_viewport_percentages();
|
||||||
|
|
||||||
{
|
{
|
||||||
let mut iter = RuleListParser::new_for_stylesheet(&mut input, rule_parser);
|
let mut iter = RuleListParser::new_for_stylesheet(&mut input, rule_parser);
|
||||||
while let Some(result) = iter.next() {
|
while let Some(result) = iter.next() {
|
||||||
match result {
|
match result {
|
||||||
Ok(rule) => rules.push(rule),
|
Ok(rule) => rules.0.push(rule),
|
||||||
Err(range) => {
|
Err(range) => {
|
||||||
let pos = range.start;
|
let pos = range.start;
|
||||||
let message = format!("Invalid rule: '{}'", iter.input.slice(range));
|
let message = format!("Invalid rule: '{}'", iter.input.slice(range));
|
||||||
|
@ -500,18 +540,33 @@ impl Stylesheet {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
dirty_on_viewport_size_change = input.seen_viewport_percentages();
|
|
||||||
|
existing.dirty_on_viewport_size_change
|
||||||
|
.store(input.seen_viewport_percentages(), Ordering::Release);
|
||||||
}
|
}
|
||||||
|
|
||||||
Stylesheet {
|
pub fn from_str(css: &str, base_url: ServoUrl, origin: Origin,
|
||||||
|
media: MediaList,
|
||||||
|
stylesheet_loader: Option<&StylesheetLoader>,
|
||||||
|
error_reporter: Box<ParseErrorReporter + Send>,
|
||||||
|
extra_data: ParserContextExtraData) -> Stylesheet {
|
||||||
|
let s = Stylesheet {
|
||||||
origin: origin,
|
origin: origin,
|
||||||
base_url: base_url,
|
base_url: base_url,
|
||||||
namespaces: RwLock::new(namespaces),
|
namespaces: RwLock::new(Namespaces::default()),
|
||||||
rules: CssRules::new(rules),
|
rules: CssRules::new(vec![]),
|
||||||
media: Arc::new(RwLock::new(media)),
|
media: Arc::new(RwLock::new(media)),
|
||||||
dirty_on_viewport_size_change: AtomicBool::new(dirty_on_viewport_size_change),
|
dirty_on_viewport_size_change: AtomicBool::new(false),
|
||||||
disabled: AtomicBool::new(false),
|
disabled: AtomicBool::new(false),
|
||||||
}
|
};
|
||||||
|
|
||||||
|
Self::update_from_str(&s,
|
||||||
|
css,
|
||||||
|
stylesheet_loader,
|
||||||
|
error_reporter,
|
||||||
|
extra_data);
|
||||||
|
|
||||||
|
s
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn dirty_on_viewport_size_change(&self) -> bool {
|
pub fn dirty_on_viewport_size_change(&self) -> bool {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue