typedb / typedb-studio

TypeDB Studio (IDE)
https://typedb.com
Mozilla Public License 2.0
191 stars 44 forks source link

Studio crash when closing tabs and move cursor out #747

Closed izmalk closed 10 months ago

izmalk commented 1 year ago

Description

I was closing ~60 opened tabs in my Studio, most of them untitled. I was moving between the right end of the tabs panel and the delete confirmation modal window. I was trying to do it as fast as I can and at some point, I believe, the mouse cursor could have gone too far and exited the Studio window area.

Environment

  1. TypeDB version: 2.18
  2. OS of TypeDB server: 12.6.6
  3. Studio version: 2.18
  4. OS of Studio: 12.6.6
  5. Other environment details:

Reproducible Steps

Steps to create the smallest reproducible scenario:

  1. Close many tabs one by one.
  2. Slip the cursor outside the studio window at wrong moment of time

Expected Output

Nothing happens, you can return cursor back to the Studio window area and continue deleting tabs.

Actual Output

Crash:

Title: Cannot invoke "java.awt.PointerInfo.getLocation()" because the return value of "java.awt.MouseInfo.getPointerInfo()" is null
Trace: java.lang.NullPointerException: Cannot invoke "java.awt.PointerInfo.getLocation()" because the return value of "java.awt.MouseInfo.getPointerInfo()" is null
    at com.vaticle.typedb.studio.framework.common.Util.mousePoint-3ABfNKs(Util.kt:58)
    at com.vaticle.typedb.studio.framework.common.Util.isMouseHover-wH6b6FI(Util.kt:66)
    at com.vaticle.typedb.studio.framework.material.Form.BoxButton_pzZJ40c$mayShowOnTargetHover$55(Form.kt:764)
    at com.vaticle.typedb.studio.framework.material.Form.access$BoxButton_pzZJ40c$mayShowOnTargetHover$55(Form.kt:117)
    at com.vaticle.typedb.studio.framework.material.Form$BoxButton$1$4.invoke(Form.kt:775)
    at com.vaticle.typedb.studio.framework.material.Form$BoxButton$1$4.invoke(Form.kt:774)
    at androidx.compose.ui.input.pointer.PointerMoveFilter_desktopKt$pointerMoveFilter$5.invoke(PointerMoveFilter.desktop.kt:52)
    at androidx.compose.ui.input.pointer.PointerMoveFilter_desktopKt$pointerMoveFilter$5.invoke(PointerMoveFilter.desktop.kt:51)
    at androidx.compose.ui.input.pointer.SuspendingPointerInputFilter_skikoKt$onPointerEvent$1$1$1.invokeSuspend(SuspendingPointerInputFilter.skiko.kt:47)
    at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
    at kotlinx.coroutines.DispatchedTaskKt.resume(DispatchedTask.kt:178)
    at kotlinx.coroutines.DispatchedTaskKt.dispatch(DispatchedTask.kt:166)
    at kotlinx.coroutines.CancellableContinuationImpl.dispatchResume(CancellableContinuationImpl.kt:397)
    at kotlinx.coroutines.CancellableContinuationImpl.resumeImpl(CancellableContinuationImpl.kt:431)
    at kotlinx.coroutines.CancellableContinuationImpl.resumeImpl$default(CancellableContinuationImpl.kt:420)
    at kotlinx.coroutines.CancellableContinuationImpl.resumeWith(CancellableContinuationImpl.kt:328)
    at androidx.compose.ui.input.pointer.SuspendingPointerInputFilter$PointerEventHandlerCoroutine.offerPointerEvent(SuspendingPointerInputFilter.kt:569)
    at androidx.compose.ui.input.pointer.SuspendingPointerInputFilter.dispatchPointerEvent(SuspendingPointerInputFilter.kt:459)
    at androidx.compose.ui.input.pointer.SuspendingPointerInputFilter.onPointerEvent-H0pRuoY(SuspendingPointerInputFilter.kt:472)
    at androidx.compose.ui.input.pointer.Node.dispatchMainEventPass(HitPathTracker.kt:285)
    at androidx.compose.ui.input.pointer.Node.dispatchMainEventPass(HitPathTracker.kt:272)
    at androidx.compose.ui.input.pointer.Node.dispatchMainEventPass(HitPathTracker.kt:272)
    at androidx.compose.ui.input.pointer.Node.dispatchMainEventPass(HitPathTracker.kt:272)
    at androidx.compose.ui.input.pointer.Node.dispatchMainEventPass(HitPathTracker.kt:272)
    at androidx.compose.ui.input.pointer.Node.dispatchMainEventPass(HitPathTracker.kt:272)
    at androidx.compose.ui.input.pointer.Node.dispatchMainEventPass(HitPathTracker.kt:272)
    at androidx.compose.ui.input.pointer.Node.dispatchMainEventPass(HitPathTracker.kt:272)
    at androidx.compose.ui.input.pointer.Node.dispatchMainEventPass(HitPathTracker.kt:272)
    at androidx.compose.ui.input.pointer.NodeParent.dispatchMainEventPass(HitPathTracker.kt:152)
    at androidx.compose.ui.input.pointer.HitPathTracker.dispatchChanges(HitPathTracker.kt:89)
    at androidx.compose.ui.input.pointer.PointerInputEventProcessor.process-BIzXfog(PointerInputEventProcessor.kt:97)
    at androidx.compose.ui.platform.SkiaBasedOwner.processPointerInput-gBdvCQM$ui(SkiaBasedOwner.skiko.kt:356)
    at androidx.compose.ui.platform.SkiaBasedOwner.processPointerInput-gBdvCQM$ui$default(SkiaBasedOwner.skiko.kt:349)
    at androidx.compose.ui.ComposeScene.processMove(ComposeScene.skiko.kt:551)
    at androidx.compose.ui.ComposeScene.processPointerInput(ComposeScene.skiko.kt:499)
    at androidx.compose.ui.ComposeScene.sendPointerEvent-BGSDPeU(ComposeScene.skiko.kt:482)
    at androidx.compose.ui.ComposeScene.sendPointerEvent-BGSDPeU$default(ComposeScene.skiko.kt:451)
    at androidx.compose.ui.awt.ComposeLayer_desktopKt.onMouseEvent(ComposeLayer.desktop.kt:470)
    at androidx.compose.ui.awt.ComposeLayer_desktopKt.access$onMouseEvent(ComposeLayer.desktop.kt:1)
    at androidx.compose.ui.awt.ComposeLayer$onMouseEvent$1.invoke(ComposeLayer.desktop.kt:398)
    at androidx.compose.ui.awt.ComposeLayer$onMouseEvent$1.invoke(ComposeLayer.desktop.kt:391)
    at androidx.compose.ui.awt.ComposeLayer.catchExceptions(ComposeLayer.desktop.kt:109)
    at androidx.compose.ui.awt.ComposeLayer.onMouseEvent(ComposeLayer.desktop.kt:391)
    at androidx.compose.ui.awt.ComposeLayer.access$onMouseEvent(ComposeLayer.desktop.kt:87)
    at androidx.compose.ui.awt.ComposeLayer$5.mouseMoved(ComposeLayer.desktop.kt:378)
    at java.desktop/java.awt.Component.processMouseMotionEvent(Unknown Source)
    at java.desktop/java.awt.Component.processEvent(Unknown Source)
    at java.desktop/java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.desktop/java.awt.Component.dispatchEvent(Unknown Source)
    at java.desktop/java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.desktop/java.awt.EventQueue$4.run(Unknown Source)
    at java.desktop/java.awt.EventQueue$4.run(Unknown Source)
    at java.base/java.security.AccessController.doPrivileged(Unknown Source)
    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.desktop/java.awt.EventQueue$5.run(Unknown Source)
    at java.desktop/java.awt.EventQueue$5.run(Unknown Source)
    at java.base/java.security.AccessController.doPrivileged(Unknown Source)
    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.desktop/java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.desktop/java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.desktop/java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.desktop/java.awt.EventDispatchThread.run(Unknown Source)

Additional information

I wasn't able to repeat the Crash.

james-whiteside commented 10 months ago

Likely a duplicate of https://github.com/vaticle/typedb-studio/issues/795, which has a more detailed description.