diff options
author | Brian Anderson <banderson@mozilla.com> | 2012-10-30 14:39:56 -0700 |
---|---|---|
committer | Brian Anderson <banderson@mozilla.com> | 2012-10-30 14:54:34 -0700 |
commit | 37d45c6872b2a26fc7f396d0f04148b1325873fc (patch) | |
tree | 6048349e9e750058606c1351ce724a2c5172f687 /src | |
parent | 86ce867a1cf880c7076af234685e2f5919b84385 (diff) | |
download | servo-37d45c6872b2a26fc7f396d0f04148b1325873fc.tar.gz servo-37d45c6872b2a26fc7f396d0f04148b1325873fc.zip |
Remove CSS lexer's dependency on resource_task
Diffstat (limited to 'src')
-rw-r--r-- | src/servo/css/lexer.rs | 44 | ||||
-rw-r--r-- | src/servo/html/cssparse.rs | 48 | ||||
-rw-r--r-- | src/servo/html/hubbub_html_parser.rs | 16 | ||||
-rwxr-xr-x | src/servo/servo.rc | 1 |
4 files changed, 61 insertions, 48 deletions
diff --git a/src/servo/css/lexer.rs b/src/servo/css/lexer.rs index f43bbabec73..c0d5af6996a 100644 --- a/src/servo/css/lexer.rs +++ b/src/servo/css/lexer.rs @@ -9,7 +9,7 @@ use pipes::{Port, Chan}; use lexer_util::*; use std::net::url::Url; -use resource::resource_task::{ResourceTask, ProgressMsg, Load, Payload, Done}; +use std::cell::Cell; enum ParserState { CssElement, @@ -225,29 +225,20 @@ impl CssLexer : CssLexerMethods { } } -fn resource_port_to_lexer_stream(input_port: comm::Port<ProgressMsg>) -> DataStream { - return || { - match input_port.recv() { - Payload(move data) => Some(move data), - Done(*) => None - } - } -} - -fn parser(input_port: comm::Port<ProgressMsg>, state : ParserState) -> CssLexer { +fn parser(input: DataStream, state : ParserState) -> CssLexer { return { input_state: { mut lookahead: None, mut buffer: ~[], - input: resource_port_to_lexer_stream(input_port), + input: input, mut eof: false }, mut parser_state: state }; } -fn lex_css_from_bytes(input_port: comm::Port<ProgressMsg>, result_chan : &Chan<Token>) { - let lexer = parser(input_port, CssElement); +pub fn lex_css_from_bytes(input_stream: DataStream, result_chan : &Chan<Token>) { + let lexer = parser(input_stream, CssElement); loop { let token = lexer.parse_css(); @@ -265,28 +256,11 @@ fn spawn_css_lexer_from_string(content : ~str) -> pipes::Port<Token> { let (result_chan, result_port) = pipes::stream(); do task::spawn |move result_chan, move content| { - let input_port = comm::Port(); - input_port.send(Payload(str::to_bytes(content))); - input_port.send(Done(Ok(()))); - - lex_css_from_bytes(input_port, &result_chan); + let content = str::to_bytes(content); + let content = Cell(copy content); + let input = |move content| if !content.is_empty() { Some(content.take()) } else { None }; + lex_css_from_bytes(input, &result_chan); } return move result_port; } - -#[allow(non_implicitly_copyable_typarams)] -pub 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"); - 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(input_port, &result_chan); - }; - - return move result_port; -} diff --git a/src/servo/html/cssparse.rs b/src/servo/html/cssparse.rs new file mode 100644 index 00000000000..108f17e3b3e --- /dev/null +++ b/src/servo/html/cssparse.rs @@ -0,0 +1,48 @@ +/*! +Some little helpers for hooking up the HTML parser with the CSS parser +*/ + +use std::net::url::Url; +use resource::resource_task::{ResourceTask, ProgressMsg, Load, Payload, Done}; +use newcss::values::Rule; +use css::lexer_util::DataStream; +use css::lexer::{Token, lex_css_from_bytes}; + +pub fn spawn_css_parser(url: Url, resource_task: ResourceTask) -> comm::Port<~[~Rule]> { + 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 = css::parser::build_stylesheet(move css_stream); + result_chan.send(move css_rules); + } + + 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"); + 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; +} + +fn resource_port_to_lexer_stream(input_port: comm::Port<ProgressMsg>) -> DataStream { + return || { + match input_port.recv() { + Payload(move data) => Some(move data), + Done(*) => None + } + } +} diff --git a/src/servo/html/hubbub_html_parser.rs b/src/servo/html/hubbub_html_parser.rs index d73d8b01223..73d1f61444f 100644 --- a/src/servo/html/hubbub_html_parser.rs +++ b/src/servo/html/hubbub_html_parser.rs @@ -14,6 +14,7 @@ use hubbub::Attribute; use comm::{Chan, Port}; use std::net::url::Url; +use cssparse::spawn_css_parser; type JSResult = ~[~[u8]]; @@ -54,19 +55,8 @@ fn css_link_listener(to_parent : comm::Chan<Stylesheet>, from_parent : comm::Por loop { match from_parent.recv() { - CSSTaskNewFile(url) => { - 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| { - // TODO: change copy to move once we can move out of closures - let css_stream = css::lexer::spawn_css_lexer_task(copy url, resource_task); - let mut css_rules = css::parser::build_stylesheet(move css_stream); - result_chan.send(move css_rules); - } - - vec::push(&mut result_vec, result_port); + CSSTaskNewFile(move url) => { + result_vec.push(spawn_css_parser(move url, copy resource_task)); } CSSTaskExit => { break; diff --git a/src/servo/servo.rc b/src/servo/servo.rc index c058efc7fcb..0c2867e1d66 100755 --- a/src/servo/servo.rc +++ b/src/servo/servo.rc @@ -92,6 +92,7 @@ pub mod image { pub mod html { pub mod hubbub_html_parser; + pub mod cssparse; } pub mod platform { |