diff --git a/components/script/page.rs b/components/script/page.rs index 1955d9c8c2d..e61c3cd1a58 100644 --- a/components/script/page.rs +++ b/components/script/page.rs @@ -91,6 +91,9 @@ pub struct Page { // Child Pages. pub children: Traceable>>>, + + /// Number of pending reflows that were sent while layout was active. + pub pending_reflows: Cell, } pub struct PageIterator { @@ -154,6 +157,7 @@ impl Page { resource_task: Untraceable::new(resource_task), constellation_chan: Untraceable::new(constellation_chan), children: Traceable::new(RefCell::new(vec!())), + pending_reflows: Cell::new(0), } } diff --git a/components/script/script_task.rs b/components/script/script_task.rs index fdbcff82410..e49dc600211 100644 --- a/components/script/script_task.rs +++ b/components/script/script_task.rs @@ -513,6 +513,12 @@ impl ScriptTask { *layout_join_port = None; } self.compositor.set_ready_state(FinishedLoading); + + if page.pending_reflows.get() > 0 { + page.pending_reflows.set(0); + page.damage(MatchSelectorsDocumentDamage); + page.reflow(ReflowForDisplay, self.control_chan.clone(), self.compositor); + } } /// Handles a navigate forward or backward message. @@ -758,8 +764,13 @@ impl ScriptTask { let page = get_page(&*self.page.borrow(), pipeline_id); let frame = page.frame(); if frame.is_some() { - page.damage(MatchSelectorsDocumentDamage); - page.reflow(ReflowForDisplay, self.control_chan.clone(), self.compositor) + let in_layout = page.layout_join_port.deref().borrow().is_some(); + if in_layout { + page.pending_reflows.set(page.pending_reflows.get() + 1); + } else { + page.damage(MatchSelectorsDocumentDamage); + page.reflow(ReflowForDisplay, self.control_chan.clone(), self.compositor) + } } }