mirror of
https://github.com/servo/servo.git
synced 2025-08-05 13:40:08 +01:00
Factor out a convenience function load_whole_resource
Also remove an unnecessary spawn in js_script_listener, and remember the final script URL after redirects.
This commit is contained in:
parent
1cd5d9179d
commit
5b1fede394
2 changed files with 27 additions and 32 deletions
|
@ -96,6 +96,23 @@ pub fn start_sending(start_chan: Chan<LoadResponse>,
|
||||||
progress_chan
|
progress_chan
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Convenience function for synchronously loading a whole resource.
|
||||||
|
pub fn load_whole_resource(resource_task: &ResourceTask, url: Url)
|
||||||
|
-> Result<(Metadata, ~[u8]), ()> {
|
||||||
|
let (start_port, start_chan) = comm::stream();
|
||||||
|
resource_task.send(Load(url, start_chan));
|
||||||
|
let response = start_port.recv();
|
||||||
|
|
||||||
|
let mut buf = ~[];
|
||||||
|
loop {
|
||||||
|
match response.progress_port.recv() {
|
||||||
|
Payload(data) => buf.push_all(data),
|
||||||
|
Done(Ok(())) => return Ok((response.metadata, buf)),
|
||||||
|
Done(Err(e)) => return Err(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Handle to a resource task
|
/// Handle to a resource task
|
||||||
pub type ResourceTask = SharedChan<ControlMsg>;
|
pub type ResourceTask = SharedChan<ControlMsg>;
|
||||||
|
|
||||||
|
|
|
@ -21,12 +21,11 @@ use std::comm;
|
||||||
use std::comm::{Port, SharedChan};
|
use std::comm::{Port, SharedChan};
|
||||||
use std::str;
|
use std::str;
|
||||||
use std::str::eq_slice;
|
use std::str::eq_slice;
|
||||||
use std::task;
|
|
||||||
use std::from_str::FromStr;
|
use std::from_str::FromStr;
|
||||||
use hubbub::hubbub;
|
use hubbub::hubbub;
|
||||||
use servo_msg::constellation_msg::{ConstellationChan, SubpageId};
|
use servo_msg::constellation_msg::{ConstellationChan, SubpageId};
|
||||||
use servo_net::image_cache_task::ImageCacheTask;
|
use servo_net::image_cache_task::ImageCacheTask;
|
||||||
use servo_net::resource_task::{Load, Payload, Done, ResourceTask};
|
use servo_net::resource_task::{Load, Payload, Done, ResourceTask, load_whole_resource};
|
||||||
use servo_util::tree::{TreeNodeRef, ElementLike};
|
use servo_util::tree::{TreeNodeRef, ElementLike};
|
||||||
use servo_util::url::make_url;
|
use servo_util::url::make_url;
|
||||||
use extra::url::Url;
|
use extra::url::Url;
|
||||||
|
@ -193,39 +192,18 @@ fn js_script_listener(to_parent: SharedChan<HtmlDiscoveryMessage>,
|
||||||
loop {
|
loop {
|
||||||
match from_parent.recv() {
|
match from_parent.recv() {
|
||||||
JSTaskNewFile(url) => {
|
JSTaskNewFile(url) => {
|
||||||
let (result_port, result_chan) = comm::stream();
|
match load_whole_resource(&resource_task, url.clone()) {
|
||||||
let resource_task = resource_task.clone();
|
Err(_) => {
|
||||||
let url_clone = url.clone();
|
|
||||||
do task::spawn {
|
|
||||||
let (input_port, input_chan) = comm::stream();
|
|
||||||
// TODO: change copy to move once we can move into closures
|
|
||||||
resource_task.send(Load(url.clone(), input_chan));
|
|
||||||
|
|
||||||
let progress_port = input_port.recv().progress_port;
|
|
||||||
let mut buf = ~[];
|
|
||||||
loop {
|
|
||||||
match progress_port.recv() {
|
|
||||||
Payload(data) => {
|
|
||||||
buf.push_all(data);
|
|
||||||
}
|
|
||||||
Done(Ok(*)) => {
|
|
||||||
result_chan.send(Some(buf));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
Done(Err(*)) => {
|
|
||||||
error!("error loading script %s", url.to_str());
|
error!("error loading script %s", url.to_str());
|
||||||
result_chan.send(None);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
Ok((metadata, bytes)) => {
|
||||||
|
result_vec.push(JSFile {
|
||||||
|
data: str::from_utf8(bytes),
|
||||||
|
url: metadata.final_url,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let bytes = result_port.recv();
|
|
||||||
if bytes.is_some() {
|
|
||||||
result_vec.push(JSFile { data: str::from_utf8(bytes.unwrap()), url: url_clone });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
JSTaskNewInlineScript(data, url) => {
|
JSTaskNewInlineScript(data, url) => {
|
||||||
result_vec.push(JSFile { data: data, url: url });
|
result_vec.push(JSFile { data: data, url: url });
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue