diff options
author | Brian Anderson <banderson@mozilla.com> | 2012-10-30 16:51:21 -0700 |
---|---|---|
committer | Brian Anderson <banderson@mozilla.com> | 2012-10-30 16:51:21 -0700 |
commit | 23b6b386cbc1949f8d9e90d49f48174e36d2dd9a (patch) | |
tree | c7814d84cd096eaaf2eb7044e7a3d329b60df8fd /src/servo/html/cssparse.rs | |
parent | 66f4fdc017f97eb949b54cedfdf3f75a75768947 (diff) | |
download | servo-23b6b386cbc1949f8d9e90d49f48174e36d2dd9a.tar.gz servo-23b6b386cbc1949f8d9e90d49f48174e36d2dd9a.zip |
Move CSS lexing into the parser to create a simpler interface
Diffstat (limited to 'src/servo/html/cssparse.rs')
-rw-r--r-- | src/servo/html/cssparse.rs | 36 |
1 files changed, 13 insertions, 23 deletions
diff --git a/src/servo/html/cssparse.rs b/src/servo/html/cssparse.rs index 10008052345..0f0c7a0bd48 100644 --- a/src/servo/html/cssparse.rs +++ b/src/servo/html/cssparse.rs @@ -3,42 +3,32 @@ Some little helpers for hooking up the HTML parser with the CSS parser */ use std::net::url::Url; +use std::cell::Cell; use resource::resource_task::{ResourceTask, ProgressMsg, Load, Payload, Done}; -use newcss::values::Rule; -use newcss::lexer_util::DataStream; -use newcss::lexer::{Token, lex_css_from_bytes}; +use newcss::values::Stylesheet; +use newcss::util::{DataStream, DataStreamFactory}; -pub fn spawn_css_parser(url: Url, resource_task: ResourceTask) -> comm::Port<~[~Rule]> { +pub fn spawn_css_parser(url: Url, resource_task: ResourceTask) -> comm::Port<Stylesheet> { let result_port = comm::Port(); let result_chan = comm::Chan(&result_port); - // TODO: change copy to move once we have match move - let url = copy url; do task::spawn |move url, copy resource_task| { - let css_stream = spawn_css_lexer_task(copy url, resource_task); - let mut css_rules = newcss::parser::build_stylesheet(move css_stream); - result_chan.send(move css_rules); + let sheet = newcss::parser::parse_stylesheet(copy url, data_stream_factory(copy url, resource_task)); + result_chan.send(move sheet); } return result_port; } -#[allow(non_implicitly_copyable_typarams)] -fn spawn_css_lexer_task(url: Url, resource_task: ResourceTask) -> pipes::Port<Token> { - let (result_chan, result_port) = pipes::stream(); - - do task::spawn |move result_chan, move url| { - assert url.path.ends_with(".css"); +fn data_stream_factory(url: Url, resource_task: ResourceTask) -> DataStreamFactory { + let url = Cell(move url); + return |move url| { let input_port = Port(); - // TODO: change copy to move once the compiler permits it - resource_task.send(Load(copy url, input_port.chan())); - - lex_css_from_bytes(resource_port_to_lexer_stream(input_port), &result_chan); - }; - - return move result_port; + resource_task.send(Load(url.take(), input_port.chan())); + resource_port_to_data_stream(input_port) + } } -fn resource_port_to_lexer_stream(input_port: comm::Port<ProgressMsg>) -> DataStream { +fn resource_port_to_data_stream(input_port: comm::Port<ProgressMsg>) -> DataStream { return || { match input_port.recv() { Payload(move data) => Some(move data), |