diff options
Diffstat (limited to 'src/servo/engine.rs')
-rw-r--r-- | src/servo/engine.rs | 85 |
1 files changed, 50 insertions, 35 deletions
diff --git a/src/servo/engine.rs b/src/servo/engine.rs index 92ae708a2d6..ca5f9b2a5f3 100644 --- a/src/servo/engine.rs +++ b/src/servo/engine.rs @@ -5,46 +5,61 @@ import layout::layout_task; import layout_task::Layout; import content::{Content, ExecuteMsg, ParseMsg, ExitMsg}; -type Engine = chan<Msg>; +class Engine<S:Sink send copy> { + let sink: S; -enum Msg { - LoadURLMsg(~str), - ExitMsg(chan<()>) -} + let renderer: Renderer; + let layout: Layout; + let content: Content; -fn Engine<S: Sink send copy>(sink: S) -> Engine { - spawn_listener::<Msg>(|request| { - // The renderer - let renderer = Renderer(sink); + new(sink: S) { + self.sink = sink; - // The layout task + let renderer = Renderer(sink); let layout = Layout(renderer); + let content = Content(layout, sink); + + self.renderer = renderer; + self.layout = layout; + self.content = content; + } + + fn start() -> chan<Msg> { + do spawn_listener::<Msg> |request| { + while self.handle_request(request.recv()) { + // Go on... + } + } + } + + fn handle_request(request: Msg) -> bool { + alt request { + LoadURLMsg(url) { + let url = copy url; + if (*url).ends_with(".js") { + self.content.send(ExecuteMsg(url)) + } else { + self.content.send(ParseMsg(url)) + } + ret true; + } - // The content task - let content = Content(layout); - - loop { - alt request.recv() { - LoadURLMsg(url) { - let url = copy url; - if (*url).ends_with(".js") { - content.send(ExecuteMsg(url)) - } else { - content.send(ParseMsg(url)) - } - } - - ExitMsg(sender) { - content.send(content::ExitMsg); - layout.send(layout_task::ExitMsg); - listen(|response_channel| { - renderer.send(renderer::ExitMsg(response_channel)); - response_channel.recv(); - }); - sender.send(()); - break; - } + ExitMsg(sender) { + self.content.send(content::ExitMsg); + self.layout.send(layout_task::ExitMsg); + do listen |response_channel| { + self.renderer.send(renderer::ExitMsg(response_channel)); + response_channel.recv(); } + sender.send(()); + ret false; + } } - }) + } } + +enum Msg { + LoadURLMsg(~str), + ExitMsg(chan<()>) +} + |