diff options
Diffstat (limited to 'components/script/dom')
-rw-r--r-- | components/script/dom/document.rs | 21 | ||||
-rw-r--r-- | components/script/dom/window.rs | 53 |
2 files changed, 30 insertions, 44 deletions
diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index eacd6a11745..5e40f433da5 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -2,6 +2,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ +use crate::animation_timeline::AnimationTimeline; use crate::document_loader::{DocumentLoader, LoadType}; use crate::dom::attr::Attr; use crate::dom::beforeunloadevent::BeforeUnloadEvent; @@ -380,6 +381,9 @@ pub struct Document { csp_list: DomRefCell<Option<CspList>>, /// https://w3c.github.io/slection-api/#dfn-selection selection: MutNullableDom<Selection>, + /// A timeline for animations which is used for synchronizing animations. + /// https://drafts.csswg.org/web-animations/#timeline + animation_timeline: DomRefCell<AnimationTimeline>, } #[derive(JSTraceable, MallocSizeOf)] @@ -2904,6 +2908,11 @@ impl Document { dirty_webgl_contexts: DomRefCell::new(HashMap::new()), csp_list: DomRefCell::new(None), selection: MutNullableDom::new(None), + animation_timeline: if pref!(layout.animations.test.enabled) { + DomRefCell::new(AnimationTimeline::new_for_testing()) + } else { + DomRefCell::new(AnimationTimeline::new()) + }, } } @@ -3605,6 +3614,18 @@ impl Document { }) .collect() } + + pub fn advance_animation_timeline_for_testing(&self, delta: f64) { + self.animation_timeline.borrow_mut().advance_specific(delta); + } + + pub fn update_animation_timeline(&self) { + self.animation_timeline.borrow_mut().update(); + } + + pub fn current_animation_timeline_value(&self) -> f64 { + self.animation_timeline.borrow().current_value() + } } impl Element { diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs index 481586a71ae..414ef0f2e45 100644 --- a/components/script/dom/window.rs +++ b/components/script/dom/window.rs @@ -173,8 +173,7 @@ pub enum ReflowReason { IFrameLoadEvent, MissingExplicitReflow, ElementStateChanged, - TickAnimations, - AdvanceClock(i32), + PendingReflow, } #[dom_struct] @@ -1550,12 +1549,9 @@ impl Window { /// layout animation clock. pub fn advance_animation_clock(&self, delta: i32) { let pipeline_id = self.upcast::<GlobalScope>().pipeline_id(); - ScriptThread::restyle_animating_nodes_for_advancing_clock(&pipeline_id); - self.force_reflow( - ReflowGoal::TickAnimations, - ReflowReason::AdvanceClock(delta), - None, - ); + self.Document() + .advance_animation_timeline_for_testing(delta as f64 / 1000.); + ScriptThread::handle_tick_all_animations_for_testing(pipeline_id); } /// Reflows the page unconditionally if possible and not suppressed. This @@ -1632,11 +1628,6 @@ impl Window { document.flush_dirty_canvases(); } - let advance_clock_delta = match reason { - ReflowReason::AdvanceClock(delta) => Some(delta), - _ => None, - }; - // Send new document and relevant styles to layout. let needs_display = reflow_goal.needs_display(); let reflow = ScriptReflow { @@ -1651,7 +1642,7 @@ impl Window { script_join_chan: join_chan, dom_count: document.dom_count(), pending_restyles: document.drain_pending_restyles(), - advance_clock_delta, + animation_timeline_value: document.current_animation_timeline_value(), }; self.layout_chan @@ -2453,8 +2444,7 @@ fn should_move_clip_rect(clip_rect: UntypedRect<Au>, new_viewport: UntypedRect<f } fn debug_reflow_events(id: PipelineId, reflow_goal: &ReflowGoal, reason: &ReflowReason) { - let mut debug_msg = format!("**** pipeline={}", id); - debug_msg.push_str(match *reflow_goal { + let goal_string = match *reflow_goal { ReflowGoal::Full => "\tFull", ReflowGoal::TickAnimations => "\tTickAnimations", ReflowGoal::LayoutQuery(ref query_msg, _) => match query_msg { @@ -2471,34 +2461,9 @@ fn debug_reflow_events(id: PipelineId, reflow_goal: &ReflowGoal, reason: &Reflow &QueryMsg::ElementInnerTextQuery(_) => "\tElementInnerTextQuery", &QueryMsg::InnerWindowDimensionsQuery(_) => "\tInnerWindowDimensionsQuery", }, - }); - - debug_msg.push_str(match *reason { - ReflowReason::CachedPageNeededReflow => "\tCachedPageNeededReflow", - ReflowReason::RefreshTick => "\tRefreshTick", - ReflowReason::FirstLoad => "\tFirstLoad", - ReflowReason::KeyEvent => "\tKeyEvent", - ReflowReason::MouseEvent => "\tMouseEvent", - ReflowReason::Query => "\tQuery", - ReflowReason::Timer => "\tTimer", - ReflowReason::Viewport => "\tViewport", - ReflowReason::WindowResize => "\tWindowResize", - ReflowReason::DOMContentLoaded => "\tDOMContentLoaded", - ReflowReason::DocumentLoaded => "\tDocumentLoaded", - ReflowReason::StylesheetLoaded => "\tStylesheetLoaded", - ReflowReason::ImageLoaded => "\tImageLoaded", - ReflowReason::RequestAnimationFrame => "\tRequestAnimationFrame", - ReflowReason::WebFontLoaded => "\tWebFontLoaded", - ReflowReason::WorkletLoaded => "\tWorkletLoaded", - ReflowReason::FramedContentChanged => "\tFramedContentChanged", - ReflowReason::IFrameLoadEvent => "\tIFrameLoadEvent", - ReflowReason::MissingExplicitReflow => "\tMissingExplicitReflow", - ReflowReason::ElementStateChanged => "\tElementStateChanged", - ReflowReason::TickAnimations => "\tTickAnimations", - ReflowReason::AdvanceClock(..) => "\tAdvanceClock", - }); - - println!("{}", debug_msg); + }; + + println!("**** pipeline={}\t{}\t{:?}", id, goal_string, reason); } impl Window { |