mirror of
https://github.com/servo/servo.git
synced 2025-07-22 23:03:42 +01:00
Only handle most recent resize event in script thread (#33297)
This avoids having to do unnecessary layout work and prevents resize events from accumulating, which looks weird. Signed-off-by: Simon Wülker <simon.wuelker@arcor.de>
This commit is contained in:
parent
fc5f8e9237
commit
961fcfc46d
2 changed files with 10 additions and 8 deletions
|
@ -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<Option<IpcSender<Option<TimelineMarker>>>>,
|
||||
|
||||
/// Pending resize events, if any.
|
||||
/// Most recent unhandled resize event, if any.
|
||||
#[no_trace]
|
||||
resize_events: DomRefCell<Vec<(WindowSizeData, WindowSizeType)>>,
|
||||
unhandled_resize_event: DomRefCell<Option<(WindowSizeData, WindowSizeType)>>,
|
||||
|
||||
/// 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<f32>) -> 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),
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue