Skip to content

Commit e020ae2

Browse files
committed
Prevent keyboard events during text composition inside of details-menu
1 parent 7629135 commit e020ae2

File tree

1 file changed

+19
-1
lines changed

1 file changed

+19
-1
lines changed

index.js

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ class DetailsMenuElement extends HTMLElement {
3737
if (!summary.hasAttribute('role')) summary.setAttribute('role', 'button')
3838
}
3939

40+
this.addEventListener('compositionstart', trackComposition)
41+
this.addEventListener('compositionend', trackComposition)
4042
details.addEventListener('click', shouldCommit)
4143
details.addEventListener('change', shouldCommit)
4244
details.addEventListener('keydown', keydown)
@@ -47,7 +49,7 @@ class DetailsMenuElement extends HTMLElement {
4749
}
4850

4951
const subscriptions = [focusOnOpen(details)]
50-
states.set(this, {details, subscriptions, loaded: false})
52+
states.set(this, {details, subscriptions, loaded: false, isComposing: false})
5153
}
5254

5355
disconnectedCallback() {
@@ -60,6 +62,9 @@ class DetailsMenuElement extends HTMLElement {
6062
for (const sub of subscriptions) {
6163
sub.unsubscribe()
6264
}
65+
66+
this.addEventListener('compositionstart', trackComposition)
67+
this.addEventListener('compositionend', trackComposition)
6368
details.removeEventListener('click', shouldCommit)
6469
details.removeEventListener('change', shouldCommit)
6570
details.removeEventListener('keydown', keydown)
@@ -222,6 +227,13 @@ function commit(selected: Element, details: Element) {
222227
function keydown(event: KeyboardEvent) {
223228
const details = event.currentTarget
224229
if (!(details instanceof Element)) return
230+
const menu = details.querySelector('details-menu')
231+
if (!menu) return
232+
const state = states.get(menu)
233+
if (!state) return
234+
const {isComposing} = state
235+
if (isComposing) return
236+
225237
const isSummaryFocused = event.target instanceof Element && event.target.tagName === 'SUMMARY'
226238

227239
// Ignore key presses from nested details.
@@ -326,6 +338,12 @@ function labelHTML(el: ?Element): ?string {
326338
return contentsEl ? contentsEl.innerHTML : null
327339
}
328340

341+
function trackComposition(event: Event) {
342+
const state = states.get(event.currentTarget)
343+
if (!state) return
344+
state.isComposing = event.type === 'compositionstart'
345+
}
346+
329347
export default DetailsMenuElement
330348

331349
if (!window.customElements.get('details-menu')) {

0 commit comments

Comments
 (0)