Merge pull request #3477 from matrix-org/bwindels/cjk-ime-fixes

Fix: latin input through Chinese IME
This commit is contained in:
Bruno Windels 2019-09-25 14:21:15 +00:00 committed by GitHub
commit 10b692c1a2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 34 additions and 3 deletions

View file

@ -169,9 +169,32 @@ export default class BasicMessageEditor extends React.Component {
_onCompositionEnd = (event) => { _onCompositionEnd = (event) => {
this._isIMEComposing = false; this._isIMEComposing = false;
// some browsers (chromium) don't fire an input event after ending a composition // some browsers (Chrome) don't fire an input event after ending a composition,
// so trigger a model update after the composition is done by calling the input handler // so trigger a model update after the composition is done by calling the input handler.
// however, modifying the DOM (caused by the editor model update) from the compositionend handler seems
// to confuse the IME in Chrome, likely causing https://github.com/vector-im/riot-web/issues/10913 ,
// so we do it async
// however, doing this async seems to break things in Safari for some reason, so browser sniff.
const ua = navigator.userAgent.toLowerCase();
const isSafari = ua.includes('safari/') && !ua.includes('chrome/');
if (isSafari) {
this._onInput({inputType: "insertCompositionText"}); this._onInput({inputType: "insertCompositionText"});
} else {
setTimeout(() => {
this._onInput({inputType: "insertCompositionText"});
}, 0);
}
}
isComposing(event) {
// checking the event.isComposing flag just in case any browser out there
// emits events related to the composition after compositionend
// has been fired
return !!(this._isIMEComposing || (event.nativeEvent && event.nativeEvent.isComposing));
} }
_onPaste = (event) => { _onPaste = (event) => {

View file

@ -127,6 +127,10 @@ export default class EditMessageComposer extends React.Component {
} }
_onKeyDown = (event) => { _onKeyDown = (event) => {
// ignore any keypress while doing IME compositions
if (this._editorRef.isComposing(event)) {
return;
}
if (event.metaKey || event.altKey || event.shiftKey) { if (event.metaKey || event.altKey || event.shiftKey) {
return; return;
} }

View file

@ -104,6 +104,10 @@ export default class SendMessageComposer extends React.Component {
}; };
_onKeyDown = (event) => { _onKeyDown = (event) => {
// ignore any keypress while doing IME compositions
if (this._editorRef.isComposing(event)) {
return;
}
const hasModifier = event.altKey || event.ctrlKey || event.metaKey || event.shiftKey; const hasModifier = event.altKey || event.ctrlKey || event.metaKey || event.shiftKey;
if (event.key === "Enter" && !hasModifier) { if (event.key === "Enter" && !hasModifier) {
this._sendMessage(); this._sendMessage();