diff options
author | Glenn Watson <github@intuitionlibrary.com> | 2017-06-21 10:45:48 +1000 |
---|---|---|
committer | Glenn Watson <github@intuitionlibrary.com> | 2017-06-21 11:02:23 +1000 |
commit | cbeb181c61d973d9426adbcac39d73b4700ce464 (patch) | |
tree | 78dffb017c9be33e51221c48e77b148f812d5159 /components/script/dom/document.rs | |
parent | 6c9e3054424913baa11f30d86c272158b2f21c81 (diff) | |
download | servo-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.rs | 43 |
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 |