From 5b1fede3943191b3ec12d726eae8a947b0310728 Mon Sep 17 00:00:00 2001 From: Keegan McAllister Date: Wed, 16 Oct 2013 17:09:54 -0700 Subject: [PATCH] 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. --- src/components/net/resource_task.rs | 17 ++++++++ .../script/html/hubbub_html_parser.rs | 42 +++++-------------- 2 files changed, 27 insertions(+), 32 deletions(-) diff --git a/src/components/net/resource_task.rs b/src/components/net/resource_task.rs index ce1e02e0820..02ae1c715d9 100644 --- a/src/components/net/resource_task.rs +++ b/src/components/net/resource_task.rs @@ -96,6 +96,23 @@ pub fn start_sending(start_chan: 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 pub type ResourceTask = SharedChan; diff --git a/src/components/script/html/hubbub_html_parser.rs b/src/components/script/html/hubbub_html_parser.rs index 4a503f1c5da..a1b600c2c35 100644 --- a/src/components/script/html/hubbub_html_parser.rs +++ b/src/components/script/html/hubbub_html_parser.rs @@ -21,12 +21,11 @@ use std::comm; use std::comm::{Port, SharedChan}; use std::str; use std::str::eq_slice; -use std::task; use std::from_str::FromStr; use hubbub::hubbub; use servo_msg::constellation_msg::{ConstellationChan, SubpageId}; 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::url::make_url; use extra::url::Url; @@ -193,37 +192,16 @@ fn js_script_listener(to_parent: SharedChan, loop { match from_parent.recv() { JSTaskNewFile(url) => { - let (result_port, result_chan) = comm::stream(); - let resource_task = resource_task.clone(); - 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()); - result_chan.send(None); - break; - } - } + match load_whole_resource(&resource_task, url.clone()) { + Err(_) => { + error!("error loading script %s", url.to_str()); + } + 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) => {