From 9bc67032c3f4495b4de788134f557cc16bd0a1fb Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Tue, 16 Dec 2025 23:05:42 +0000 Subject: [PATCH] fix: validate coordinates before elementsFromPoint on Firefox mobile (#1992) Firefox mobile drag events can provide non-finite coordinate values (`undefined`, `NaN`, `Infinity`) which cause `document.elementsFromPoint()` to throw: "Argument 1 is not a finite floating-point value." **Changes** - Added `Number.isFinite()` validation in `findProjectIdAtPosition()` before calling `elementsFromPoint()` - Returns `null` when coordinates are invalid, gracefully aborting the drop operation ```typescript function findProjectIdAtPosition(mouseX: number, mouseY: number): number | null { // Validate coordinates are finite numbers (required by elementsFromPoint) if (!Number.isFinite(mouseX) || !Number.isFinite(mouseY)) { return null } const elementsUnderMouse = document.elementsFromPoint(mouseX, mouseY) // ... rest of implementation } ``` The caller already handles `null` returns appropriately, treating it as "no valid drop target found." --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: kolaente <13721712+kolaente@users.noreply.github.com> --- frontend/src/composables/useTaskDragToProject.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/frontend/src/composables/useTaskDragToProject.ts b/frontend/src/composables/useTaskDragToProject.ts index c3bb86b32..32a00db2f 100644 --- a/frontend/src/composables/useTaskDragToProject.ts +++ b/frontend/src/composables/useTaskDragToProject.ts @@ -10,6 +10,12 @@ import {success, error} from '@/message' * Searches through elements under the mouse and their parents for data-project-id attribute. */ function findProjectIdAtPosition(mouseX: number, mouseY: number): number | null { + // Validate coordinates are finite numbers (required by elementsFromPoint) + // This prevents errors on Firefox mobile where touch events may provide invalid coordinates + if (!Number.isFinite(mouseX) || !Number.isFinite(mouseY)) { + return null + } + const elementsUnderMouse = document.elementsFromPoint(mouseX, mouseY) for (const el of elementsUnderMouse) {