diff --git a/ios/engine/KMEI/KeymanEngine/resources/Keyman.bundle/Contents/Resources/ios-host.js b/ios/engine/KMEI/KeymanEngine/resources/Keyman.bundle/Contents/Resources/ios-host.js index 621e643bb94..d5eb798b67d 100644 --- a/ios/engine/KMEI/KeymanEngine/resources/Keyman.bundle/Contents/Resources/ios-host.js +++ b/ios/engine/KMEI/KeymanEngine/resources/Keyman.bundle/Contents/Resources/ios-host.js @@ -287,9 +287,16 @@ function setKeymanContext(text, doSync, selStart, selLength) { let selEnd = selStart + selLength; selEnd = isNaN(selEnd) ? undefined : selEnd; - const shouldReset = keyman.context.updateContext(text, selStart, selEnd); - if(!doSync || shouldReset) { + if(doSync) { + const shouldReset = keyman.context.updateContext(text, selStart, selEnd); + if(shouldReset) { keyman.resetContext(); + } + } else { + // if not in "sync" mode, we have a hard context reset; just full-reset it. + keyman.context.setText(text); + keyman.context.setSelection(selStart, selStart+selLength); + keyman.resetContext(); } } diff --git a/web/src/app/webview/src/contextManager.ts b/web/src/app/webview/src/contextManager.ts index 2f6cfd6ae7a..d9ef2c6e52b 100644 --- a/web/src/app/webview/src/contextManager.ts +++ b/web/src/app/webview/src/contextManager.ts @@ -60,18 +60,24 @@ export class ContextHost extends Mock { updateContext(text: string, selStart: number, selEnd: number): boolean { let shouldResetContext = false; - if(text != this.text) { - let tempMock = new Mock(text, selStart ?? text._kmwLength(), selEnd ?? text._kmwLength()); - - let newLeft = tempMock.getTextBeforeCaret(); - let oldLeft = this.getTextBeforeCaret(); + let tempMock = new Mock(text, selStart ?? text._kmwLength(), selEnd ?? text._kmwLength()); + let newLeft = tempMock.getTextBeforeCaret(); + let oldLeft = this.getTextBeforeCaret(); + if(text != this.text) { let unexpectedBeforeCharCount = findCommonSubstringEndIndex(newLeft, oldLeft, true) + 1; shouldResetContext = !!unexpectedBeforeCharCount; } if(shouldResetContext) { this.text = text; + this.selStart = selStart; + this.selEnd = selEnd; + } else { + // Transform selection coordinates to their location within the longform context window. + let delta = oldLeft._kmwLength() - newLeft._kmwLength(); + this.selStart = selStart - delta; + this.selEnd = selEnd - delta; } if(selStart === undefined || selEnd === undefined) {