aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/document.rs
diff options
context:
space:
mode:
authorGlenn Watson <github@intuitionlibrary.com>2017-06-21 10:45:48 +1000
committerGlenn Watson <github@intuitionlibrary.com>2017-06-21 11:02:23 +1000
commitcbeb181c61d973d9426adbcac39d73b4700ce464 (patch)
tree78dffb017c9be33e51221c48e77b148f812d5159 /components/script/dom/document.rs
parent6c9e3054424913baa11f30d86c272158b2f21c81 (diff)
downloadservo-cbeb181c61d973d9426adbcac39d73b4700ce464.tar.gz
servo-cbeb181c61d973d9426adbcac39d73b4700ce464.zip
Fix rAF callbacks when in spurious mode.
This fixes another rAF bug, that is being exposed by the previous two commits. Previously, the fake timer callback would only be set if we were being called from a non-rAF event handler. Now, if we're in fake / spurious mode, unconditionally set the one shot timer. Otherwise, notify the compositor that animations are present if we're not currently in a rAF callback.
Diffstat (limited to 'components/script/dom/document.rs')
-rw-r--r--components/script/dom/document.rs43
1 files changed, 22 insertions, 21 deletions
diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs
index 2015a2f919a..d603d898f5c 100644
--- a/components/script/dom/document.rs
+++ b/components/script/dom/document.rs
@@ -1538,28 +1538,29 @@ impl Document {
self.animation_frame_ident.set(ident);
self.animation_frame_list.borrow_mut().push((ident, Some(callback)));
- // No need to send a `ChangeRunningAnimationsState` if we're running animation callbacks:
- // we're guaranteed to already be in the "animation callbacks present" state.
- //
- // This reduces CPU usage by avoiding needless thread wakeups in the common case of
- // repeated rAF.
- //
// TODO: Should tick animation only when document is visible
- if !self.running_animation_callbacks.get() {
- if !self.is_faking_animation_frames() {
- let global_scope = self.window.upcast::<GlobalScope>();
- let event = ConstellationMsg::ChangeRunningAnimationsState(
- global_scope.pipeline_id(),
- AnimationState::AnimationCallbacksPresent);
- global_scope.constellation_chan().send(event).unwrap();
- } else {
- let callback = FakeRequestAnimationFrameCallback {
- document: Trusted::new(self),
- };
- self.global()
- .schedule_callback(OneshotTimerCallback::FakeRequestAnimationFrame(callback),
- MsDuration::new(FAKE_REQUEST_ANIMATION_FRAME_DELAY));
- }
+
+ // If we are running 'fake' animation frames, we unconditionally
+ // set up a one-shot timer for script to execute the rAF callbacks.
+ if self.is_faking_animation_frames() {
+ let callback = FakeRequestAnimationFrameCallback {
+ document: Trusted::new(self),
+ };
+ self.global()
+ .schedule_callback(OneshotTimerCallback::FakeRequestAnimationFrame(callback),
+ MsDuration::new(FAKE_REQUEST_ANIMATION_FRAME_DELAY));
+ } else if !self.running_animation_callbacks.get() {
+ // No need to send a `ChangeRunningAnimationsState` if we're running animation callbacks:
+ // we're guaranteed to already be in the "animation callbacks present" state.
+ //
+ // This reduces CPU usage by avoiding needless thread wakeups in the common case of
+ // repeated rAF.
+
+ let global_scope = self.window.upcast::<GlobalScope>();
+ let event = ConstellationMsg::ChangeRunningAnimationsState(
+ global_scope.pipeline_id(),
+ AnimationState::AnimationCallbacksPresent);
+ global_scope.constellation_chan().send(event).unwrap();
}
ident