Use fetch_async in the font cache.

This commit is contained in:
Ms2ger 2016-10-11 17:40:19 +02:00
parent a79c06d9c0
commit 953fa89463

View file

@ -5,8 +5,8 @@
use font_template::{FontTemplate, FontTemplateDescriptor}; use font_template::{FontTemplate, FontTemplateDescriptor};
use fontsan; use fontsan;
use ipc_channel::ipc::{self, IpcReceiver, IpcSender}; use ipc_channel::ipc::{self, IpcReceiver, IpcSender};
use ipc_channel::router::ROUTER; use net_traits::{CoreResourceThread, FetchResponseMsg, fetch_async};
use net_traits::{AsyncResponseTarget, LoadContext, CoreResourceThread, ResponseAction, load_async}; use net_traits::request::{Destination, RequestInit, Type as RequestType};
use platform::font_context::FontContextHandle; use platform::font_context::FontContextHandle;
use platform::font_list::SANS_SERIF_FONT_FAMILY; use platform::font_list::SANS_SERIF_FONT_FAMILY;
use platform::font_list::for_each_available_family; use platform::font_list::for_each_available_family;
@ -204,35 +204,33 @@ impl FontCache {
} }
match src { match src {
Source::Url(ref url_source) => { Source::Url(url_source) => {
let url = &url_source.url; // https://drafts.csswg.org/css-fonts/#font-fetching-requirements
let (data_sender, data_receiver) = ipc::channel().unwrap(); let url = url_source.url;
let data_target = AsyncResponseTarget { let request = RequestInit {
sender: data_sender, url: url.clone(),
type_: RequestType::Font,
destination: Destination::Font,
origin: url.clone(),
.. RequestInit::default()
}; };
load_async(LoadContext::Font,
self.core_resource_thread.clone(),
url.clone(),
None,
None,
None,
data_target);
let channel_to_self = self.channel_to_self.clone(); let channel_to_self = self.channel_to_self.clone();
let url = (*url).clone();
let bytes = Mutex::new(Vec::new()); let bytes = Mutex::new(Vec::new());
let response_valid = Mutex::new(false); let response_valid = Mutex::new(false);
ROUTER.add_route(data_receiver.to_opaque(), box move |message| { fetch_async(request, &self.core_resource_thread, move |response| {
let response: ResponseAction = message.to().unwrap();
match response { match response {
ResponseAction::HeadersAvailable(meta_result) => { FetchResponseMsg::ProcessRequestBody |
FetchResponseMsg::ProcessRequestEOF => (),
FetchResponseMsg::ProcessResponse(meta_result) => {
*response_valid.lock().unwrap() = meta_result.is_ok(); *response_valid.lock().unwrap() = meta_result.is_ok();
} }
ResponseAction::DataAvailable(new_bytes) => { FetchResponseMsg::ProcessResponseChunk(new_bytes) => {
if *response_valid.lock().unwrap() { if *response_valid.lock().unwrap() {
bytes.lock().unwrap().extend(new_bytes.into_iter()) bytes.lock().unwrap().extend(new_bytes.into_iter())
} }
} }
ResponseAction::ResponseComplete(response) => { FetchResponseMsg::ProcessResponseEOF(response) => {
if response.is_err() || !*response_valid.lock().unwrap() { if response.is_err() || !*response_valid.lock().unwrap() {
let msg = Command::AddWebFont(family_name.clone(), sources.clone(), sender.clone()); let msg = Command::AddWebFont(family_name.clone(), sources.clone(), sender.clone());
channel_to_self.send(msg).unwrap(); channel_to_self.send(msg).unwrap();