Case ce-0565-chrome-121-oninput-offset-0 · Scenario scenario-ime-interaction-patterns

onInput event missing when typing at offset 0

OS: Windows 11 Device: Desktop Any Browser: Chrome 121.0.6167.86 Keyboard: US QWERTY Status: confirmed
input events regression chrome-121 windows

Phenomenon

In Chrome 121 on Windows, a regression was identified where the input event (and consequently React’s onInput) does not trigger after a beforeinput event if the insertion happens at the absolute start of a text node or block (offset 0). This is particularly disruptive for high-level editor frameworks that rely on the input event to reconcile their internal model with the DOM.

Reproduction Steps

  1. Create a contenteditable container with some text (e.g., “world”).
  2. Programmatically or manually place the caret at offset 0 (before “w”).
  3. Type a single character (e.g., “H”).
  4. Inspect the event log.

Observed Behavior

  1. keydown event: Fires normally.
  2. beforeinput event: Fires with inputType: "insertText" and data: "H".
  3. DOM Change: The character “H” is correctly inserted into the DOM by the browser’s default behavior.
  4. input event: MISSING.
  5. Result: Frameworks like Slate or React do not detect the change, leading to a state-DOM mismatch.

Expected Behavior

The browser should dispatch an input event immediately after the DOM has been modified by the insertText operation, regardless of the caret’s offset.

Impact

  • Data Loss: Since onInput doesn’t fire, the application state is not updated with the new character. If the user continues typing, the whole block might eventually be overwritten or corrupted.
  • Undo/Redo Breakdown: The undo stack may skip this specific character insertion, making the history inconsistent.
  • Framework Failures: Core logic in Slate.js and other virtual-model-based editors fails to trigger, stopping all side effects (like syntax highlighting or auto-save).

Browser Comparison

  • Chrome 120 (and below): Works correctly.
  • Chrome 122+: Fixed.
  • Firefox/Safari: Works correctly; does not exhibit this regression.

References & Solutions

Mitigation: beforeinput Fallback

If you must support Chrome 121, you can use beforeinput to manually trigger a reconciliation if the input event doesn’t follow.

let inputExpected = false;

element.addEventListener('beforeinput', (e) => {
  if (e.inputType === 'insertText' && getSelectionOffset() === 0) {
    inputExpected = true;
    // Set a short timeout to check if 'input' actually fired
    setTimeout(() => {
      if (inputExpected) {
        console.warn('Detected missing input event in Chrome 121. Forcing sync.');
        forceSyncModelWithDOM();
        inputExpected = false;
      }
    }, 10);
  }
});

element.addEventListener('input', (e) => {
  inputExpected = false;
});
Before
|world
Caret is at offset 0, before 'world'
Typing 'H'
H|world
'beforeinput' fires with inputType 'insertText', data 'H'. DOM updates, but 'input' event is missing.
vs
✅ Expected
H|world
Expected: Both 'beforeinput' and 'input' events should fire sequentially.

Browser compatibility matrix

This matrix shows which browser and OS combinations have documented cases for this scenario. The current case is highlighted. Click on a cell to view other cases.

Current case
Confirmed
Draft
No case documented

All variants (detailed table)

Complete list of all cases for this scenario with full environment details.

Case OS Device Browser Keyboard Status
ce-0002-ime-enter-breaks Windows 11 Desktop or Laptop Any Chrome 120.0 Korean (IME) draft
ce-0004-ime-backspace-removes-whole-syllable Windows 11 Desktop or Laptop Any Chrome 120.0 Korean (IME) draft
ce-0022-ime-enter-breaks-firefox Windows 11 Desktop or Laptop Any Firefox 120.0 Korean IME draft
ce-0030-backspace-composition-chrome macOS Ubuntu 22.04 Desktop or Laptop Any Chrome 120.0 Japanese IME draft
ce-0035-backspace-deletes-whole-word macOS Ubuntu 22.04 Desktop or Laptop Any Safari 120.0 US draft
ce-0042-input-events-duplicate Windows 11 Desktop or Laptop Any Edge 120.0 US draft
ce-0058-contenteditable-with-autocomplete macOS Ubuntu 22.04 Desktop or Laptop Any Chrome 120.0 US draft
ce-0070-contenteditable-with-autocapitalize iOS 17.0 iPhone Any Safari 17.0 US draft
ce-0071-contenteditable-with-autocorrect iOS 17.0 iPhone Any Safari 17.0 US draft
ce-0181-japanese-ime-enter-breaks-chrome Windows 11 Desktop or Laptop Any Chrome 120.0 Japanese (IME) draft
ce-0182-chinese-ime-enter-breaks-safari macOS 14.0 Desktop or Laptop Any Safari 17.0 Chinese (IME - Pinyin) draft
ce-0185-japanese-ime-backspace-granularity-chrome Windows 11 Desktop or Laptop Any Chrome 120.0 Japanese (IME) draft
ce-0186-chinese-ime-backspace-granularity-safari macOS 14.0 Desktop or Laptop Any Safari 17.0 Chinese (IME - Pinyin) draft
ce-0195-thai-ime-enter-breaks-chrome Windows 11 Desktop or Laptop Any Chrome 120.0 Thai (IME) draft
ce-0196-vietnamese-ime-enter-breaks-edge Windows 11 Desktop or Laptop Any Edge 120.0 Vietnamese (IME) draft
ce-0199-thai-ime-backspace-granularity-chrome Windows 11 Desktop or Laptop Any Chrome 120.0 Thai (IME) draft
ce-0200-vietnamese-ime-backspace-granularity-edge Windows 11 Desktop or Laptop Any Edge 120.0 Vietnamese (IME) draft
ce-0217-keyboard-handlers-iscomposing-false-ios-safari-korean iOS 17.0+ iPhone or iPad Any Safari 17.0+ Korean (IME) draft
ce-0565-chrome-121-oninput-offset-0 Windows 11 Desktop Any Chrome 121.0.6167.86 US QWERTY confirmed
ce-0579 macOS 15.0 (Sequoia) Desktop Any All Browsers (ProseMirror context) Latest (Nov 2025) Apple Magic Keyboard (US) confirmed
ce-0581 Android 14.0 / 15.0 Smartphone Any Chrome 131.0+ Gboard (Emoji) confirmed

Playground for this case

Use the reported environment as a reference and record what happens in your environment while interacting with the editable area.

Reported environment
OS: Windows 11
Device: Desktop Any
Browser: Chrome 121.0.6167.86
Keyboard: US QWERTY
Your environment
Sample HTML:
Event log
Use this log together with the case description when filing or updating an issue.
0 events
Interact with the editable area to see events here.

Comments & Discussion

Have questions, suggestions, or want to share your experience? Join the discussion below.