Dragging contenteditable="false" elements causes duplication in Firefox
OS: Windows 10-11 · Device: Desktop or Laptop Any · Browser: Firefox 120+ · Keyboard: US QWERTY
Open case →Scenario
Dragging selected content inside a contenteditable region on Firefox can duplicate nodes or leave ghost fragments—different from Chrome's behavior.
Dragging selected content inside a contenteditable region on Firefox can duplicate nodes or leave ghost fragments—different from Chrome’s behavior.
Visual view of how this scenario connects to its concrete cases and environments. Nodes can be dragged and clicked.
Each row is a concrete case for this scenario, with a dedicated document and playground.
| Case | OS | Device | Browser | Keyboard | Status |
|---|---|---|---|---|---|
| ce-0300-firefox-drag-drop-duplicate-elements-en | Windows 10-11 | Desktop or Laptop Any | Firefox 120+ | US QWERTY | draft |
Open a case to see the detailed description and its dedicated playground.
OS: Windows 10-11 · Device: Desktop or Laptop Any · Browser: Firefox 120+ · Keyboard: US QWERTY
Open case →Other scenarios that share similar tags or category.
Using the HTML drag-and-drop API inside or alongside contenteditable regions often diverges from behavior on plain elements: default actions, `contenteditable` hit-testing, and `beforeinput`/`drop` ordering differ by browser. Custom editors must reconcile native DnD with their own selection model.
Firefox may hide or misplace the caret when moving across contenteditable=true/false boundaries—widgets and embeds inside editors are affected.
Firefox may not show a caret in an empty block-level contenteditable container until the user types or a br placeholder exists—layout and min-height interact with focus rings.
In Firefox, programmatic DOM changes during typing (auto-formatting, spellcheck fixes, framework reconciliation) can desynchronize the internal undo stack. Undo/redo may jump to wrong snapshots or truncate history.
On some engines (notably Firefox for Android / Fenix), beforeinput getTargetRanges() may describe the outer contenteditable host instead of the inner focused editor. Custom handlers that trust targetRanges alone may delete or insert in the parent surface while the user believes they are typing in a nested field.
Have questions, suggestions, or want to share your experience? Join the discussion below.