Case ce-0568-chrome-android-placeholder-korean-ime · Scenario scenario-placeholder-behavior

Placeholder breaks first character of Hangul composition

OS: Android 14.0 Device: Smartphone Any Browser: Chrome 131.0 Keyboard: Korean (IME) Status: confirmed
ime composition placeholder android chrome-131

Phenomenon

A specific regression in Chrome for Android (reported Dec 2025) involves an interaction between the CSS-based placeholder implementation and the Korean IME. When a contenteditable element is empty and displays a placeholder, starting a Korean composition session sometimes causes the browser to reset the DOM as it removes the placeholder, which in turn kills the active composition session for the first character.

Reproduction Steps

  1. Create a contenteditable element with a placeholder attribute or a CSS :empty:before rule.
  2. Open the page in Chrome for Android (v131+).
  3. Focus the empty element.
  4. Input the first Jamo of a Korean syllable (e.g., “ㅎ”).
  5. Observe if the character remains or disappears.

Observed Behavior

  1. compositionstart: Fires correctly.
  2. Placeholder Logic: The browser detects the element is no longer empty and removes the :before or internal placeholder node.
  3. Collision: The DOM mutation for removing the placeholder interferes with the IME’s internal buffer for the first character.
  4. Result: The character “ㅎ” is lost, or the IME “stutters,” requiring the user to type the first character twice.

Expected Behavior

The placeholder removal should be an atomic operation that does not disrupt the active IME composition session. The first character should remain visible and combine correctly with subsequent input.

Impact

  • Severe UX Frustration: Users constantly have to re-type the first letter of every new sentence or field.
  • Data Corruption: In some cases, a partial syllable is left behind as “dead text” that the editor framework cannot clean up.

Browser Comparison

  • Chrome for Android (v131/v132): Exhibits the bug.
  • Firefox for Android: Works correctly.
  • iOS Safari: Works correctly (uses a different placeholder injection method).

References & Solutions

Mitigation: Hide Placeholder on Focus

Instead of relying on :empty, hide the placeholder as soon as the element gains focus, before the composition starts.

/* Avoid this if possible for Korean IME */
[contenteditable]:empty::before {
  content: attr(placeholder);
}

/* Better workaround */
[contenteditable]:focus::before {
  content: "" !important; /* Remove placeholder immediately on focus */
}
Step 1: Focus Empty with Placeholder
The editor is empty and shows a placeholder via CSS (e.g., :empty:before).
Step 2: Start Composition ('ㅎ')
ㅎ|
User types 'ㅎ'. The placeholder should disappear immediately.
vs
✅ Expected
ㅎ|
Expected: The character remains and continues to combine into '하', '한' etc.

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-0056-contenteditable-with-placeholder macOS Ubuntu 22.04 Desktop or Laptop Any Safari 120.0 US draft
ce-0568-chrome-android-placeholder-korean-ime Android 14.0 Smartphone Any Chrome 131.0 Korean (IME) 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: Android 14.0
Device: Smartphone Any
Browser: Chrome 131.0
Keyboard: Korean (IME)
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.