diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/KMKeyboard.java b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/KMKeyboard.java index 3a5d26d555..a5a614a34b 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/KMKeyboard.java +++ b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/KMKeyboard.java @@ -190,6 +190,7 @@ final class KMKeyboard extends WebView { public void loadKeyboard() { keyboardSet = false; + this.javascriptAfterLoad.clear(); if(keyboardType == KeyboardType.KEYBOARD_TYPE_INAPP) KMManager.InAppKeyboardLoaded = false; @@ -207,7 +208,9 @@ final class KMKeyboard extends WebView { if((keyboardType == KeyboardType.KEYBOARD_TYPE_INAPP && KMManager.InAppKeyboardLoaded) || (keyboardType == KeyboardType.KEYBOARD_TYPE_SYSTEM && KMManager.SystemKeyboardLoaded)) { - if(this.javascriptAfterLoad.size() == 1) + // If !this.keyboardSet, then pageLoaded hasn't fired yet. + // When pageLoaded fires, it'll call `callJavascriptAfterLoad` safely. + if(this.javascriptAfterLoad.size() == 1 && keyboardSet) callJavascriptAfterLoad(); } } @@ -221,8 +224,11 @@ final class KMKeyboard extends WebView { if(javascriptAfterLoad.size() > 0) { loadUrl("javascript:" + javascriptAfterLoad.get(0)); javascriptAfterLoad.remove(0); - if (javascriptAfterLoad.size() > 0) { - callJavascriptAfterLoad(); + // Make sure we didn't reset the page in the middle of the queue! + if(keyboardSet) { + if (javascriptAfterLoad.size() > 0) { + callJavascriptAfterLoad(); + } } } } diff --git a/web/source/osk/visualKeyboard.ts b/web/source/osk/visualKeyboard.ts index ca3d4573a5..1bb566a882 100644 --- a/web/source/osk/visualKeyboard.ts +++ b/web/source/osk/visualKeyboard.ts @@ -592,7 +592,16 @@ namespace com.keyman.osk { // Build a layout using the default for the device if(typeof layout != 'object' || layout == null) { - let kbdDevVersion = new utils.Version(activeKeyboard['KVER']); + var kbdDevVersion: utils.Version; + + // This CAN be called with no backing keyboard; KMW will try to force-show + // the OSK even without a backing keyboard on mobile, using the default + // layout as the OSK's base. + if(activeKeyboard) { + kbdDevVersion = new utils.Version(activeKeyboard['KVER']); + } else { + kbdDevVersion = new utils.Version(keyman['version']); + } layout=Layouts.buildDefaultLayout(PVK, kbdDevVersion, kbdBitmask, formFactor); }