diff options
-rw-r--r-- | components/layout/display_list/background.rs | 21 | ||||
-rw-r--r-- | components/layout/display_list/builder.rs | 4 | ||||
-rw-r--r-- | components/script/dom/cssmediarule.rs | 9 | ||||
-rw-r--r-- | components/script/dom/htmllinkelement.rs | 21 | ||||
-rw-r--r-- | components/script/dom/htmlstyleelement.rs | 10 | ||||
-rw-r--r-- | components/script/dom/medialist.rs | 9 | ||||
-rw-r--r-- | components/script/dom/window.rs | 7 |
7 files changed, 56 insertions, 25 deletions
diff --git a/components/layout/display_list/background.rs b/components/layout/display_list/background.rs index 145c069cb85..4036c2efd2c 100644 --- a/components/layout/display_list/background.rs +++ b/components/layout/display_list/background.rs @@ -20,6 +20,7 @@ use style::computed_values::background_attachment::single_value::T as Background use style::computed_values::background_clip::single_value::T as BackgroundClip; use style::computed_values::background_origin::single_value::T as BackgroundOrigin; use style::computed_values::border_image_outset::T as BorderImageOutset; +use style::properties::ComputedValues; use style::properties::style_structs::{self, Background}; use style::values::Either; use style::values::computed::{Angle, GradientItem, BackgroundSize as ComputedBackgroundSize}; @@ -429,7 +430,11 @@ fn convert_ellipse_size_keyword( } } -fn convert_gradient_stops(gradient_items: &[GradientItem], total_length: Au) -> Vec<GradientStop> { +fn convert_gradient_stops( + style: &ComputedValues, + gradient_items: &[GradientItem], + total_length: Au, +) -> Vec<GradientStop> { // Determine the position of each stop per CSS-IMAGES § 3.4. // Only keep the color stops, discard the color interpolation hints. @@ -497,8 +502,8 @@ fn convert_gradient_stops(gradient_items: &[GradientItem], total_length: Au) -> .unwrap(); let end_offset = position_to_offset(end_stop.position.unwrap(), total_length); stop_run = Some(StopRun { - start_offset: start_offset, - end_offset: end_offset, + start_offset, + end_offset, start_index: i - 1, stop_count: end_index, }) @@ -518,7 +523,7 @@ fn convert_gradient_stops(gradient_items: &[GradientItem], total_length: Au) -> assert!(offset.is_finite()); stops.push(GradientStop { offset: offset, - color: stop.color.to_layout(), + color: style.resolve_color(stop.color).to_layout(), }) } stops @@ -533,6 +538,7 @@ fn as_gradient_extend_mode(repeating: bool) -> ExtendMode { } pub fn convert_linear_gradient( + style: &ComputedValues, size: Size2D<Au>, stops: &[GradientItem], direction: LineDirection, @@ -581,19 +587,20 @@ pub fn convert_linear_gradient( // This is the length of the gradient line. let length = Au::from_f32_px((delta.x.to_f32_px() * 2.0).hypot(delta.y.to_f32_px() * 2.0)); - let stops = convert_gradient_stops(stops, length); + let stops = convert_gradient_stops(style, stops, length); let center = Point2D::new(size.width / 2, size.height / 2); Gradient { start_point: (center - delta).to_layout(), end_point: (center + delta).to_layout(), - stops: stops, + stops, extend_mode: as_gradient_extend_mode(repeating), } } pub fn convert_radial_gradient( + style: &ComputedValues, size: Size2D<Au>, stops: &[GradientItem], shape: EndingShape, @@ -620,7 +627,7 @@ pub fn convert_radial_gradient( }, }; - let stops = convert_gradient_stops(stops, radius.width); + let stops = convert_gradient_stops(style, stops, radius.width); RadialGradient { center: center.to_layout(), diff --git a/components/layout/display_list/builder.rs b/components/layout/display_list/builder.rs index b5c252cc64e..16a1fc85770 100644 --- a/components/layout/display_list/builder.rs +++ b/components/layout/display_list/builder.rs @@ -1116,6 +1116,7 @@ impl FragmentDisplayListBuilding for Fragment { let display_item = match gradient.kind { GradientKind::Linear(angle_or_corner) => { let gradient = convert_linear_gradient( + style, placement.tile_size, &gradient.items[..], angle_or_corner, @@ -1130,6 +1131,7 @@ impl FragmentDisplayListBuilding for Fragment { }, GradientKind::Radial(shape, center, _angle) => { let gradient = convert_radial_gradient( + style, placement.tile_size, &gradient.items[..], shape, @@ -1298,6 +1300,7 @@ impl FragmentDisplayListBuilding for Fragment { Either::Second(Image::Gradient(ref gradient)) => Some(match gradient.kind { GradientKind::Linear(angle_or_corner) => BorderDetails::Gradient(GradientBorder { gradient: convert_linear_gradient( + style, bounds.size, &gradient.items[..], angle_or_corner, @@ -1308,6 +1311,7 @@ impl FragmentDisplayListBuilding for Fragment { GradientKind::Radial(shape, center, _angle) => { BorderDetails::RadialGradient(RadialGradientBorder { gradient: convert_radial_gradient( + style, bounds.size, &gradient.items[..], shape, diff --git a/components/script/dom/cssmediarule.rs b/components/script/dom/cssmediarule.rs index 11f05d125a8..0ecdf71a314 100644 --- a/components/script/dom/cssmediarule.rs +++ b/components/script/dom/cssmediarule.rs @@ -16,7 +16,7 @@ use dom::medialist::MediaList; use dom::window::Window; use dom_struct::dom_struct; use servo_arc::Arc; -use style::media_queries::parse_media_query_list; +use style::media_queries::MediaList as StyleMediaList; use style::parser::ParserContext; use style::shared_lock::{Locked, ToCssWithGuard}; use style::stylesheets::{CssRuleType, MediaRule}; @@ -79,8 +79,11 @@ impl CSSMediaRule { ParsingMode::DEFAULT, quirks_mode); - let new_medialist = parse_media_query_list(&context, &mut input, - window.css_error_reporter()); + let new_medialist = StyleMediaList::parse( + &context, + &mut input, + window.css_error_reporter(), + ); let mut guard = self.cssconditionrule.shared_lock().write(); // Clone an Arc because we can’t borrow `guard` twice at the same time. diff --git a/components/script/dom/htmllinkelement.rs b/components/script/dom/htmllinkelement.rs index f55a795ba0d..ab84906d223 100644 --- a/components/script/dom/htmllinkelement.rs +++ b/components/script/dom/htmllinkelement.rs @@ -29,7 +29,7 @@ use std::borrow::ToOwned; use std::cell::Cell; use std::default::Default; use style::attr::AttrValue; -use style::media_queries::parse_media_query_list; +use style::media_queries::MediaList; use style::parser::ParserContext as CssParserContext; use style::str::HTML_SPACE_CHARACTERS; use style::stylesheets::{CssRuleType, Stylesheet}; @@ -277,12 +277,21 @@ impl HTMLLinkElement { let mut input = ParserInput::new(&mq_str); let mut css_parser = CssParser::new(&mut input); let doc_url = document.url(); - let context = CssParserContext::new_for_cssom(&doc_url, Some(CssRuleType::Media), - ParsingMode::DEFAULT, - document.quirks_mode()); + // FIXME(emilio): This looks somewhat fishy, since we use the context + // only to parse the media query list, CssRuleType::Media doesn't make + // much sense. + let context = CssParserContext::new_for_cssom( + &doc_url, + Some(CssRuleType::Media), + ParsingMode::DEFAULT, + document.quirks_mode(), + ); let window = document.window(); - let media = parse_media_query_list(&context, &mut css_parser, - window.css_error_reporter()); + let media = MediaList::parse( + &context, + &mut css_parser, + window.css_error_reporter(), + ); let im_attribute = element.get_attribute(&ns!(), &local_name!("integrity")); let integrity_val = im_attribute.r().map(|a| a.value()); diff --git a/components/script/dom/htmlstyleelement.rs b/components/script/dom/htmlstyleelement.rs index 6a6bc416d2d..6778af92218 100644 --- a/components/script/dom/htmlstyleelement.rs +++ b/components/script/dom/htmlstyleelement.rs @@ -21,7 +21,7 @@ use html5ever::{LocalName, Prefix}; use net_traits::ReferrerPolicy; use servo_arc::Arc; use std::cell::Cell; -use style::media_queries::parse_media_query_list; +use style::media_queries::MediaList; use style::parser::ParserContext as CssParserContext; use style::stylesheets::{CssRuleType, Stylesheet, Origin}; use style_traits::ParsingMode; @@ -91,9 +91,11 @@ impl HTMLStyleElement { let shared_lock = node.owner_doc().style_shared_lock().clone(); let mut input = ParserInput::new(&mq_str); let css_error_reporter = window.css_error_reporter(); - let mq = Arc::new(shared_lock.wrap(parse_media_query_list(&context, - &mut CssParser::new(&mut input), - css_error_reporter))); + let mq = Arc::new(shared_lock.wrap(MediaList::parse( + &context, + &mut CssParser::new(&mut input), + css_error_reporter), + )); let loader = StylesheetLoader::for_element(self.upcast()); let sheet = Stylesheet::from_str(&data, window.get_url(), Origin::Author, mq, diff --git a/components/script/dom/medialist.rs b/components/script/dom/medialist.rs index 449c3c19ea6..2f5b33c1016 100644 --- a/components/script/dom/medialist.rs +++ b/components/script/dom/medialist.rs @@ -13,8 +13,8 @@ use dom::cssstylesheet::CSSStyleSheet; use dom::window::Window; use dom_struct::dom_struct; use servo_arc::Arc; -use style::media_queries::{MediaQuery, parse_media_query_list}; use style::media_queries::MediaList as StyleMediaList; +use style::media_queries::MediaQuery; use style::parser::ParserContext; use style::shared_lock::{SharedRwLock, Locked}; use style::stylesheets::CssRuleType; @@ -80,8 +80,11 @@ impl MediaListMethods for MediaList { let context = ParserContext::new_for_cssom(&url, Some(CssRuleType::Media), ParsingMode::DEFAULT, quirks_mode); - *media_queries = parse_media_query_list(&context, &mut parser, - window.css_error_reporter()); + *media_queries = StyleMediaList::parse( + &context, + &mut parser, + window.css_error_reporter(), + ); } // https://drafts.csswg.org/cssom/#dom-medialist-length diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs index 2db7609bec4..0f259dd2ea7 100644 --- a/components/script/dom/window.rs +++ b/components/script/dom/window.rs @@ -1020,8 +1020,11 @@ impl WindowMethods for Window { let context = CssParserContext::new_for_cssom(&url, Some(CssRuleType::Media), ParsingMode::DEFAULT, quirks_mode); - let media_query_list = media_queries::parse_media_query_list(&context, &mut parser, - self.css_error_reporter()); + let media_query_list = media_queries::MediaList::parse( + &context, + &mut parser, + self.css_error_reporter(), + ); let document = self.Document(); let mql = MediaQueryList::new(&document, media_query_list); self.media_query_lists.push(&*mql); |