πŸ“ Real-world contenteditable research

contenteditable.lab

Ever wondered why your contenteditable behaves differently in Safari vs Chrome? Or why IME composition (Chinese, Japanese, Korean, and more) breaks in some browsers? We're documenting these real-world quirks across all languages and input methods so you don't have to discover them the hard way.

βœ“ 312 documented cases
🌍 All languages & IMEs
πŸ”¬ Real-world tested
✨

What's New

Fresh cases and scenarios added recently

Latest Cases

312
Total Cases
186
Scenarios
7
OS Variants
14
Browsers
32
Confirmed
280
Draft

Cases by Category

83
IME & Composition
26
Formatting
54
Selection
24
Paste & Clipboard
πŸ”¬

Browse by phenomenon

Start from a specific behavior or issue to see how it manifests across different environments. Each scenario tells a story of browser quirks and edge cases.

View all scenarios β†’
⚑

Quick Links

Jump to popular sections and resources.

🏷️

Browse by category

Explore cases by topic tags or environment filters.

View all cases with filters β†’
πŸ“Œ

Pinned incidents

Curated baseline references and frequently observed issues.

Baseline typing and composition in a simple contenteditable region

Any Any Β· Chrome Latest

Open case β†’
πŸ’¬

Join the Community

Share your findings, ask questions, or contribute to the project. Your input helps make this catalog more comprehensive.

πŸ†•

Latest scenarios

Recently documented scenarios, sorted by the most recent case added. Keep checking back for new discoveries!

Baseline typing and composition in a simple contenteditable region

scenario-baseline

1 case Β· Any

Link as non-anchor markup during editing (e.g. span + data-href)

scenario-link-span-internal-representation

1 case Β· Any

getTargetRanges() can reference the wrong contenteditable when editors are nested

scenario-gettargetranges-nested-wrong-scope

1 case Β· Android

Voice and speech-driven input in contenteditable lacks a stable editing contract

scenario-voice-input-contenteditable

1 case Β· Windows

iOS Safari contenteditable β€” do not force re-render or change selection during input

scenario-ios-safari-contenteditable-do-not-force-rerender-or-change-selection-during-input

1 case Β· iOS

Select All (Ctrl+A) collapses wrong way when non-editable block is first or last child

scenario-select-all-non-editable-block

1 case Β· macOS

Deleted inline elements recreated when typing in contenteditable

scenario-inline-element-recreation-after-delete

1 case Β· Windows

IME Interaction Patterns: Keys, Events, and Edge Cases

scenario-ime-interaction-patterns

21 cases Β· Android

IME UI & Experience: Viewports, Candidates, and Layout

scenario-ime-ui-experience

1 case Β· iOS

Performance Foundations: Complexity, Memory, and Thrashing

scenario-performance-foundations

1 case Β· macOS

Duplicate beforeinput or input events during IME composition

scenario-ime-composition-duplicate-events

2 cases Β· Android

Paragraph splitting and block behavior in editors

scenario-paragraph-behavior

1 case Β· Windows

IME composition text leaks outside table cells

scenario-table-composition-leaks

2 cases Β· macOS

Accessibility Foundations: Screen Readers, ARIA, and the AX-Tree

scenario-accessibility-foundations

5 cases Β· Windows

Plain text paste and plaintext-only contenteditable

scenario-paste-plain-text

2 cases Β· Linux

Contenteditable isolation and selection in Shadow DOM

scenario-contenteditable-shadow-dom

1 case Β· macOS

RTL text direction and selection behavior inconsistent in contenteditable

scenario-rtl-text-direction-inconsistent

1 case Β· Windows

Firefox Drag and Drop failures in contenteditable

scenario-firefox-drag-drop-issues

3 cases Β· Linux

Placeholder interference with IME and DOM mutations

scenario-placeholder-behavior

2 cases Β· Android

Composition event lifecycle inconsistencies across browsers

scenario-composition-events

2 cases Β· macOS