aboutsummaryrefslogtreecommitdiffstats
path: root/components/script
diff options
context:
space:
mode:
Diffstat (limited to 'components/script')
-rw-r--r--components/script/layout_interface.rs4
-rw-r--r--components/script/script_task.rs18
2 files changed, 13 insertions, 9 deletions
diff --git a/components/script/layout_interface.rs b/components/script/layout_interface.rs
index b19e789a4ed..2856930b073 100644
--- a/components/script/layout_interface.rs
+++ b/components/script/layout_interface.rs
@@ -11,7 +11,7 @@ use dom::node::LayoutDataRef;
use geom::point::Point2D;
use geom::rect::Rect;
use script_traits::{ScriptControlChan, OpaqueScriptLayoutChannel, UntrustedNodeAddress};
-use servo_msg::constellation_msg::WindowSizeData;
+use servo_msg::constellation_msg::{PipelineExitType, WindowSizeData};
use servo_util::geometry::Au;
use std::any::{Any, AnyRefExt};
use std::comm::{channel, Receiver, Sender};
@@ -50,7 +50,7 @@ pub enum Msg {
/// Requests that the layout task immediately shut down. There must be no more nodes left after
/// this, or layout will crash.
- ExitNow,
+ ExitNow(PipelineExitType),
}
/// Synchronous messages that script can send to layout.
diff --git a/components/script/script_task.rs b/components/script/script_task.rs
index 918d776c59f..4840dab2a3b 100644
--- a/components/script/script_task.rs
+++ b/components/script/script_task.rs
@@ -50,6 +50,7 @@ use servo_msg::constellation_msg::{LoadData, LoadUrlMsg, NavigationDirection, Pi
use servo_msg::constellation_msg::{Failure, FailureMsg, WindowSizeData, Key, KeyState};
use servo_msg::constellation_msg::{KeyModifiers, SUPER, SHIFT, CONTROL, ALT, Repeated, Pressed};
use servo_msg::constellation_msg::{Released};
+use servo_msg::constellation_msg::{PipelineExitType};
use servo_msg::constellation_msg;
use servo_net::image_cache_task::ImageCacheTask;
use servo_net::resource_task::{ResourceTask, Load};
@@ -545,8 +546,11 @@ impl ScriptTask {
// Process the gathered events.
for msg in sequential.into_iter() {
match msg {
- MixedMessage::FromConstellation(ExitPipelineMsg(id)) =>
- if self.handle_exit_pipeline_msg(id) { return false },
+ MixedMessage::FromConstellation(ExitPipelineMsg(id, exit_type)) => {
+ if self.handle_exit_pipeline_msg(id, exit_type) {
+ return false
+ }
+ },
MixedMessage::FromConstellation(inner_msg) => self.handle_msg_from_constellation(inner_msg),
MixedMessage::FromScript(inner_msg) => self.handle_msg_from_script(inner_msg),
MixedMessage::FromDevtools(inner_msg) => self.handle_msg_from_devtools(inner_msg),
@@ -713,20 +717,20 @@ impl ScriptTask {
/// Handles a request to exit the script task and shut down layout.
/// Returns true if the script task should shut down and false otherwise.
- fn handle_exit_pipeline_msg(&self, id: PipelineId) -> bool {
+ fn handle_exit_pipeline_msg(&self, id: PipelineId, exit_type: PipelineExitType) -> bool {
// If root is being exited, shut down all pages
let page = self.page.borrow_mut();
if page.id == id {
debug!("shutting down layout for root page {}", id);
*self.js_context.borrow_mut() = None;
- shut_down_layout(&*page, (*self.js_runtime).ptr);
+ shut_down_layout(&*page, (*self.js_runtime).ptr, exit_type);
return true
}
// otherwise find just the matching page and exit all sub-pages
match page.remove(id) {
Some(ref mut page) => {
- shut_down_layout(&*page, (*self.js_runtime).ptr);
+ shut_down_layout(&*page, (*self.js_runtime).ptr, exit_type);
false
}
// TODO(tkuehn): pipeline closing is currently duplicated across
@@ -1261,7 +1265,7 @@ impl ScriptTask {
}
/// Shuts down layout for the given page tree.
-fn shut_down_layout(page_tree: &Rc<Page>, rt: *mut JSRuntime) {
+fn shut_down_layout(page_tree: &Rc<Page>, rt: *mut JSRuntime, exit_type: PipelineExitType) {
for page in page_tree.iter() {
// Tell the layout task to begin shutting down, and wait until it
// processed this message.
@@ -1290,7 +1294,7 @@ fn shut_down_layout(page_tree: &Rc<Page>, rt: *mut JSRuntime) {
// Destroy the layout task. If there were node leaks, layout will now crash safely.
for page in page_tree.iter() {
let LayoutChan(ref chan) = page.layout_chan;
- chan.send(layout_interface::Msg::ExitNow);
+ chan.send(layout_interface::Msg::ExitNow(exit_type));
}
}