mirror of
https://github.com/servo/servo.git
synced 2025-08-03 12:40:06 +01:00
Add a synchronous image cache
This commit is contained in:
parent
033bbbf7a0
commit
18c4263663
1 changed files with 44 additions and 0 deletions
|
@ -2,6 +2,7 @@ export Msg, Prefetch, Decode, GetImage, WaitForImage, Exit;
|
|||
export ImageResponseMsg, ImageReady, ImageNotReady, ImageFailed;
|
||||
export ImageCacheTask;
|
||||
export ImageCacheTaskClient;
|
||||
export SyncImageCacheTask;
|
||||
|
||||
import image::base::{Image, load_from_memory, test_image_bin};
|
||||
import std::net::url::url;
|
||||
|
@ -75,6 +76,25 @@ fn ImageCacheTask_(resource_task: ResourceTask, +decoder_factory: DecoderFactory
|
|||
}
|
||||
}
|
||||
|
||||
fn SyncImageCacheTask(resource_task: ResourceTask) -> ImageCacheTask {
|
||||
do spawn_listener |from_client: Port<Msg>| {
|
||||
let inner_cache = ImageCacheTask(resource_task);
|
||||
|
||||
loop {
|
||||
let msg = from_client.recv();
|
||||
|
||||
match msg {
|
||||
GetImage(url, response) => inner_cache.send(WaitForImage(url, response)),
|
||||
Exit(response) => {
|
||||
inner_cache.send(Exit(response));
|
||||
break;
|
||||
}
|
||||
_ => inner_cache.send(msg)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct ImageCache {
|
||||
/// A handle to the resource task for fetching the image binaries
|
||||
resource_task: ResourceTask;
|
||||
|
@ -1022,3 +1042,27 @@ fn should_return_image_failed_on_wait_if_image_fails_to_load() {
|
|||
image_cache_task.exit();
|
||||
mock_resource_task.send(resource_task::Exit);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn sync_cache_should_wait_for_images() {
|
||||
let mock_resource_task = do mock_resource_task |response| {
|
||||
response.send(resource_task::Payload(test_image_bin()));
|
||||
response.send(resource_task::Done(result::ok(())));
|
||||
};
|
||||
|
||||
let image_cache_task = SyncImageCacheTask(mock_resource_task);
|
||||
let url = make_url(~"file", none);
|
||||
|
||||
image_cache_task.send(Prefetch(copy url));
|
||||
image_cache_task.send(Decode(copy url));
|
||||
|
||||
let response_port = port();
|
||||
image_cache_task.send(GetImage(url, response_port.chan()));
|
||||
match response_port.recv() {
|
||||
ImageReady(_) => (),
|
||||
_ => fail
|
||||
}
|
||||
|
||||
image_cache_task.exit();
|
||||
mock_resource_task.send(resource_task::Exit);
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue