diff --git a/components/compositing/compositor.rs b/components/compositing/compositor.rs index 8f0c12e5bf7..9a8dbaf5f44 100644 --- a/components/compositing/compositor.rs +++ b/components/compositing/compositor.rs @@ -31,6 +31,7 @@ use std::collections::HashMap; use std::fs::File; use std::rc::Rc; use std::sync::mpsc::Sender; +use std::time::{Duration, Instant}; use style_traits::{PagePx, ViewportPx}; use style_traits::viewport::ViewportConstraints; use time::{precise_time_ns, precise_time_s}; @@ -198,6 +199,8 @@ pub struct IOCompositor { /// Whether a scroll is in progress; i.e. whether the user's fingers are down. scroll_in_progress: bool, + in_scroll_transaction: Option, + /// The webrender renderer. webrender: webrender::Renderer, @@ -396,6 +399,7 @@ impl IOCompositor { last_composite_time: 0, ready_to_save_state: ReadyState::Unknown, scroll_in_progress: false, + in_scroll_transaction: None, webrender: state.webrender, webrender_api: state.webrender_api_sender.create_api(), } @@ -1068,11 +1072,17 @@ impl IOCompositor { fn on_scroll_window_event(&mut self, delta: TypedPoint2D, cursor: TypedPoint2D) { + let event_phase = match (self.scroll_in_progress, self.in_scroll_transaction) { + (false, Some(last_scroll)) if last_scroll.elapsed() > Duration::from_millis(80) => + ScrollEventPhase::Start, + (_, _) => ScrollEventPhase::Move(self.scroll_in_progress), + }; + self.in_scroll_transaction = Some(Instant::now()); self.pending_scroll_zoom_events.push(ScrollZoomEvent { magnification: 1.0, delta: delta, cursor: cursor, - phase: ScrollEventPhase::Move(self.scroll_in_progress), + phase: event_phase, event_count: 1, }); }