mirror of
https://github.com/servo/servo.git
synced 2025-08-05 13:40:08 +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 ImageResponseMsg, ImageReady, ImageNotReady, ImageFailed;
|
||||||
export ImageCacheTask;
|
export ImageCacheTask;
|
||||||
export ImageCacheTaskClient;
|
export ImageCacheTaskClient;
|
||||||
|
export SyncImageCacheTask;
|
||||||
|
|
||||||
import image::base::{Image, load_from_memory, test_image_bin};
|
import image::base::{Image, load_from_memory, test_image_bin};
|
||||||
import std::net::url::url;
|
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 {
|
struct ImageCache {
|
||||||
/// A handle to the resource task for fetching the image binaries
|
/// A handle to the resource task for fetching the image binaries
|
||||||
resource_task: ResourceTask;
|
resource_task: ResourceTask;
|
||||||
|
@ -1022,3 +1042,27 @@ fn should_return_image_failed_on_wait_if_image_fails_to_load() {
|
||||||
image_cache_task.exit();
|
image_cache_task.exit();
|
||||||
mock_resource_task.send(resource_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