diff --git a/src/Browser/Avalonia.Browser/BrowserInputHandler.cs b/src/Browser/Avalonia.Browser/BrowserInputHandler.cs index ba97ad07a2f..70337879396 100644 --- a/src/Browser/Avalonia.Browser/BrowserInputHandler.cs +++ b/src/Browser/Avalonia.Browser/BrowserInputHandler.cs @@ -79,10 +79,12 @@ public bool OnPointerMove(string pointerType, long pointerId, double offsetX, do { coalescedEvents = new Lazy?>(() => { + if (argsObj.IsDisposed) + return []; + // To minimize JS interop usage, we resolve all points properties in a single call. const int itemsPerPoint = 6; var pointsProps = InputHelper.GetCoalescedEvents(argsObj); - argsObj.Dispose(); s_intermediatePointsPooledList.Clear(); var pointsCount = pointsProps.Length / itemsPerPoint; @@ -101,8 +103,17 @@ public bool OnPointerMove(string pointerType, long pointerId, double offsetX, do }); } - return RawPointerEvent(type, pointerType!, point, (RawInputModifiers)modifier, pointerId, - coalescedEvents); + try + { + return RawPointerEvent(type, pointerType!, point, (RawInputModifiers)modifier, pointerId, + coalescedEvents); + } + finally + { + // Release the JS handle after processing the event. + // ImmediatePoints is only expected to be accessed synchronously during event processing. + argsObj.Dispose(); + } } public bool OnPointerDown(string pointerType, long pointerId, int buttons, double offsetX, double offsetY,