From dfaf28d5cdc2577271c09874b23bed784483a4d8 Mon Sep 17 00:00:00 2001 From: Glenn Watson Date: Fri, 22 Jan 2016 16:00:13 +1000 Subject: [PATCH] Fixes additional calls to rAF. Often, a rAF callback will request another rAF from the callback itself. Previously, the constellation would quickly receive two messages saying that there were no animations, and then there are animations again in the situation above. This would make the compositor tick the new animation straight away, causing strange fluctuations and timings in rAF callbacks. Instead, only send the NoAnimationCallbacks message if the animation callback queue is still empty after invoking the callbacks. This fixes rAF timing, which now runs at the correct (vsync) framerate. --- components/script/dom/document.rs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index b6e1ce8bde0..9edc7bb9c35 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -1199,11 +1199,6 @@ impl Document { { let mut list = self.animation_frame_list.borrow_mut(); animation_frame_list = Vec::from_iter(list.drain()); - - let ConstellationChan(ref chan) = self.window.constellation_chan(); - let event = ConstellationMsg::ChangeRunningAnimationsState(self.window.pipeline(), - AnimationState::NoAnimationCallbacksPresent); - chan.send(event).unwrap(); } let performance = self.window.Performance(); let performance = performance.r(); @@ -1213,6 +1208,13 @@ impl Document { callback(*timing); } + if self.animation_frame_list.borrow().is_empty() { + let ConstellationChan(ref chan) = self.window.constellation_chan(); + let event = ConstellationMsg::ChangeRunningAnimationsState(self.window.pipeline(), + AnimationState::NoAnimationCallbacksPresent); + chan.send(event).unwrap(); + } + self.window.reflow(ReflowGoal::ForDisplay, ReflowQueryType::NoQuery, ReflowReason::RequestAnimationFrame);