diff options
-rw-r--r-- | components/constellation/constellation.rs | 9 | ||||
-rw-r--r-- | components/constellation/network_listener.rs | 10 | ||||
-rw-r--r-- | components/script/dom/document.rs | 19 | ||||
-rw-r--r-- | components/script/dom/domimplementation.rs | 3 | ||||
-rw-r--r-- | components/script/dom/domparser.rs | 6 | ||||
-rw-r--r-- | components/script/dom/node.rs | 2 | ||||
-rw-r--r-- | components/script/dom/servoparser/mod.rs | 3 | ||||
-rw-r--r-- | components/script/dom/xmldocument.rs | 3 | ||||
-rw-r--r-- | components/script/dom/xmlhttprequest.rs | 3 | ||||
-rw-r--r-- | components/script/script_thread.rs | 13 | ||||
-rw-r--r-- | components/script_traits/script_msg.rs | 4 |
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>), |