From 961fcfc46de123e966362f985d64540af6521b9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20W=C3=BClker?= Date: Wed, 4 Sep 2024 13:30:39 +0200 Subject: [PATCH] Only handle most recent resize event in script thread (#33297) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This avoids having to do unnecessary layout work and prevents resize events from accumulating, which looks weird. Signed-off-by: Simon Wülker --- components/script/dom/window.rs | 16 +++++++++------- components/script/script_thread.rs | 2 +- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs index ddc3079d4a1..a815647e1d1 100644 --- a/components/script/dom/window.rs +++ b/components/script/dom/window.rs @@ -13,7 +13,7 @@ use std::rc::Rc; use std::sync::atomic::Ordering; use std::sync::{Arc, Mutex}; use std::time::Duration; -use std::{cmp, env, mem}; +use std::{cmp, env}; use app_units::Au; use backtrace::Backtrace; @@ -216,9 +216,9 @@ pub struct Window { #[no_trace] devtools_marker_sender: DomRefCell>>>, - /// Pending resize events, if any. + /// Most recent unhandled resize event, if any. #[no_trace] - resize_events: DomRefCell>, + unhandled_resize_event: DomRefCell>, /// Parent id associated with this page, if any. #[no_trace] @@ -2339,11 +2339,13 @@ impl Window { } pub fn add_resize_event(&self, event: WindowSizeData, event_type: WindowSizeType) { - self.resize_events.borrow_mut().push((event, event_type)); + // Whenever we receive a new resize event we forget about all the ones that came before + // it, to avoid unnecessary relayouts + *self.unhandled_resize_event.borrow_mut() = Some((event, event_type)) } - pub fn steal_resize_events(&self) -> Vec<(WindowSizeData, WindowSizeType)> { - mem::take(&mut self.resize_events.borrow_mut()) + pub fn take_unhandled_resize_event(&self) -> Option<(WindowSizeData, WindowSizeType)> { + self.unhandled_resize_event.borrow_mut().take() } pub fn set_page_clip_rect_with_new_viewport(&self, viewport: UntypedRect) -> bool { @@ -2615,7 +2617,7 @@ impl Window { bluetooth_thread, bluetooth_extra_permission_data: BluetoothExtraPermissionData::new(), page_clip_rect: Cell::new(MaxRect::max_rect()), - resize_events: Default::default(), + unhandled_resize_event: Default::default(), window_size: Cell::new(window_size), current_viewport: Cell::new(initial_viewport.to_untyped()), suppress_reflow: Cell::new(true), diff --git a/components/script/script_thread.rs b/components/script/script_thread.rs index 1f1687f422a..276c25ba4e7 100644 --- a/components/script/script_thread.rs +++ b/components/script/script_thread.rs @@ -1688,7 +1688,7 @@ impl ScriptThread { // TODO(#31665): Implement the "run the scroll steps" from // https://drafts.csswg.org/cssom-view/#document-run-the-scroll-steps. - for (size, size_type) in document.window().steal_resize_events().into_iter() { + if let Some((size, size_type)) = document.window().take_unhandled_resize_event() { // Resize steps. self.run_the_resize_steps(pipeline_id, size, size_type);