aboutsummaryrefslogtreecommitdiffstats
path: root/components/script
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2016-01-28 11:18:24 +0530
committerbors-servo <lbergstrom+bors@mozilla.com>2016-01-28 11:18:24 +0530
commitbc44ae679f0d4a01194777c56e09a48fbebea1ad (patch)
tree2e2dd8ca9e35e2ccbb9b990a282e9bb04212bb16 /components/script
parent0cd034041f5859d6bc6f302f03376ae276611ebf (diff)
parent6a85102a5a1c9187c495eed2fc15d543eaef12d1 (diff)
downloadservo-bc44ae679f0d4a01194777c56e09a48fbebea1ad.tar.gz
servo-bc44ae679f0d4a01194777c56e09a48fbebea1ad.zip
Auto merge of #9401 - glennw:raf-timing, r=jdm
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. <!-- Reviewable:start --> [<img src="https://reviewable.io/review_button.png" height=40 alt="Review on Reviewable"/>](https://reviewable.io/reviews/servo/servo/9401) <!-- Reviewable:end -->
Diffstat (limited to 'components/script')
-rw-r--r--components/script/dom/document.rs16
1 files changed, 11 insertions, 5 deletions
diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs
index b6e1ce8bde0..b5672319837 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,17 @@ impl Document {
callback(*timing);
}
+ // Only send the animation change state message after running any callbacks.
+ // This means that if the animation callback adds a new callback for
+ // the next frame (which is the common case), we won't send a NoAnimationCallbacksPresent
+ // message quickly followed by an AnimationCallbacksPresent message.
+ 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);