delay page freeze/thaw until it's created

This commit is contained in:
Paul Rouget 2015-12-17 12:09:22 +01:00
parent abc127ac23
commit f0b25e16f7

View file

@ -135,6 +135,8 @@ struct InProgressLoad {
layout_chan: LayoutChan, layout_chan: LayoutChan,
/// The current viewport clipping rectangle applying to this pipeline, if any. /// The current viewport clipping rectangle applying to this pipeline, if any.
clip_rect: Option<Rect<f32>>, clip_rect: Option<Rect<f32>>,
/// Window is frozen (navigated away while loading for example).
is_frozen: bool,
/// The requested URL of the load. /// The requested URL of the load.
url: Url, url: Url,
} }
@ -152,6 +154,7 @@ impl InProgressLoad {
layout_chan: layout_chan, layout_chan: layout_chan,
window_size: window_size, window_size: window_size,
clip_rect: None, clip_rect: None,
is_frozen: false,
url: url, url: url,
} }
} }
@ -1319,31 +1322,38 @@ impl ScriptTask {
/// Handles freeze message /// Handles freeze message
fn handle_freeze_msg(&self, id: PipelineId) { fn handle_freeze_msg(&self, id: PipelineId) {
// Workaround for a race condition when navigating before the initial page has if let Some(root_page) = self.page.borrow().as_ref() {
// been constructed c.f. https://github.com/servo/servo/issues/7677 if let Some(ref inner_page) = root_page.find(id) {
if self.page.borrow().is_none() { let window = inner_page.window();
return window.freeze();
}; return;
let page = self.root_page(); }
let page = page.find(id).expect("ScriptTask: received freeze msg for a }
pipeline ID not associated with this script task. This is a bug."); let mut loads = self.incomplete_loads.borrow_mut();
let window = page.window(); if let Some(ref mut load) = loads.iter_mut().find(|load| load.pipeline_id == id) {
window.freeze(); load.is_frozen = true;
return;
}
panic!("freeze sent to nonexistent pipeline");
} }
/// Handles thaw message /// Handles thaw message
fn handle_thaw_msg(&self, id: PipelineId) { fn handle_thaw_msg(&self, id: PipelineId) {
// We should only get this message when moving in history, so all pages requested if let Some(ref inner_page) = self.root_page().find(id) {
// should exist. let needed_reflow = inner_page.set_reflow_status(false);
let page = self.root_page().find(id).unwrap(); if needed_reflow {
self.rebuild_and_force_reflow(&*inner_page, ReflowReason::CachedPageNeededReflow);
let needed_reflow = page.set_reflow_status(false); }
if needed_reflow { let window = inner_page.window();
self.rebuild_and_force_reflow(&*page, ReflowReason::CachedPageNeededReflow); window.thaw();
return;
} }
let mut loads = self.incomplete_loads.borrow_mut();
let window = page.window(); if let Some(ref mut load) = loads.iter_mut().find(|load| load.pipeline_id == id) {
window.thaw(); load.is_frozen = false;
return;
}
panic!("thaw sent to nonexistent pipeline");
} }
fn handle_focus_iframe_msg(&self, fn handle_focus_iframe_msg(&self,
@ -1732,6 +1742,10 @@ impl ScriptTask {
} }
} }
if incomplete.is_frozen {
window.freeze();
}
page_remover.neuter(); page_remover.neuter();
document.get_current_parser().unwrap() document.get_current_parser().unwrap()