diff options
Diffstat (limited to 'components/net/image_cache_thread.rs')
-rw-r--r-- | components/net/image_cache_thread.rs | 58 |
1 files changed, 30 insertions, 28 deletions
diff --git a/components/net/image_cache_thread.rs b/components/net/image_cache_thread.rs index 8925e6198ca..2fa8401990e 100644 --- a/components/net/image_cache_thread.rs +++ b/components/net/image_cache_thread.rs @@ -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. |