mirror of
https://github.com/servo/servo.git
synced 2025-07-29 10:10:34 +01:00
delay page freeze/thaw until it's created
This commit is contained in:
parent
abc127ac23
commit
f0b25e16f7
1 changed files with 34 additions and 20 deletions
|
@ -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()
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue