aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--components/constellation/constellation.rs9
-rw-r--r--components/constellation/network_listener.rs10
-rw-r--r--components/script/dom/document.rs19
-rw-r--r--components/script/dom/domimplementation.rs3
-rw-r--r--components/script/dom/domparser.rs6
-rw-r--r--components/script/dom/node.rs2
-rw-r--r--components/script/dom/servoparser/mod.rs3
-rw-r--r--components/script/dom/xmldocument.rs3
-rw-r--r--components/script/dom/xmlhttprequest.rs3
-rw-r--r--components/script/script_thread.rs13
-rw-r--r--components/script_traits/script_msg.rs4
11 files changed, 51 insertions, 24 deletions
diff --git a/components/constellation/constellation.rs b/components/constellation/constellation.rs
index 3fa7ce3c5f7..2eb19e921a5 100644
--- a/components/constellation/constellation.rs
+++ b/components/constellation/constellation.rs
@@ -1110,9 +1110,9 @@ impl<Message, LTF, STF> Constellation<Message, LTF, STF>
FromScriptMsg::PipelineExited => {
self.handle_pipeline_exited(source_pipeline_id);
}
- FromScriptMsg::InitiateNavigateRequest(req_init) => {
+ FromScriptMsg::InitiateNavigateRequest(req_init, cancel_chan) => {
debug!("constellation got initiate navigate request message");
- self.handle_navigate_request(source_pipeline_id, req_init);
+ self.handle_navigate_request(source_pipeline_id, req_init, cancel_chan);
}
FromScriptMsg::ScriptLoadedURLInIFrame(load_info) => {
debug!("constellation got iframe URL load message {:?} {:?} {:?}",
@@ -1689,14 +1689,15 @@ impl<Message, LTF, STF> Constellation<Message, LTF, STF>
fn handle_navigate_request(&self,
id: PipelineId,
- req_init: RequestInit) {
+ req_init: RequestInit,
+ cancel_chan: IpcReceiver<()>) {
let listener = NetworkListener::new(
req_init,
id,
self.public_resource_threads.clone(),
self.network_listener_sender.clone());
- listener.initiate_fetch();
+ listener.initiate_fetch(Some(cancel_chan));
}
// The script thread associated with pipeline_id has loaded a URL in an iframe via script. This
diff --git a/components/constellation/network_listener.rs b/components/constellation/network_listener.rs
index 2a39c4bec94..a6adf9a4c5c 100644
--- a/components/constellation/network_listener.rs
+++ b/components/constellation/network_listener.rs
@@ -41,7 +41,7 @@ impl NetworkListener {
}
}
- pub fn initiate_fetch(&self) {
+ pub fn initiate_fetch(&self, cancel_chan: Option<ipc::IpcReceiver<()>>) {
let (ipc_sender, ipc_receiver) = ipc::channel().expect("Failed to create IPC channel!");
let mut listener = NetworkListener {
@@ -64,7 +64,7 @@ impl NetworkListener {
CoreResourceMsg::Fetch(
listener.req_init.clone(),
- FetchChannels::ResponseMsg(ipc_sender, None))
+ FetchChannels::ResponseMsg(ipc_sender, cancel_chan))
}
};
@@ -108,7 +108,11 @@ impl NetworkListener {
referrer: metadata.referrer.clone(),
});
- self.initiate_fetch();
+ // XXXManishearth we don't have the cancel_chan anymore and
+ // can't use it here.
+ //
+ // Ideally the Fetch code would handle manual redirects on its own
+ self.initiate_fetch(None);
},
_ => {
// Response should be processed by script thread.
diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs
index 66ef28c8e93..5be8e9b768a 100644
--- a/components/script/dom/document.rs
+++ b/components/script/dom/document.rs
@@ -91,6 +91,7 @@ use dom::windowproxy::WindowProxy;
use dom_struct::dom_struct;
use encoding_rs::{Encoding, UTF_8};
use euclid::Point2D;
+use fetch::FetchCanceller;
use html5ever::{LocalName, Namespace, QualName};
use hyper::header::{Header, SetCookie};
use hyper_serde::Serde;
@@ -360,6 +361,8 @@ pub struct Document {
form_id_listener_map: DomRefCell<HashMap<Atom, HashSet<Dom<Element>>>>,
interactive_time: DomRefCell<InteractiveMetrics>,
tti_window: DomRefCell<InteractiveWindow>,
+ /// RAII canceller for Fetch
+ canceller: FetchCanceller,
}
#[derive(JSTraceable, MallocSizeOf)]
@@ -2165,7 +2168,8 @@ impl Document {
source: DocumentSource,
doc_loader: DocumentLoader,
referrer: Option<String>,
- referrer_policy: Option<ReferrerPolicy>)
+ referrer_policy: Option<ReferrerPolicy>,
+ canceller: FetchCanceller)
-> Document {
let url = url.unwrap_or_else(|| ServoUrl::parse("about:blank").unwrap());
@@ -2270,6 +2274,7 @@ impl Document {
form_id_listener_map: Default::default(),
interactive_time: DomRefCell::new(interactive_time),
tti_window: DomRefCell::new(InteractiveWindow::new()),
+ canceller: canceller,
}
}
@@ -2288,7 +2293,8 @@ impl Document {
DocumentSource::NotFromParser,
docloader,
None,
- None))
+ None,
+ Default::default()))
}
pub fn new(window: &Window,
@@ -2302,7 +2308,8 @@ impl Document {
source: DocumentSource,
doc_loader: DocumentLoader,
referrer: Option<String>,
- referrer_policy: Option<ReferrerPolicy>)
+ referrer_policy: Option<ReferrerPolicy>,
+ canceller: FetchCanceller)
-> DomRoot<Document> {
let document = reflect_dom_object(
Box::new(Document::new_inherited(
@@ -2317,7 +2324,8 @@ impl Document {
source,
doc_loader,
referrer,
- referrer_policy
+ referrer_policy,
+ canceller
)),
window,
DocumentBinding::Wrap
@@ -2474,7 +2482,8 @@ impl Document {
DocumentSource::NotFromParser,
DocumentLoader::new(&self.loader()),
None,
- None);
+ None,
+ Default::default());
new_doc.appropriate_template_contents_owner_document.set(Some(&new_doc));
new_doc
})
diff --git a/components/script/dom/domimplementation.rs b/components/script/dom/domimplementation.rs
index 9bed3c14d2f..b81f9284b4a 100644
--- a/components/script/dom/domimplementation.rs
+++ b/components/script/dom/domimplementation.rs
@@ -137,7 +137,8 @@ impl DOMImplementationMethods for DOMImplementation {
DocumentSource::NotFromParser,
loader,
None,
- None);
+ None,
+ Default::default());
{
// Step 3.
diff --git a/components/script/dom/domparser.rs b/components/script/dom/domparser.rs
index 0c50b45c162..00c18541a9b 100644
--- a/components/script/dom/domparser.rs
+++ b/components/script/dom/domparser.rs
@@ -70,7 +70,8 @@ impl DOMParserMethods for DOMParser {
DocumentSource::FromParser,
loader,
None,
- None);
+ None,
+ Default::default());
ServoParser::parse_html_document(&document, s, url);
document.set_ready_state(DocumentReadyState::Complete);
Ok(document)
@@ -88,7 +89,8 @@ impl DOMParserMethods for DOMParser {
DocumentSource::NotFromParser,
loader,
None,
- None);
+ None,
+ Default::default());
ServoParser::parse_xml_document(&document, s, url);
Ok(document)
}
diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs
index b0f85b1ccfa..664afb72e97 100644
--- a/components/script/dom/node.rs
+++ b/components/script/dom/node.rs
@@ -1814,7 +1814,7 @@ impl Node {
is_html_doc, None,
None, DocumentActivity::Inactive,
DocumentSource::NotFromParser, loader,
- None, None);
+ None, None, Default::default());
DomRoot::upcast::<Node>(document)
},
NodeTypeId::Element(..) => {
diff --git a/components/script/dom/servoparser/mod.rs b/components/script/dom/servoparser/mod.rs
index 7a948890a95..6947ba5e837 100644
--- a/components/script/dom/servoparser/mod.rs
+++ b/components/script/dom/servoparser/mod.rs
@@ -138,7 +138,8 @@ impl ServoParser {
DocumentSource::FromParser,
loader,
None,
- None);
+ None,
+ Default::default());
// Step 2.
document.set_quirks_mode(context_document.quirks_mode());
diff --git a/components/script/dom/xmldocument.rs b/components/script/dom/xmldocument.rs
index acbdea33582..ed67be90900 100644
--- a/components/script/dom/xmldocument.rs
+++ b/components/script/dom/xmldocument.rs
@@ -48,7 +48,8 @@ impl XMLDocument {
source,
doc_loader,
None,
- None),
+ None,
+ Default::default()),
}
}
diff --git a/components/script/dom/xmlhttprequest.rs b/components/script/dom/xmlhttprequest.rs
index e0f29383230..c36a1df6787 100644
--- a/components/script/dom/xmlhttprequest.rs
+++ b/components/script/dom/xmlhttprequest.rs
@@ -1261,7 +1261,8 @@ impl XMLHttpRequest {
DocumentSource::FromParser,
docloader,
None,
- None)
+ None,
+ Default::default())
}
fn filter_response_headers(&self) -> Headers {
diff --git a/components/script/script_thread.rs b/components/script/script_thread.rs
index d969a46fecc..efae319df92 100644
--- a/components/script/script_thread.rs
+++ b/components/script/script_thread.rs
@@ -62,6 +62,7 @@ use dom::worker::TrustedWorkerAddress;
use dom::worklet::WorkletThreadPool;
use dom::workletglobalscope::WorkletGlobalScopeInit;
use euclid::{Point2D, Vector2D, Rect};
+use fetch::FetchCanceller;
use hyper::header::{ContentType, HttpDate, Headers, LastModified};
use hyper::header::ReferrerPolicy as ReferrerPolicyHeader;
use hyper::mime::{Mime, SubLevel, TopLevel};
@@ -170,6 +171,8 @@ struct InProgressLoad {
navigation_start: u64,
/// High res timestamp reporting the time when the browser started this load.
navigation_start_precise: u64,
+ /// For cancelling the fetch
+ canceller: FetchCanceller,
}
impl InProgressLoad {
@@ -198,6 +201,7 @@ impl InProgressLoad {
origin: origin,
navigation_start: (current_time.sec * 1000 + current_time.nsec as i64 / 1000000) as u64,
navigation_start_precise: navigation_start_precise,
+ canceller: Default::default(),
}
}
}
@@ -2215,7 +2219,8 @@ impl ScriptThread {
DocumentSource::FromParser,
loader,
referrer,
- referrer_policy);
+ referrer_policy,
+ incomplete.canceller);
document.set_ready_state(DocumentReadyState::Loading);
self.documents.borrow_mut().insert(incomplete.pipeline_id, &*document);
@@ -2536,7 +2541,7 @@ impl ScriptThread {
/// Instructs the constellation to fetch the document that will be loaded. Stores the InProgressLoad
/// argument until a notification is received that the fetch is complete.
- fn pre_page_load(&self, incomplete: InProgressLoad, load_data: LoadData) {
+ fn pre_page_load(&self, mut incomplete: InProgressLoad, load_data: LoadData) {
let id = incomplete.pipeline_id.clone();
let req_init = RequestInit {
url: load_data.url.clone(),
@@ -2557,7 +2562,9 @@ impl ScriptThread {
let context = ParserContext::new(id, load_data.url);
self.incomplete_parser_contexts.borrow_mut().push((id, context));
- self.script_sender.send((id, ScriptMsg::InitiateNavigateRequest(req_init))).unwrap();
+ let cancel_chan = incomplete.canceller.initialize();
+
+ self.script_sender.send((id, ScriptMsg::InitiateNavigateRequest(req_init, cancel_chan))).unwrap();
self.incomplete_loads.borrow_mut().push(incomplete);
}
diff --git a/components/script_traits/script_msg.rs b/components/script_traits/script_msg.rs
index 92254b3aabd..a9b5f86d8fe 100644
--- a/components/script_traits/script_msg.rs
+++ b/components/script_traits/script_msg.rs
@@ -16,7 +16,7 @@ use canvas_traits::canvas::CanvasMsg;
use devtools_traits::{ScriptToDevtoolsControlMsg, WorkerId};
use euclid::{Point2D, Size2D, TypedSize2D};
use gfx_traits::Epoch;
-use ipc_channel::ipc::IpcSender;
+use ipc_channel::ipc::{IpcReceiver, IpcSender};
use msg::constellation_msg::{BrowsingContextId, FrameType, PipelineId, TraversalDirection};
use msg::constellation_msg::{Key, KeyModifiers, KeyState};
use net_traits::CoreResourceMsg;
@@ -71,7 +71,7 @@ pub enum LogEntry {
pub enum ScriptMsg {
/// Requests are sent to constellation and fetches are checked manually
/// for cross-origin loads
- InitiateNavigateRequest(RequestInit),
+ InitiateNavigateRequest(RequestInit, /* cancellation_chan */ IpcReceiver<()>),
/// Broadcast a storage event to every same-origin pipeline.
/// The strings are key, old value and new value.
BroadcastStorageEvent(StorageType, ServoUrl, Option<String>, Option<String>, Option<String>),