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 { 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) + } + } }