From b2a6568372df4d630321b94b2b69a476dac2cccc Mon Sep 17 00:00:00 2001 From: Jack Moffitt Date: Tue, 6 Aug 2013 14:21:46 -0600 Subject: [PATCH 1/2] Factor out CssStylesheetParams and add parse_style_attribute. --- parser.rs | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/parser.rs b/parser.rs index 3b07482..f8afd2c 100644 --- a/parser.rs +++ b/parser.rs @@ -17,14 +17,9 @@ use wapcaplet::LwcString; use extra::net::url::Url; use netsurfcss::stylesheet::CssUrlResolutionFn; -// This takes a DataStreamFactory instead of a DataStream because -// servo's DataStream contains a comm::Port, which is not sendable, -// so DataStream is an @fn which can't be sent to the lexer task. -// So the DataStreamFactory gives the caller an opportunity to create -// the data stream from inside the lexer task. -pub fn parse_stylesheet(url: Url, input: DataStream) -> CssStylesheet { +fn default_params(url: Url) -> CssStylesheetParams { let resolve: CssUrlResolutionFn = resolve_url; - let params: CssStylesheetParams = CssStylesheetParams { + CssStylesheetParams { params_version: CssStylesheetParamsVersion1, level: CssLevel21, charset: ~"UTF-8", @@ -36,7 +31,16 @@ pub fn parse_stylesheet(url: Url, input: DataStream) -> CssStylesheet { import: None, color: None, font: None, - }; + } +} + +// This takes a DataStreamFactory instead of a DataStream because +// servo's DataStream contains a comm::Port, which is not sendable, +// so DataStream is an @fn which can't be sent to the lexer task. +// So the DataStreamFactory gives the caller an opportunity to create +// the data stream from inside the lexer task. +pub fn parse_stylesheet(url: Url, input: DataStream) -> CssStylesheet { + let params = default_params(url); let mut sheet = css_stylesheet_create(¶ms); loop { @@ -48,7 +52,16 @@ pub fn parse_stylesheet(url: Url, input: DataStream) -> CssStylesheet { } } sheet.data_done(); - return sheet; + sheet +} + +pub fn parse_style_attribute(url: Url, data: &str) -> CssStylesheet { + let mut params = default_params(url); + params.inline_style = true; + let mut sheet = css_stylesheet_create(¶ms); + sheet.append_data(data.as_bytes()); + sheet.data_done(); + sheet } fn resolve_url(_base: &str, _rel: &LwcString) -> CssResult { From bd870b63007d49e9e8edfa528b4bf42944b29abd Mon Sep 17 00:00:00 2001 From: Jack Moffitt Date: Tue, 6 Aug 2013 14:22:02 -0600 Subject: [PATCH 2/2] Include style attributes in selector matching. --- select.rs | 15 +++++++++++++-- stylesheet.rs | 8 +++++++- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/select.rs b/select.rs index 58fc28f..19097fc 100644 --- a/select.rs +++ b/select.rs @@ -54,12 +54,23 @@ impl SelectCtx { a wide range of client-specific details like node relationships, names, and UA defaults. */ - pub fn select_style>(&self, node: &N, handler: &H) -> SelectResults { + pub fn select_style>(&self, + node: &N, + inline_style: Option<&Stylesheet>, + handler: &H) -> SelectResults { let inner_handler = SelectHandlerWrapper { inner: handler }; + let inner_inline_style = match inline_style { + None => None, + Some(ref sheet) => Some(&sheet.inner), + }; SelectResults { - inner: self.inner.select_style::>(node, n::ll::t::CSS_MEDIA_SCREEN, None, &inner_handler) + inner: self.inner.select_style::>( + node, + n::ll::t::CSS_MEDIA_SCREEN, + inner_inline_style, + &inner_handler) } } } diff --git a/stylesheet.rs b/stylesheet.rs index b8e581c..8aa2abf 100644 --- a/stylesheet.rs +++ b/stylesheet.rs @@ -9,7 +9,7 @@ CSS stylesheets, owned types, immutable after creation use extra::net::url::Url; use util::DataStream; use netsurfcss::stylesheet::CssStylesheet; -use parser::parse_stylesheet; +use parser::{parse_stylesheet, parse_style_attribute}; pub struct Stylesheet { inner: CssStylesheet @@ -21,4 +21,10 @@ impl Stylesheet { inner: parse_stylesheet(url, input) } } + + pub fn from_attribute(url: Url, data: &str) -> Stylesheet { + Stylesheet { + inner: parse_style_attribute(url, data) + } + } }