aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/document_loader.rs
diff options
context:
space:
mode:
authorJosh Matthews <josh@joshmatthews.net>2014-10-17 11:11:46 -0400
committerJosh Matthews <josh@joshmatthews.net>2015-05-11 13:41:52 -0400
commit32a89c945593917f0d7d3c75231b920cf218f2b3 (patch)
treee0c0ab95f1ccfd0f5fe2d384c7645d5629a1f6ba /components/script/document_loader.rs
parent7f0706ed42b33ec1da6bf9741811ca97d566ed45 (diff)
downloadservo-32a89c945593917f0d7d3c75231b920cf218f2b3.tar.gz
servo-32a89c945593917f0d7d3c75231b920cf218f2b3.zip
Make stylesheets block page load.
Diffstat (limited to 'components/script/document_loader.rs')
-rw-r--r--components/script/document_loader.rs22
1 files changed, 14 insertions, 8 deletions
diff --git a/components/script/document_loader.rs b/components/script/document_loader.rs
index bf759788c57..bd144ed6547 100644
--- a/components/script/document_loader.rs
+++ b/components/script/document_loader.rs
@@ -7,11 +7,10 @@
use script_task::{ScriptMsg, ScriptChan};
use msg::constellation_msg::{PipelineId};
-use net_traits::{LoadResponse, Metadata, load_whole_resource, ResourceTask};
-use net_traits::{ControlMsg, LoadData, LoadConsumer};
+use net_traits::{LoadResponse, Metadata, load_whole_resource, ResourceTask, PendingAsyncLoad};
use url::Url;
-use std::sync::mpsc::{Receiver, channel};
+use std::sync::mpsc::Receiver;
#[jstraceable]
#[derive(PartialEq, Clone)]
@@ -69,15 +68,21 @@ impl DocumentLoader {
}
}
- pub fn load_async(&mut self, load: LoadType) -> Receiver<LoadResponse> {
- let (tx, rx) = channel();
+ /// Create a new pending network request, which can be initiated at some point in
+ /// the future.
+ pub fn prep_async_load(&mut self, load: LoadType) -> PendingAsyncLoad {
self.blocking_loads.push(load.clone());
let pipeline = self.notifier_data.as_ref().map(|data| data.pipeline);
- let load_data = LoadData::new(load.url().clone(), pipeline);
- self.resource_task.send(ControlMsg::Load(load_data, LoadConsumer::Channel(tx))).unwrap();
- rx
+ PendingAsyncLoad::new(self.resource_task.clone(), load.url().clone(), pipeline)
+ }
+
+ /// Create and initiate a new network request.
+ pub fn load_async(&mut self, load: LoadType) -> Receiver<LoadResponse> {
+ let pending = self.prep_async_load(load);
+ pending.load()
}
+ /// Create, initiate, and await the response for a new network request.
pub fn load_sync(&mut self, load: LoadType) -> Result<(Metadata, Vec<u8>), String> {
self.blocking_loads.push(load.clone());
let result = load_whole_resource(&self.resource_task, load.url().clone());
@@ -85,6 +90,7 @@ impl DocumentLoader {
result
}
+ /// Mark an in-progress network request complete.
pub fn finish_load(&mut self, load: LoadType) {
let idx = self.blocking_loads.iter().position(|unfinished| *unfinished == load);
self.blocking_loads.remove(idx.expect("unknown completed load"));