@@ -37,6 +37,8 @@ class DetailsMenuElement extends HTMLElement {
37
37
if ( ! summary . hasAttribute ( 'role' ) ) summary . setAttribute ( 'role' , 'button' )
38
38
}
39
39
40
+ this . addEventListener ( 'compositionstart' , trackComposition )
41
+ this . addEventListener ( 'compositionend' , trackComposition )
40
42
details . addEventListener ( 'click' , shouldCommit )
41
43
details . addEventListener ( 'change' , shouldCommit )
42
44
details . addEventListener ( 'keydown' , keydown )
@@ -47,7 +49,7 @@ class DetailsMenuElement extends HTMLElement {
47
49
}
48
50
49
51
const subscriptions = [ focusOnOpen ( details ) ]
50
- states . set ( this , { details, subscriptions, loaded : false } )
52
+ states . set ( this , { details, subscriptions, loaded : false , isComposing : false } )
51
53
}
52
54
53
55
disconnectedCallback ( ) {
@@ -60,6 +62,9 @@ class DetailsMenuElement extends HTMLElement {
60
62
for ( const sub of subscriptions ) {
61
63
sub . unsubscribe ( )
62
64
}
65
+
66
+ this . addEventListener ( 'compositionstart' , trackComposition )
67
+ this . addEventListener ( 'compositionend' , trackComposition )
63
68
details . removeEventListener ( 'click' , shouldCommit )
64
69
details . removeEventListener ( 'change' , shouldCommit )
65
70
details . removeEventListener ( 'keydown' , keydown )
@@ -222,6 +227,13 @@ function commit(selected: Element, details: Element) {
222
227
function keydown ( event : KeyboardEvent ) {
223
228
const details = event . currentTarget
224
229
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
+
225
237
const isSummaryFocused = event . target instanceof Element && event . target . tagName === 'SUMMARY'
226
238
227
239
// Ignore key presses from nested details.
@@ -326,6 +338,12 @@ function labelHTML(el: ?Element): ?string {
326
338
return contentsEl ? contentsEl . innerHTML : null
327
339
}
328
340
341
+ function trackComposition ( event : Event ) {
342
+ const state = states . get ( event . currentTarget )
343
+ if ( ! state ) return
344
+ state . isComposing = event . type === 'compositionstart'
345
+ }
346
+
329
347
export default DetailsMenuElement
330
348
331
349
if ( ! window . customElements . get ( 'details-menu' ) ) {
0 commit comments