/
engine.rs
50 lines (43 loc) · 1.27 KB
/
engine.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import gfx::renderer::{Renderer, Sink};
import task::spawn_listener;
import comm::chan;
import layout::layout_task;
import layout_task::Layout;
import content::{Content, ExecuteMsg, ParseMsg};
type Engine = chan<Msg>;
enum Msg {
LoadURLMsg(~str),
ExitMsg(chan<()>)
}
fn Engine<S: Sink send copy>(sink: S) -> Engine {
spawn_listener::<Msg>(|request| {
// The renderer
let renderer = Renderer(sink);
// The layout task
let layout = Layout(renderer);
// 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;
}
}
}
})
}