diff --git a/ports/servoshell/desktop/app.rs b/ports/servoshell/desktop/app.rs index 7bbac47cda3..4f3ce2266c5 100644 --- a/ports/servoshell/desktop/app.rs +++ b/ports/servoshell/desktop/app.rs @@ -42,13 +42,17 @@ pub struct App { preferences: Preferences, servoshell_preferences: ServoShellPreferences, suspended: Cell, - windows: HashMap>, minibrowser: Option, waker: Box, initial_url: ServoUrl, t_start: Instant, t: Instant, state: AppState, + + // This is the last field of the struct to ensure that windows are dropped *after* all other + // references to the relevant rendering contexts have been destroyed. + // (https://github.com/servo/servo/issues/36711) + windows: HashMap>, } /// Action to be taken by the caller of [`App::handle_events`]. diff --git a/ports/servoshell/desktop/headed_window.rs b/ports/servoshell/desktop/headed_window.rs index 6095b5c02e7..a1c7576a8c9 100644 --- a/ports/servoshell/desktop/headed_window.rs +++ b/ports/servoshell/desktop/headed_window.rs @@ -49,7 +49,6 @@ use crate::desktop::keyutils::CMD_OR_CONTROL; use crate::prefs::ServoShellPreferences; pub struct Window { - winit_window: winit::window::Window, screen_size: Size2D, inner_size: Cell>, toolbar_height: Cell>, @@ -72,6 +71,11 @@ pub struct Window { /// The `RenderingContext` of Servo itself. This is used to render Servo results /// temporarily until they can be blitted into the egui scene. rendering_context: Rc, + + // Keep this as the last field of the struct to ensure that the rendering context is + // dropped first. + // (https://github.com/servo/servo/issues/36711) + winit_window: winit::window::Window, } impl Window {