aboutsummaryrefslogtreecommitdiffstats
path: root/src/servo/engine.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/servo/engine.rs')
-rw-r--r--src/servo/engine.rs85
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<()>)
+}
+