Use fetch_async in the image cache.

This commit is contained in:
Ms2ger 2016-10-10 18:25:42 +02:00
parent e844a36231
commit e8d9546035

View file

@ -5,13 +5,12 @@
use immeta::load_from_buf;
use ipc_channel::ipc::{self, IpcReceiver, IpcSender};
use ipc_channel::router::ROUTER;
use msg::constellation_msg::{PipelineId, ReferrerPolicy};
use net_traits::{AsyncResponseTarget, CoreResourceMsg, CoreResourceThread, LoadConsumer, LoadData, LoadOrigin};
use net_traits::{LoadContext, NetworkError, ResponseAction};
use net_traits::{CoreResourceThread, NetworkError, ResponseAction, fetch_async, FetchResponseMsg, FetchMetadata};
use net_traits::image::base::{Image, ImageMetadata, PixelFormat, load_from_memory};
use net_traits::image_cache_thread::{ImageCacheChan, ImageCacheCommand, ImageCacheThread, ImageState};
use net_traits::image_cache_thread::{ImageCacheResult, ImageOrMetadataAvailable, ImageResponse, UsePlaceholder};
use net_traits::image_cache_thread::ImageResponder;
use net_traits::request::{Destination, RequestInit, Type as RequestType};
use std::borrow::ToOwned;
use std::collections::HashMap;
use std::collections::hash_map::Entry::{Occupied, Vacant};
@ -305,19 +304,6 @@ fn convert_format(format: PixelFormat) -> webrender_traits::ImageFormat {
}
}
struct ImageCacheOrigin;
impl LoadOrigin for ImageCacheOrigin {
fn referrer_url(&self) -> Option<Url> {
None
}
fn referrer_policy(&self) -> Option<ReferrerPolicy> {
None
}
fn pipeline_id(&self) -> Option<PipelineId> {
None
}
}
fn get_placeholder_image(webrender_api: &webrender_traits::RenderApi) -> io::Result<Arc<Image>> {
let mut placeholder_path = try!(resources_dir_path());
placeholder_path.push("rippy.png");
@ -530,25 +516,41 @@ impl ImageCache {
CacheResult::Miss => {
// A new load request! Request the load from
// the resource thread.
let load_data = LoadData::new(LoadContext::Image,
(*ref_url).clone(),
&ImageCacheOrigin);
let (action_sender, action_receiver) = ipc::channel().unwrap();
let response_target = AsyncResponseTarget {
sender: action_sender,
// https://html.spec.whatwg.org/multipage/#update-the-image-data
// step 12.
let request = RequestInit {
url: (*ref_url).clone(),
type_: RequestType::Image,
destination: Destination::Image,
origin: (*ref_url).clone(),
.. RequestInit::default()
};
let msg = CoreResourceMsg::Load(load_data,
LoadConsumer::Listener(response_target),
None);
let progress_sender = self.progress_sender.clone();
ROUTER.add_route(action_receiver.to_opaque(), box move |message| {
let action: ResponseAction = message.to().unwrap();
fetch_async(request, &self.core_resource_thread, move |action| {
let action = match action {
FetchResponseMsg::ProcessRequestBody |
FetchResponseMsg::ProcessRequestEOF => return,
FetchResponseMsg::ProcessResponse(meta_result) => {
ResponseAction::HeadersAvailable(meta_result.map(|m| {
match m {
FetchMetadata::Unfiltered(m) => m,
FetchMetadata::Filtered { unsafe_, .. } => unsafe_
}
}))
}
FetchResponseMsg::ProcessResponseChunk(new_bytes) => {
ResponseAction::DataAvailable(new_bytes)
}
FetchResponseMsg::ProcessResponseEOF(response) => {
ResponseAction::ResponseComplete(response)
}
};
progress_sender.send(ResourceLoadInfo {
action: action,
key: load_key,
}).unwrap();
});
self.core_resource_thread.send(msg).unwrap();
}
CacheResult::Hit => {
// Request is already on its way.