diff --git a/CHANGELOG.md b/CHANGELOG.md index 67a233ac42..0d198d7de1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # Unreleased - On X11, fix `ResumeTimeReached` being fired too early. +- On Web, fix a possible panic during event handling # 0.22.0 (2020-03-09) diff --git a/src/platform_impl/web/event_loop/runner.rs b/src/platform_impl/web/event_loop/runner.rs index 398fcaf6cb..7c67eac049 100644 --- a/src/platform_impl/web/event_loop/runner.rs +++ b/src/platform_impl/web/event_loop/runner.rs @@ -202,7 +202,6 @@ impl Shared { // It should only ever be called from send_event fn handle_event(&self, event: Event<'static, T>, control: &mut root::ControlFlow) { let is_closed = self.is_closed(); - match *self.0.runner.borrow_mut() { Some(ref mut runner) => { // An event is being processed, so the runner should be marked busy @@ -227,7 +226,9 @@ impl Shared { // If the runner doesn't exist and this method recurses, it will recurse infinitely if !is_closed && self.0.runner.borrow().is_some() { // Take an event out of the queue and handle it - if let Some(event) = self.0.events.borrow_mut().pop_front() { + // Make sure not to let the borrow_mut live during the next handle_event + let event = { self.0.events.borrow_mut().pop_front() }; + if let Some(event) = event { self.handle_event(event, control); } }