mirror of
https://github.com/servo/servo.git
synced 2025-07-23 15:23:42 +01:00
Use cssparser's new_with_line_number_offset
cssparser provides a way to set the initial line number on a ParserInput. This patch changes servo to use this facility, rather than reimplement the same functionality itself.
This commit is contained in:
parent
a266e96d28
commit
546ecaeee9
11 changed files with 26 additions and 60 deletions
|
@ -98,7 +98,7 @@ impl HTMLStyleElement {
|
||||||
shared_lock, Some(&loader),
|
shared_lock, Some(&loader),
|
||||||
win.css_error_reporter(),
|
win.css_error_reporter(),
|
||||||
doc.quirks_mode(),
|
doc.quirks_mode(),
|
||||||
self.line_number);
|
self.line_number as u32);
|
||||||
|
|
||||||
let sheet = Arc::new(sheet);
|
let sheet = Arc::new(sheet);
|
||||||
|
|
||||||
|
|
|
@ -37,7 +37,7 @@ bitflags = "0.7"
|
||||||
bit-vec = "0.4.3"
|
bit-vec = "0.4.3"
|
||||||
byteorder = "1.0"
|
byteorder = "1.0"
|
||||||
cfg-if = "0.1.0"
|
cfg-if = "0.1.0"
|
||||||
cssparser = "0.19.3"
|
cssparser = "0.19.5"
|
||||||
encoding = {version = "0.2", optional = true}
|
encoding = {version = "0.2", optional = true}
|
||||||
euclid = "0.15"
|
euclid = "0.15"
|
||||||
fnv = "1.0"
|
fnv = "1.0"
|
||||||
|
|
|
@ -72,7 +72,7 @@ impl Stylesheet {
|
||||||
stylesheet_loader,
|
stylesheet_loader,
|
||||||
error_reporter,
|
error_reporter,
|
||||||
quirks_mode,
|
quirks_mode,
|
||||||
0u64)
|
0)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Updates an empty stylesheet with a set of bytes that reached over the
|
/// Updates an empty stylesheet with a set of bytes that reached over the
|
||||||
|
|
|
@ -53,8 +53,6 @@ pub struct ParserContext<'a> {
|
||||||
pub url_data: &'a UrlExtraData,
|
pub url_data: &'a UrlExtraData,
|
||||||
/// The current rule type, if any.
|
/// The current rule type, if any.
|
||||||
pub rule_type: Option<CssRuleType>,
|
pub rule_type: Option<CssRuleType>,
|
||||||
/// Line number offsets for inline stylesheets
|
|
||||||
pub line_number_offset: u64,
|
|
||||||
/// The mode to use when parsing.
|
/// The mode to use when parsing.
|
||||||
pub parsing_mode: ParsingMode,
|
pub parsing_mode: ParsingMode,
|
||||||
/// The quirks mode of this stylesheet.
|
/// The quirks mode of this stylesheet.
|
||||||
|
@ -76,7 +74,6 @@ impl<'a> ParserContext<'a> {
|
||||||
stylesheet_origin: stylesheet_origin,
|
stylesheet_origin: stylesheet_origin,
|
||||||
url_data: url_data,
|
url_data: url_data,
|
||||||
rule_type: rule_type,
|
rule_type: rule_type,
|
||||||
line_number_offset: 0u64,
|
|
||||||
parsing_mode: parsing_mode,
|
parsing_mode: parsing_mode,
|
||||||
quirks_mode: quirks_mode,
|
quirks_mode: quirks_mode,
|
||||||
namespaces: None,
|
namespaces: None,
|
||||||
|
@ -109,32 +106,12 @@ impl<'a> ParserContext<'a> {
|
||||||
stylesheet_origin: context.stylesheet_origin,
|
stylesheet_origin: context.stylesheet_origin,
|
||||||
url_data: context.url_data,
|
url_data: context.url_data,
|
||||||
rule_type: Some(rule_type),
|
rule_type: Some(rule_type),
|
||||||
line_number_offset: context.line_number_offset,
|
|
||||||
parsing_mode: context.parsing_mode,
|
parsing_mode: context.parsing_mode,
|
||||||
quirks_mode: context.quirks_mode,
|
quirks_mode: context.quirks_mode,
|
||||||
namespaces: Some(namespaces),
|
namespaces: Some(namespaces),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Create a parser context for inline CSS which accepts additional line offset argument.
|
|
||||||
pub fn new_with_line_number_offset(
|
|
||||||
stylesheet_origin: Origin,
|
|
||||||
url_data: &'a UrlExtraData,
|
|
||||||
line_number_offset: u64,
|
|
||||||
parsing_mode: ParsingMode,
|
|
||||||
quirks_mode: QuirksMode,
|
|
||||||
) -> ParserContext<'a> {
|
|
||||||
ParserContext {
|
|
||||||
stylesheet_origin: stylesheet_origin,
|
|
||||||
url_data: url_data,
|
|
||||||
rule_type: None,
|
|
||||||
line_number_offset: line_number_offset,
|
|
||||||
parsing_mode: parsing_mode,
|
|
||||||
quirks_mode: quirks_mode,
|
|
||||||
namespaces: None,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Get the rule type, which assumes that one is available.
|
/// Get the rule type, which assumes that one is available.
|
||||||
pub fn rule_type(&self) -> CssRuleType {
|
pub fn rule_type(&self) -> CssRuleType {
|
||||||
self.rule_type.expect("Rule type expected, but none was found.")
|
self.rule_type.expect("Rule type expected, but none was found.")
|
||||||
|
@ -148,7 +125,7 @@ impl<'a> ParserContext<'a> {
|
||||||
where R: ParseErrorReporter
|
where R: ParseErrorReporter
|
||||||
{
|
{
|
||||||
let location = SourceLocation {
|
let location = SourceLocation {
|
||||||
line: location.line + self.line_number_offset as u32,
|
line: location.line,
|
||||||
column: location.column,
|
column: location.column,
|
||||||
};
|
};
|
||||||
context.error_reporter.report_error(self.url_data, location, error)
|
context.error_reporter.report_error(self.url_data, location, error)
|
||||||
|
|
|
@ -160,10 +160,7 @@ impl<'a, 'i, R: ParseErrorReporter> AtRuleParser<'i> for TopLevelRuleParser<'a,
|
||||||
name: CowRcStr<'i>,
|
name: CowRcStr<'i>,
|
||||||
input: &mut Parser<'i, 't>
|
input: &mut Parser<'i, 't>
|
||||||
) -> Result<AtRuleType<AtRulePrelude, CssRule>, ParseError<'i>> {
|
) -> Result<AtRuleType<AtRulePrelude, CssRule>, ParseError<'i>> {
|
||||||
let location = get_location_with_offset(
|
let location = get_location_with_offset(input.current_source_location());
|
||||||
input.current_source_location(),
|
|
||||||
self.context.line_number_offset,
|
|
||||||
);
|
|
||||||
match_ignore_ascii_case! { &*name,
|
match_ignore_ascii_case! { &*name,
|
||||||
"import" => {
|
"import" => {
|
||||||
if self.state > State::Imports {
|
if self.state > State::Imports {
|
||||||
|
@ -334,11 +331,7 @@ impl<'a, 'b, 'i, R: ParseErrorReporter> AtRuleParser<'i> for NestedRuleParser<'a
|
||||||
name: CowRcStr<'i>,
|
name: CowRcStr<'i>,
|
||||||
input: &mut Parser<'i, 't>
|
input: &mut Parser<'i, 't>
|
||||||
) -> Result<AtRuleType<AtRulePrelude, CssRule>, ParseError<'i>> {
|
) -> Result<AtRuleType<AtRulePrelude, CssRule>, ParseError<'i>> {
|
||||||
let location =
|
let location = get_location_with_offset(input.current_source_location());
|
||||||
get_location_with_offset(
|
|
||||||
input.current_source_location(),
|
|
||||||
self.context.line_number_offset
|
|
||||||
);
|
|
||||||
|
|
||||||
match_ignore_ascii_case! { &*name,
|
match_ignore_ascii_case! { &*name,
|
||||||
"media" => {
|
"media" => {
|
||||||
|
@ -545,8 +538,7 @@ impl<'a, 'b, 'i, R: ParseErrorReporter> QualifiedRuleParser<'i> for NestedRulePa
|
||||||
url_data: Some(self.context.url_data),
|
url_data: Some(self.context.url_data),
|
||||||
};
|
};
|
||||||
|
|
||||||
let location = get_location_with_offset(input.current_source_location(),
|
let location = get_location_with_offset(input.current_source_location());
|
||||||
self.context.line_number_offset);
|
|
||||||
let selectors = SelectorList::parse(&selector_parser, input)?;
|
let selectors = SelectorList::parse(&selector_parser, input)?;
|
||||||
|
|
||||||
Ok(QualifiedRuleParserPrelude {
|
Ok(QualifiedRuleParserPrelude {
|
||||||
|
@ -575,13 +567,10 @@ impl<'a, 'b, 'i, R: ParseErrorReporter> QualifiedRuleParser<'i> for NestedRulePa
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Calculates the location of a rule's source given an offset.
|
/// Adjust a location's column to accommodate DevTools.
|
||||||
fn get_location_with_offset(
|
fn get_location_with_offset(location: SourceLocation) -> SourceLocation {
|
||||||
location: SourceLocation,
|
|
||||||
offset: u64
|
|
||||||
) -> SourceLocation {
|
|
||||||
SourceLocation {
|
SourceLocation {
|
||||||
line: location.line + offset as u32,
|
line: location.line,
|
||||||
// Column offsets are not yet supported, but Gecko devtools expect 1-based columns.
|
// Column offsets are not yet supported, but Gecko devtools expect 1-based columns.
|
||||||
column: location.column + 1,
|
column: location.column + 1,
|
||||||
}
|
}
|
||||||
|
|
|
@ -73,7 +73,7 @@ impl StylesheetContents {
|
||||||
stylesheet_loader: Option<&StylesheetLoader>,
|
stylesheet_loader: Option<&StylesheetLoader>,
|
||||||
error_reporter: &R,
|
error_reporter: &R,
|
||||||
quirks_mode: QuirksMode,
|
quirks_mode: QuirksMode,
|
||||||
line_number_offset: u64
|
line_number_offset: u32
|
||||||
) -> Self {
|
) -> Self {
|
||||||
let namespaces = RwLock::new(Namespaces::default());
|
let namespaces = RwLock::new(Namespaces::default());
|
||||||
let (rules, source_map_url) = Stylesheet::parse_rules(
|
let (rules, source_map_url) = Stylesheet::parse_rules(
|
||||||
|
@ -311,7 +311,7 @@ impl Stylesheet {
|
||||||
url_data: UrlExtraData,
|
url_data: UrlExtraData,
|
||||||
stylesheet_loader: Option<&StylesheetLoader>,
|
stylesheet_loader: Option<&StylesheetLoader>,
|
||||||
error_reporter: &R,
|
error_reporter: &R,
|
||||||
line_number_offset: u64)
|
line_number_offset: u32)
|
||||||
where R: ParseErrorReporter
|
where R: ParseErrorReporter
|
||||||
{
|
{
|
||||||
let namespaces = RwLock::new(Namespaces::default());
|
let namespaces = RwLock::new(Namespaces::default());
|
||||||
|
@ -349,17 +349,17 @@ impl Stylesheet {
|
||||||
stylesheet_loader: Option<&StylesheetLoader>,
|
stylesheet_loader: Option<&StylesheetLoader>,
|
||||||
error_reporter: &R,
|
error_reporter: &R,
|
||||||
quirks_mode: QuirksMode,
|
quirks_mode: QuirksMode,
|
||||||
line_number_offset: u64
|
line_number_offset: u32
|
||||||
) -> (Vec<CssRule>, Option<String>) {
|
) -> (Vec<CssRule>, Option<String>) {
|
||||||
let mut rules = Vec::new();
|
let mut rules = Vec::new();
|
||||||
let mut input = ParserInput::new(css);
|
let mut input = ParserInput::new_with_line_number_offset(css, line_number_offset);
|
||||||
let mut input = Parser::new(&mut input);
|
let mut input = Parser::new(&mut input);
|
||||||
|
|
||||||
let context =
|
let context =
|
||||||
ParserContext::new_with_line_number_offset(
|
ParserContext::new(
|
||||||
origin,
|
origin,
|
||||||
url_data,
|
url_data,
|
||||||
line_number_offset,
|
None,
|
||||||
PARSING_MODE_DEFAULT,
|
PARSING_MODE_DEFAULT,
|
||||||
quirks_mode
|
quirks_mode
|
||||||
);
|
);
|
||||||
|
@ -410,7 +410,7 @@ impl Stylesheet {
|
||||||
stylesheet_loader: Option<&StylesheetLoader>,
|
stylesheet_loader: Option<&StylesheetLoader>,
|
||||||
error_reporter: &R,
|
error_reporter: &R,
|
||||||
quirks_mode: QuirksMode,
|
quirks_mode: QuirksMode,
|
||||||
line_number_offset: u64)
|
line_number_offset: u32)
|
||||||
-> Stylesheet
|
-> Stylesheet
|
||||||
{
|
{
|
||||||
let contents = StylesheetContents::from_str(
|
let contents = StylesheetContents::from_str(
|
||||||
|
|
|
@ -894,7 +894,7 @@ pub extern "C" fn Servo_StyleSheet_FromUTF8Bytes(
|
||||||
Arc::new(StylesheetContents::from_str(
|
Arc::new(StylesheetContents::from_str(
|
||||||
input, url_data.clone(), origin,
|
input, url_data.clone(), origin,
|
||||||
&global_style_data.shared_lock, loader, &reporter,
|
&global_style_data.shared_lock, loader, &reporter,
|
||||||
quirks_mode.into(), line_number_offset as u64)
|
quirks_mode.into(), line_number_offset)
|
||||||
).into_strong()
|
).into_strong()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -37,7 +37,7 @@ fn test_media_rule<F>(css: &str, callback: F)
|
||||||
let media_list = Arc::new(lock.wrap(MediaList::empty()));
|
let media_list = Arc::new(lock.wrap(MediaList::empty()));
|
||||||
let stylesheet = Stylesheet::from_str(
|
let stylesheet = Stylesheet::from_str(
|
||||||
css, url, Origin::Author, media_list, lock,
|
css, url, Origin::Author, media_list, lock,
|
||||||
None, &CSSErrorReporterTest, QuirksMode::NoQuirks, 0u64);
|
None, &CSSErrorReporterTest, QuirksMode::NoQuirks, 0);
|
||||||
let dummy = Device::new(MediaType::screen(), TypedSize2D::new(200.0, 100.0), ScaleFactor::new(1.0));
|
let dummy = Device::new(MediaType::screen(), TypedSize2D::new(200.0, 100.0), ScaleFactor::new(1.0));
|
||||||
let mut rule_count = 0;
|
let mut rule_count = 0;
|
||||||
let guard = stylesheet.shared_lock.read();
|
let guard = stylesheet.shared_lock.read();
|
||||||
|
@ -56,7 +56,7 @@ fn media_query_test(device: &Device, css: &str, expected_rule_count: usize) {
|
||||||
let media_list = Arc::new(lock.wrap(MediaList::empty()));
|
let media_list = Arc::new(lock.wrap(MediaList::empty()));
|
||||||
let ss = Stylesheet::from_str(
|
let ss = Stylesheet::from_str(
|
||||||
css, url, Origin::Author, media_list, lock,
|
css, url, Origin::Author, media_list, lock,
|
||||||
None, &CSSErrorReporterTest, QuirksMode::NoQuirks, 0u64);
|
None, &CSSErrorReporterTest, QuirksMode::NoQuirks, 0);
|
||||||
let mut rule_count = 0;
|
let mut rule_count = 0;
|
||||||
ss.effective_style_rules(device, &ss.shared_lock.read(), |_| rule_count += 1);
|
ss.effective_style_rules(device, &ss.shared_lock.read(), |_| rule_count += 1);
|
||||||
assert!(rule_count == expected_rule_count, css.to_owned());
|
assert!(rule_count == expected_rule_count, css.to_owned());
|
||||||
|
|
|
@ -57,7 +57,7 @@ fn parse_rules(css: &str) -> Vec<(StyleSource, CascadeLevel)> {
|
||||||
None,
|
None,
|
||||||
&ErrorringErrorReporter,
|
&ErrorringErrorReporter,
|
||||||
QuirksMode::NoQuirks,
|
QuirksMode::NoQuirks,
|
||||||
0u64);
|
0);
|
||||||
let guard = s.shared_lock.read();
|
let guard = s.shared_lock.read();
|
||||||
let rules = s.contents.rules.read_with(&guard);
|
let rules = s.contents.rules.read_with(&guard);
|
||||||
rules.0.iter().filter_map(|rule| {
|
rules.0.iter().filter_map(|rule| {
|
||||||
|
|
|
@ -70,7 +70,7 @@ fn test_parse_stylesheet() {
|
||||||
let lock = SharedRwLock::new();
|
let lock = SharedRwLock::new();
|
||||||
let media = Arc::new(lock.wrap(MediaList::empty()));
|
let media = Arc::new(lock.wrap(MediaList::empty()));
|
||||||
let stylesheet = Stylesheet::from_str(css, url.clone(), Origin::UserAgent, media, lock,
|
let stylesheet = Stylesheet::from_str(css, url.clone(), Origin::UserAgent, media, lock,
|
||||||
None, &CSSErrorReporterTest, QuirksMode::NoQuirks, 0u64);
|
None, &CSSErrorReporterTest, QuirksMode::NoQuirks, 0);
|
||||||
let mut namespaces = Namespaces::default();
|
let mut namespaces = Namespaces::default();
|
||||||
namespaces.default = Some((ns!(html), ()));
|
namespaces.default = Some((ns!(html), ()));
|
||||||
let expected = Stylesheet {
|
let expected = Stylesheet {
|
||||||
|
@ -304,7 +304,7 @@ fn test_report_error_stylesheet() {
|
||||||
let lock = SharedRwLock::new();
|
let lock = SharedRwLock::new();
|
||||||
let media = Arc::new(lock.wrap(MediaList::empty()));
|
let media = Arc::new(lock.wrap(MediaList::empty()));
|
||||||
Stylesheet::from_str(css, url.clone(), Origin::UserAgent, media, lock,
|
Stylesheet::from_str(css, url.clone(), Origin::UserAgent, media, lock,
|
||||||
None, &error_reporter, QuirksMode::NoQuirks, 5u64);
|
None, &error_reporter, QuirksMode::NoQuirks, 5);
|
||||||
|
|
||||||
let mut errors = errors.lock().unwrap();
|
let mut errors = errors.lock().unwrap();
|
||||||
|
|
||||||
|
@ -341,7 +341,7 @@ fn test_no_report_unrecognized_vendor_properties() {
|
||||||
let lock = SharedRwLock::new();
|
let lock = SharedRwLock::new();
|
||||||
let media = Arc::new(lock.wrap(MediaList::empty()));
|
let media = Arc::new(lock.wrap(MediaList::empty()));
|
||||||
Stylesheet::from_str(css, url, Origin::UserAgent, media, lock,
|
Stylesheet::from_str(css, url, Origin::UserAgent, media, lock,
|
||||||
None, &error_reporter, QuirksMode::NoQuirks, 0u64);
|
None, &error_reporter, QuirksMode::NoQuirks, 0);
|
||||||
|
|
||||||
let mut errors = errors.lock().unwrap();
|
let mut errors = errors.lock().unwrap();
|
||||||
let error = errors.pop().unwrap();
|
let error = errors.pop().unwrap();
|
||||||
|
@ -364,7 +364,7 @@ fn test_source_map_url() {
|
||||||
let media = Arc::new(lock.wrap(MediaList::empty()));
|
let media = Arc::new(lock.wrap(MediaList::empty()));
|
||||||
let stylesheet = Stylesheet::from_str(test.0, url.clone(), Origin::UserAgent, media, lock,
|
let stylesheet = Stylesheet::from_str(test.0, url.clone(), Origin::UserAgent, media, lock,
|
||||||
None, &CSSErrorReporterTest, QuirksMode::NoQuirks,
|
None, &CSSErrorReporterTest, QuirksMode::NoQuirks,
|
||||||
0u64);
|
0);
|
||||||
let url_opt = stylesheet.contents.source_map_url.read();
|
let url_opt = stylesheet.contents.source_map_url.read();
|
||||||
assert_eq!(*url_opt, test.1);
|
assert_eq!(*url_opt, test.1);
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,7 +35,7 @@ macro_rules! stylesheet {
|
||||||
None,
|
None,
|
||||||
&$error_reporter,
|
&$error_reporter,
|
||||||
QuirksMode::NoQuirks,
|
QuirksMode::NoQuirks,
|
||||||
0u64
|
0
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue