diff --git a/HISTORY.md b/HISTORY.md
index 13aacb1110..2adc2e64f9 100644
--- a/HISTORY.md
+++ b/HISTORY.md
@@ -1,5 +1,26 @@
# Keyman Version History
+## 20.0.7 alpha 2026-10-21
+
+* chore(web): add Keyman header to test files (#16857)
+
+## 20.0.6 alpha 2026-10-19
+
+* docs(common): move legacy history (#16799)
+
+## 20.0.5 alpha 2026-10-17
+
+* fix: set alpha tier after merge (#16841)
+
+## 20.0.4 alpha 2026-10-14
+
+* refactor(web): clarify scope of `doShow`/`doHide` (#16589)
+* refactor(web): update function comments and cleanup (#16591)
+
+## 20.0.3 alpha 2026-10-09
+
+* maint(ios): new iOS certificate (alpha-20.0) (#16771)
+
## 20.0.2 alpha 2026-10-07
* fix(mac): lower case 'k' for .pkg.download_info (#16744)
@@ -17,6 +38,32 @@
* chore(common): remove `clearcontext`,`fix`,`switch`,`key` statements (#16726)
* chore: move to 20.0-alpha (#16739)
+## 19.0.305 beta 2026-10-09
+
+* docs: remove repeated clean up instructions (#16745)
+* fix(web): prevent crash adding log entry for keystroke with `inputBreadCrumb` (#16762)
+* maint(ios): new iOS certificate (beta-19.0) (#16772)
+* docs(developer): fix typo in whatsnew (#16774)
+* fix(web): fix crash applying suggestions (#16786)
+
+## 19.0.304 beta 2026-10-08
+
+* docs(common): add `sentry-cli` version and update documentation (#16752)
+* chore(linux): update changelog with Debian version (#16758)
+
+## 19.0.303 beta 2026-10-07
+
+* fix(resources): export KEYMAN_TIER so we get beta tagging on release build (#16751)
+
+## 19.0.302 beta 2026-10-07
+
+* fix(mac): lower case 'k' for .pkg.download_info (#16743)
+* docs: update v19 whats-new (#16748)
+
+## 19.0.300 beta 2026-10-06
+
+* chore: move to beta
+
## 19.0.299 alpha 2026-10-05
* chore(deps): bump ip-address from 10.5.0 to 10.7.2 in /developer/src/server/src/win32/trayicon/addon-src (#16698)
@@ -1831,6 +1878,15 @@
* refactor(windows): rename `TKeymanMutex.MutexOwned` to `TakeOwnership` and add `ReleaseOwnership` (#13168)
* chore: increment to alpha 19.0 (#13187)
+## 18.0.254 stable 2026-10-16
+
+* chore(linux): replace deprecated `parse_version` (#16736)
+* chore(linux): update Debian standards version (#16713)
+* chore(linux): update changelog with Debian version (#16735)
+* fix(web): prevent crash adding log entry for keystroke with `inputBreadCrumb` (#16761)
+* maint(ios): new iOS certificate (stable-18.0) (#16773)
+* fix(web): don't crash if model isn't fully loaded yet (#16784)
+
## 18.0.253 stable 2026-10-02
* fix(mac): disable the help button entirely in the title bar of OSK (#16680)
diff --git a/VERSION.md b/VERSION.md
index 1d47225efe..d4a0e78fb7 100644
--- a/VERSION.md
+++ b/VERSION.md
@@ -1 +1 @@
-20.0.3
\ No newline at end of file
+20.0.8
\ No newline at end of file
diff --git a/android/KMAPro/kMAPro/build.gradle b/android/KMAPro/kMAPro/build.gradle
index 7c6b966484..ef60799d5d 100644
--- a/android/KMAPro/kMAPro/build.gradle
+++ b/android/KMAPro/kMAPro/build.gradle
@@ -9,6 +9,7 @@ plugins {
ext.rootPath = '../../'
apply from: "$rootPath/version.gradle"
String tier = System.getenv("KEYMAN_TIER");
+println "Using tier $tier"
java {
toolchain {
diff --git a/android/docs/engine/whatsnew.md b/android/docs/engine/whatsnew.md
index 23979172d6..9e9256bd8e 100644
--- a/android/docs/engine/whatsnew.md
+++ b/android/docs/engine/whatsnew.md
@@ -2,7 +2,12 @@
title: What's New in Keyman Engine 20.0 for Android
---
-* Added API for broadcasting when Keyman system keyboard font changes (#15193)
+* **BREAKING** Apps that use the functionality of Keyman Engine for Android will have to add `androidx.webkit:webkit:1.14.0` as a dependency (#16146)
+* **KNOWN ISSUE** `sil_euro_latin` keyboard must be included in an app if `setDefaultKeyboard()` is not called during initialization (#16215)
+* Added [Intent `com.tavultesoft.kmapro.keyboard_changed`](KMAPro/) which is broadcast when Keyman system keyboard changes and includes font name (#15193)
+* Added [`KMManager.getKeyboardHeightMax()`](KMManager/getKeyboardHeightMax) API (#13663)
+* Added [`KMManager.getKeyboardHeightMin()`](KMManager/getKeyboardHeightMin) API (#13663)
+* Clarified font filename vs facename in various APIs (#16211)
## See Also
* [Keyman Engine for Android Documentation](index)
\ No newline at end of file
diff --git a/android/docs/help/about/whatsnew.md b/android/docs/help/about/whatsnew.md
index 63eb0cdbcc..dd5e40d78c 100644
--- a/android/docs/help/about/whatsnew.md
+++ b/android/docs/help/about/whatsnew.md
@@ -4,3 +4,9 @@ title: What's New in Keyman 20.0 for Android
Here are some of the new features we have added to Keyman 20.0 for Android:
+- Keyboard search is now localized for several languages (#15510)
+- Support for dark mode (#15827)
+- Refreshed and modernized settings user interface (#15827)
+- Automatic acceptance of corrections (#12893)
+- Improvements to interface for keyboard resizing (#15267)
+- About [220 other fixes and changes](https://keyman.com/go/app/whatsnew/android/19.0)
diff --git a/docs/build/linux-ubuntu.md b/docs/build/linux-ubuntu.md
index 82537b1b79..8f3e879801 100644
--- a/docs/build/linux-ubuntu.md
+++ b/docs/build/linux-ubuntu.md
@@ -245,6 +245,15 @@ from command line. But note that you do need to update your `JAVA_HOME` env
var to the associated version before opening Android Studio and loading any
Android projects. `JAVA_HOME_11` is mostly used by CI.
+## Optional Tools
+
+- sentry-cli (optional)
+ - Uploading symbols for Sentry-based error reporting
+
+ See for the installation, and
+ check [minimum-versions.md](../minimum-versions.md) for the required version of
+ `sentry-cli`.
+
## Docker Builder
The Docker builder allows you to perform a build from anywhere Docker is supported.
diff --git a/docs/build/macos.md b/docs/build/macos.md
index 92203ddb6d..b8030c7292 100644
--- a/docs/build/macos.md
+++ b/docs/build/macos.md
@@ -41,7 +41,7 @@ Rosetta 2 installed.
Many dependencies are only required for specific projects.
-* XCode (iOS, macOS) 26.2 or 26.3 (not higher at this time, see #16416)
+* XCode (iOS, macOS) 26.2 or 26.3 (not higher at this time, see #16416)
is needed only for Keyman for macOS and Keyman for iOS ().
* Install from App Store
@@ -206,8 +206,10 @@ components such as emulator images and SDK updates.
* node.js, emscripten
-```shell
-brew install node emscripten
+ ```shell
+ brew install node emscripten
+ ```
+
* node.js 20.0, emscripten 3.1.64
See section KeymanWeb Dependencies for installation
@@ -216,6 +218,6 @@ See section KeymanWeb Dependencies for installation
* sentry-cli: Uploading symbols for Sentry-based error reporting
- ```shell
- brew install getsentry/tools/sentry-cli
- ```
+ See for the installation, and
+ check [minimum-versions.md](../minimum-versions.md) for the required version of
+ `sentry-cli`.
diff --git a/docs/build/sentry-cli.md b/docs/build/sentry-cli.md
index 42095d38eb..e9955082e6 100644
--- a/docs/build/sentry-cli.md
+++ b/docs/build/sentry-cli.md
@@ -1,8 +1,11 @@
# Setting up sentry-cli
-Contact the Keyman team if you need access to sentry.keyman.com for development.
+Contact the Keyman team if you need access to keyman.sentry.io for development.
You will also need to install [sentry-cli](https://docs.sentry.io/cli/installation/) for uploading Debug symbols.
-After setting up your personal [Auth token](http://keyman.sentry.io/settings/account/api/auth-tokens/), add the following to **~/.bashrc**
+Check [minimum-versions.md](../minimum-versions.md) for the required version of `sentry-cli`.
+
+After setting up your personal [Auth token](http://keyman.sentry.io/settings/account/api/auth-tokens/),
+add the following to `~/.bashrc`:
```bash
export SENTRY_AUTH_TOKEN={your Sentry auth token}
diff --git a/docs/build/windows.md b/docs/build/windows.md
index edc756340f..180b099fc5 100644
--- a/docs/build/windows.md
+++ b/docs/build/windows.md
@@ -412,8 +412,6 @@ certificates for the build.
* sentry-cli (optional)
- Uploading symbols for Sentry-based error reporting
- bash:
- ```bash
- # bash
- curl -sL https://sentry.io/get-cli/ | bash
- ```
+ See for the installation, and
+ check [minimum-versions.md](../minimum-versions.md) for the required version of
+ `sentry-cli`.
diff --git a/android/history.md b/docs/legacy-history/android-legacy-history.md
similarity index 100%
rename from android/history.md
rename to docs/legacy-history/android-legacy-history.md
diff --git a/developer/src/history.md b/docs/legacy-history/developer-legacy-history.md
similarity index 100%
rename from developer/src/history.md
rename to docs/legacy-history/developer-legacy-history.md
diff --git a/ios/history.md b/docs/legacy-history/ios-legacy-history.md
similarity index 100%
rename from ios/history.md
rename to docs/legacy-history/ios-legacy-history.md
diff --git a/linux/history.md b/docs/legacy-history/linux-legacy-history.md
similarity index 100%
rename from linux/history.md
rename to docs/legacy-history/linux-legacy-history.md
diff --git a/mac/history.md b/docs/legacy-history/mac-legacy-history.md
similarity index 100%
rename from mac/history.md
rename to docs/legacy-history/mac-legacy-history.md
diff --git a/web/history.md b/docs/legacy-history/web-legacy-history.md
similarity index 100%
rename from web/history.md
rename to docs/legacy-history/web-legacy-history.md
diff --git a/windows/src/versionhistory.txt b/docs/legacy-history/windows-changelog-6.0.txt
similarity index 100%
rename from windows/src/versionhistory.txt
rename to docs/legacy-history/windows-changelog-6.0.txt
diff --git a/windows/src/edithistory.txt b/docs/legacy-history/windows-changelog-7.0-9.0.txt
similarity index 100%
rename from windows/src/edithistory.txt
rename to docs/legacy-history/windows-changelog-7.0-9.0.txt
diff --git a/windows/src/desktop/history.md b/docs/legacy-history/windows-legacy-history.md
similarity index 100%
rename from windows/src/desktop/history.md
rename to docs/legacy-history/windows-legacy-history.md
diff --git a/docs/minimum-versions.md b/docs/minimum-versions.md
index 9065aed2ec..d778ae8959 100644
--- a/docs/minimum-versions.md
+++ b/docs/minimum-versions.md
@@ -74,6 +74,7 @@ https://help.keyman.com/developer/engine/android/latest-version/
| KEYMAN_VERSION_LANGTAGS | 2026-06-09 |
| KEYMAN_VERSION_LANGTAGS_API | 1.4 |
| KEYMAN_VERSION_LANGUAGE_SUBTAG_REGISTRY | 2026-08-08 |
+| KEYMAN_VERSION_SENTRY_CLI | 1.70.0 |
| KEYMAN_VERSION_UNICODE | 17.0.0 |
| KEYMAN_VERSION_XCODE | 26.2 |
diff --git a/docs/tests/acceptance/developer.md b/docs/tests/acceptance/developer.md
index b0a7c76213..f7cd8eb3d6 100644
--- a/docs/tests/acceptance/developer.md
+++ b/docs/tests/acceptance/developer.md
@@ -1,5 +1,20 @@
# Developer Acceptance Tests
+### Clean up instructions for manual tests
+For all these acceptance steps to perform a `cleanup` Uninstall Keyman and any third-party applications installed as part for the `Setup` steps.
+
+If an installation becomes corrupted and it is not possible to uninstall `Keyman Developer` through `Add or remove programs`, clean up the files in the following folders if they exist.
+
+- %ProgramFiles(x86)%\Keyman or %ProgramFiles%\Keyman
+- %CommonProgramFiles(x86)%\Keyman or %CommonProgramFiles%\Keyman
+- %ProgramData%\Keyman
+- %AppData%\Keyman
+- %LocalAppData%\Keyman
+
+If still having trouble remove the registry values at
+- HKCU\Software\Keyman
+- HKLM\Software\Wow6432Node\Keyman
+
**TEST_241**
Test case for Debugger_Starts ,
diff --git a/docs/tests/acceptance/gestures.md b/docs/tests/acceptance/gestures.md
index 8882113e12..3aba62a05e 100644
--- a/docs/tests/acceptance/gestures.md
+++ b/docs/tests/acceptance/gestures.md
@@ -53,21 +53,6 @@ Original TestLodge ID: TC188
-
-Cleanup
-
-1. Type ‘Control panel’ in the Search bar (in Task bar)
-2. Verify that the ‘Control panel’ appeared in the menu list.
-3. Click the Control panel option.
-4. Verify that the Control Panel dialog appeared.
-5. Click the ‘Uninstall a Program’ option.
-6. Verify that the Programs and Features dialog box opens.
-7. Select the installed Keyman version from the list.
-8. Click the Uninstall option.
-9. Verify that the the Keyman Uninstallation completed successfully
-
-
-
---
**TEST_288**
@@ -122,21 +107,6 @@ Original TestLodge ID: TC189
-
-Cleanup
-
-1. Type ‘Control panel’ in the Search bar (in Task bar)
-2. Verify that the ‘Control panel’ appeared in the menu list.
-3. Click the Control panel option.
-4. Verify that the Control Panel dialog appeared.
-5. Click the ‘Uninstall a Program’ option.
-6. Verify that the Programs and Features dialog box opens.
-7. Select the installed Keyman version from the list.
-8. Click the Uninstall option.
-9. Verify that the the Keyman Uninstallation completed successfully
-
-
-
---
**TEST_289**
@@ -190,21 +160,6 @@ Original TestLodge ID: TC190
-
-Cleanup
-
-1. Type ‘Control panel’ in the Search bar (in Task bar)
-2. Verify that the ‘Control panel’ appeared in the menu list.
-3. Click the Control panel option.
-4. Verify that the Control Panel dialog appeared.
-5. Click the ‘Uninstall a Program’ option.
-6. Verify that the Programs and Features dialog box opens.
-7. Select the installed Keyman version from the list.
-8. Click the Uninstall option.
-9. Verify that the the Keyman Uninstallation completed successfully
-
-
-
---
**TEST_290**
@@ -252,21 +207,6 @@ Original TestLodge ID: TC191
-
-Cleanup
-
-1. Type ‘Control panel’ in the Search bar (in Task bar)
-2. Verify that the ‘Control panel’ appeared in the menu list.
-3. Click the Control panel option.
-4. Verify that the Control Panel dialog appeared.
-5. Click the ‘Uninstall a Program’ option.
-6. Verify that the Programs and Features dialog box opens.
-7. Select the installed Keyman version from the list.
-8. Click the Uninstall option.
-9. Verify that the the Keyman Uninstallation completed successfully
-
-
-
---
**TEST_291**
@@ -320,20 +260,6 @@ Original TestLodge ID: TC192
-
-Cleanup
-
-1. Type ‘Control panel’ in the Search bar (in Task bar)
-2. Verify that the ‘Control panel’ appeared in the menu list.
-3. Click the Control panel option.
-4. Verify that the Control Panel dialog appeared.
-5. Click the ‘Uninstall a Program’ option.
-6. Verify that the Programs and Features dialog box opens.
-7. Select the installed Keyman version from the list.
-8. Click the Uninstall option.
-9. Verify that the the Keyman Uninstallation completed successfully
-
-
**TEST_292**
Test case for BASIC_MODIPRESS_HOLD,
@@ -381,21 +307,6 @@ Original TestLodge ID: TC193
-
-Cleanup
-
-1. Type ‘Control panel’ in the Search bar (in Task bar)
-2. Verify that the ‘Control panel’ appeared in the menu list.
-3. Click the Control panel option.
-4. Verify that the Control Panel dialog appeared.
-5. Click the ‘Uninstall a Program’ option.
-6. Verify that the Programs and Features dialog box opens.
-7. Select the installed Keyman version from the list.
-8. Click the Uninstall option.
-9. Verify that the the Keyman Uninstallation completed successfully
-
-
-
---
**TEST_293**
@@ -454,21 +365,6 @@ Original TestLodge ID: TC194
-
-Cleanup
-
-1. Type ‘Control panel’ in the Search bar (in Task bar)
-2. Verify that the ‘Control panel’ appeared in the menu list.
-3. Click the Control panel option.
-4. Verify that the Control Panel dialog appeared.
-5. Click the ‘Uninstall a Program’ option.
-6. Verify that the Programs and Features dialog box opens.
-7. Select the installed Keyman version from the list.
-8. Click the Uninstall option.
-9. Verify that the the Keyman Uninstallation completed successfully
-
-
-
---
**TEST_294**
@@ -522,21 +418,6 @@ Original TestLodge ID: TC195
-
-Cleanup
-
-1. Type ‘Control panel’ in the Search bar (in Task bar)
-2. Verify that the ‘Control panel’ appeared in the menu list.
-3. Click the Control panel option.
-4. Verify that the Control Panel dialog appeared.
-5. Click the ‘Uninstall a Program’ option.
-6. Verify that the Programs and Features dialog box opens.
-7. Select the installed Keyman version from the list.
-8. Click the Uninstall option.
-9. Verify that the the Keyman Uninstallation completed successfully
-
-
-
---
**TEST_295**
@@ -586,21 +467,6 @@ Original TestLodge ID: TC196
-
-Cleanup
-
-1. Type ‘Control panel’ in the Search bar (in Task bar)
-2. Verify that the ‘Control panel’ appeared in the menu list.
-3. Click the Control panel option.
-4. Verify that the Control Panel dialog appeared.
-5. Click the ‘Uninstall a Program’ option.
-6. Verify that the Programs and Features dialog box opens.
-7. Select the installed Keyman version from the list.
-8. Click the Uninstall option.
-9. Verify that the the Keyman Uninstallation completed successfully
-
-
-
---
**TEST_297**
@@ -653,21 +519,6 @@ Original TestLodge ID: TC198
-
-Cleanup
-
-1. Type ‘Control panel’ in the Search bar (in Task bar)
-2. Verify that the ‘Control panel’ appeared in the menu list.
-3. Click the Control panel option.
-4. Verify that the Control Panel dialog appeared.
-5. Click the ‘Uninstall a Program’ option.
-6. Verify that the Programs and Features dialog box opens.
-7. Select the installed Keyman version from the list.
-8. Click the Uninstall option.
-9. Verify that the the Keyman Uninstallation completed successfully
-
-
-
---
**TEST_300**
@@ -733,21 +584,6 @@ Original TestLodge ID: TC201
-
-Cleanup
-
-1. Type ‘Control panel’ in the Search bar (in Task bar)
-2. Verify that the ‘Control panel’ appeared in the menu list.
-3. Click the Control panel option.
-4. Verify that the Control Panel dialog appeared.
-5. Click the ‘Uninstall a Program’ option.
-6. Verify that the Programs and Features dialog box opens.
-7. Select the installed Keyman version from the list.
-8. Click the Uninstall option.
-9. Verify that the the Keyman Uninstallation completed successfully
-
-
-
---
**TEST_302**
@@ -807,20 +643,5 @@ Original TestLodge ID: TC203
-
-Cleanup
-
-1. Type ‘Control panel’ in the Search bar (in Task bar)
-2. Verify that the ‘Control panel’ appeared in the menu list.
-3. Click the Control panel option.
-4. Verify that the Control Panel dialog appeared.
-5. Click the ‘Uninstall a Program’ option.
-6. Verify that the Programs and Features dialog box opens.
-7. Select the installed Keyman version from the list.
-8. Click the Uninstall option.
-9. Verify that the the Keyman Uninstallation completed successfully
-
-
-
---
diff --git a/docs/tests/acceptance/mac.md b/docs/tests/acceptance/mac.md
index 6262f62111..57f8fd9431 100644
--- a/docs/tests/acceptance/mac.md
+++ b/docs/tests/acceptance/mac.md
@@ -1,5 +1,8 @@
# macOS Acceptance Tests
+### Clean up instructions for manual tests
+For all these acceptance steps to perform a `cleanup` Uninstall Keyman and any third-party applications installed as part for the `Setup` steps.
+
**TEST_173**
Test case for Chrome_Google_Docs with Amharic,
@@ -48,15 +51,6 @@ Original TestLodge ID: TC113
-
-Cleanup
-
-1. Uninstall Keyman build on the device.
-2. Uninstall the Amharic keyboard.
-3. Uninstall the Chrome browser.
-
-
-
---
**TEST_175**
@@ -106,15 +100,6 @@ Original TestLodge ID: TC115
-
-Cleanup
-
-1. Uninstall Keyman build on the device.
-2. Uninstall the Amharic keyboard.
-3. Uninstall Atom Editor.
-
-
-
---
**TEST_178**
@@ -165,15 +150,6 @@ Original TestLodge ID: TC118
-
-Cleanup
-
-1. Uninstall Keyman build on the device.
-2. Uninstall the Amharic keyboard.
-3. Uninstall Safari browser.
-
-
-
---
**TEST_180**
@@ -224,15 +200,6 @@ Original TestLodge ID: TC120
-
-Cleanup
-
-1. Uninstall Keyman build on the device.
-2. Uninstall the Amharic keyboard.
-3. Uninstall the Firefox browser.
-
-
-
---
**TEST_183**
@@ -283,15 +250,6 @@ Original TestLodge ID: TC123
-
-Cleanup
-
-1. Uninstall Keyman build on the device.
-2. Uninstall the Amharic keyboard.
-3. Uninstall the Firefox browser.
-
-
-
---
**TEST_185**
@@ -341,15 +299,6 @@ Original TestLodge ID: TC125
-
-Cleanup
-
-1. Uninstall Keyman build on the device.
-2. Uninstall the Amharic keyboard.
-3. Uninstall Notes App.
-
-
-
---
**TEST_188**
@@ -399,15 +348,6 @@ Original TestLodge ID: TC128
-
-Cleanup
-
-1. Uninstall Keyman build on the device.
-2. Uninstall the Amharic keyboard.
-3. Uninstall LibreOffice 7.0 app.
-
-
-
---
**TEST_190**
@@ -469,14 +409,6 @@ Original TestLodge ID: TC130
-
-Cleanup
-
-1. Uninstall Keyman build on the device.
-2. Uninstall Chrome browser.
-
-
-
---
**TEST_193**
@@ -539,14 +471,6 @@ Original TestLodge ID: TC133
-
-Cleanup
-
-1. Uninstall Keyman build on the device.
-2. Uninstall Chrome browser.
-
-
-
---
**TEST_195**
@@ -608,13 +532,6 @@ Original TestLodge ID: TC135
-
-Cleanup
-
-1. Uninstall Keyman build on the device.
-
-
-
---
**TEST_198**
@@ -676,13 +593,6 @@ Original TestLodge ID: TC138
-
-Cleanup
-
-1. Uninstall Keyman build on the device.
-
-
-
---
**TEST_200**
@@ -747,13 +657,6 @@ Original TestLodge ID: TC140
-
-Cleanup
-
-1. Uninstall Keyman build on the device.
-
-
-
---
**TEST_203**
@@ -815,13 +718,6 @@ Original TestLodge ID: TC143
-
-Cleanup
-
-1. Uninstall Keyman build on the device.
-
-
-
---
**TEST_205**
@@ -882,12 +778,6 @@ Original TestLodge ID: TC145
-
-Cleanup
-
-1. Uninstall Keyman build on the device.
-
-
**TEST_208**
Test case for MAIL app with Shortcuts,
@@ -946,13 +836,6 @@ Original TestLodge ID: TC148
-
-Cleanup
-
-1. Uninstall Keyman build on the device.
-
-
-
---
**TEST_210**
@@ -995,14 +878,6 @@ Original TestLodge ID: TC222
-
-Cleanup
-
-1. Uninstall Keyman build on the device.
-2. Uninstall Chrome browser.
-
-
-
---
**TEST_213**
@@ -1047,14 +922,6 @@ Original TestLodge ID: TC225
-
-Cleanup
-
-1. Uninstall Keyman build on the device.
-2. Uninstall Chrome browser.
-
-
-
---
**TEST_215**
@@ -1094,13 +961,6 @@ Original TestLodge ID: TC235
-
-Cleanup
-
-1. Uninstall Keyman build on the MAC
-
-
-
---
**TEST_218**
@@ -1142,14 +1002,6 @@ Original TestLodge ID: TC238
-
-Cleanup
-
-1. Uninstall Keyman build on the MAC
-SUITE_KMX_PROCESSOR_COMPLIANT_GROUP_LINUX:
-
-
-
---
**TEST_220**
@@ -1193,14 +1045,6 @@ Original TestLodge ID: TC250
-
-Cleanup
-
-1. Uninstall Keyman build on the device.
-2. Uninstall Chrome browser.
-
-
-
---
**TEST_223**
@@ -1245,14 +1089,6 @@ Original TestLodge ID: TC253
-
-Cleanup
-
-1. Uninstall Keyman build on the device.
-2. Uninstall Chrome browser.
-
-
-
---
**TEST_226**
@@ -1295,14 +1131,6 @@ Original TestLodge ID: TC266
-
-Cleanup
-
-1. Uninstall Keyman build on the macOS
-2. Uninstall the TextEdit app.
-
-
-
---
**TEST_228**
@@ -1345,14 +1173,6 @@ Original TestLodge ID: TC268
-
-Cleanup
-
-1. Uninstall Keyman build on the macOS
-2. Uninstall the TextEdit app.
-
-
-
---
**TEST_231**
@@ -1401,13 +1221,6 @@ Original TestLodge ID: TC286
-
-Cleanup
-
-1. Uninstall the Keyman build on the macOS.
-
-
-
---
**TEST_233**
@@ -1451,13 +1264,6 @@ Original TestLodge ID: TC288
-
-Cleanup
-
-1. Uninstall the Keyman build on the macOS.
-
-
-
---
**TEST_236**
@@ -1505,13 +1311,6 @@ Original TestLodge ID: TC291
-
-Cleanup
-
-1. Uninstall the Keyman build on the macOS.
-
-
-
---
**TEST_238**
@@ -1558,13 +1357,6 @@ Original TestLodge ID: TC293
-
-Cleanup
-
-1. Uninstall the Keyman build on the macOS.
-
-
-
---
**TEST_341**
@@ -1618,12 +1410,5 @@ TC - fix(mac): handle PackageInfo section in kmp.inf file #13876
-
-Cleanup
-
-1. Uninstall the Keyman build on macOS.
-
-
-
---
diff --git a/docs/tests/acceptance/web.md b/docs/tests/acceptance/web.md
index e8ca5f6b7d..c915c05517 100644
--- a/docs/tests/acceptance/web.md
+++ b/docs/tests/acceptance/web.md
@@ -36,7 +36,7 @@ Original TestLodge ID: TC162
1. Open Firefox browser in Windows OS.
2. Enter ‘https://build.palaso.org/repository/download/Keymanweb_TestPullRequests/433344:id/index.html' in the Search bar.
-3.Verify that the testing index page opens.
+3. Verify that the testing index page opens.
4. Click 'View Keymanweb use samples' link button.
5. Verify KeymanWeb Samples page opens.
6. Click 'Example1 - Toggle UI, all resources in same folder as page' link button.
@@ -45,7 +45,7 @@ Original TestLodge ID: TC162
9. Verify it produces ‘ŋ’
10. Open Chrome browser in Windows OS.
11. Enter ‘https://build.palaso.org/repository/download/Keymanweb_TestPullRequests/433344:id/index.html' in the Search bar.
-12.Verify that the testing index page opens.
+12. Verify that the testing index page opens.
13. Click 'View Keymanweb use samples' link button.
14. Verify KeymanWeb Samples page opens.
15. Click 'Example1 - Toggle UI, all resources in same folder as page' link button.
@@ -54,7 +54,7 @@ Original TestLodge ID: TC162
18. Verify it produces ‘ŋ’
19. Open Safari browser in macOS.
20. Enter ‘https://build.palaso.org/repository/download/Keymanweb_TestPullRequests/433344:id/index.html' in the Search bar.
-21.Verify that the testing index page opens.
+21. Verify that the testing index page opens.
22. Click 'View Keymanweb use samples' link button.
23. Verify KeymanWeb Samples page opens.
24. Click 'Example1 - Toggle UI, all resources in same folder as page' link button.
@@ -63,7 +63,7 @@ Original TestLodge ID: TC162
27. Verify it produces ‘ŋ’
28. Open Chrome browser in macOS.
29. Enter ‘https://build.palaso.org/repository/download/Keymanweb_TestPullRequests/433344:id/index.html' in the Search bar.
-30.Verify that the testing index page opens.
+30. Verify that the testing index page opens.
31. Click 'View Keymanweb use samples' link button.
32. Verify KeymanWeb Samples page opens.
33. Click 'Example1 - Toggle UI, all resources in same folder as page' link button.
@@ -72,7 +72,7 @@ Original TestLodge ID: TC162
36. Verify it produces ‘ŋ’
37. Open Firefox in macOS.
38. Enter ‘https://build.palaso.org/repository/download/Keymanweb_TestPullRequests/433344:id/index.html' in the Search bar.
-39.Verify that the testing index page opens.
+39. Verify that the testing index page opens.
40. Click 'View Keymanweb use samples' link button.
41. Verify KeymanWeb Samples page opens.
42. Click 'Example1 - Toggle UI, all resources in same folder as page' link button.
@@ -81,7 +81,7 @@ Original TestLodge ID: TC162
45. Verify it produces ‘ŋ’
46. Open Firefox in Linux OS.
47. Enter ‘https://build.palaso.org/repository/download/Keymanweb_TestPullRequests/433344:id/index.html' in the Search bar.
-48.Verify that the testing index page opens.
+48. Verify that the testing index page opens.
49. Click 'View Keymanweb use samples' link button.
50. Verify KeymanWeb Samples page opens.
51. Click 'Example1 - Toggle UI, all resources in same folder as page' link button.
@@ -141,7 +141,7 @@ Original TestLodge ID: TC163
1. Open Firefox browser in Windows OS.
2. Enter ‘https://build.palaso.org/repository/download/Keymanweb_TestPullRequests/433344:id/index.html' in the Search bar.
-3.Verify that the testing index page opens.
+3. Verify that the testing index page opens.
4. Click 'View Keymanweb use samples' link button.
5. Verify KeymanWeb Samples page opens.
6. Click 'Example1 - Toggle UI, all resources in same folder as page' link button.
@@ -151,7 +151,7 @@ Original TestLodge ID: TC163
10. Verify that the Khmer Angkor keyboard is added and displayed on the Screen.
11. Open Chrome browser in Windows OS.
12. Enter ‘https://build.palaso.org/repository/download/Keymanweb_TestPullRequests/391530:id/index.html' in the Search bar.
-13.Verify that the testing index page opens.
+13. Verify that the testing index page opens.
14. Click 'View Keymanweb use samples' link button.
15. Verify KeymanWeb Samples page opens.
16. Click 'Example1 - Toggle UI, all resources in same folder as page' link button.
@@ -161,7 +161,7 @@ Original TestLodge ID: TC163
20. Verify that the Khmer Angkor keyboard is added and displayed on the Screen.
21. Open Safari browser in macOS.
22. Enter ‘https://build.palaso.org/repository/download/Keymanweb_TestPullRequests/391530:id/index.html' in the Search bar.
-23.Verify that the testing index page opens.
+23. Verify that the testing index page opens.
24. Click 'View Keymanweb use samples' link button.
25. Verify KeymanWeb Samples page opens.
26. Click 'Example1 - Toggle UI, all resources in same folder as page' link button.
@@ -171,7 +171,7 @@ Original TestLodge ID: TC163
30. Verify that the Khmer Angkor keyboard is added and displayed on the Screen.
31. Open Chrome browser in macOS.
32. Enter ‘https://build.palaso.org/repository/download/Keymanweb_TestPullRequests/391530:id/index.html' in the Search bar.
-33.Verify that the testing index page opens.
+33. Verify that the testing index page opens.
34. Click 'View Keymanweb use samples' link button.
35. Verify KeymanWeb Samples page opens.
36. Click 'Example1 - Toggle UI, all resources in same folder as page' link button.
@@ -181,7 +181,7 @@ Original TestLodge ID: TC163
40. Verify that the Khmer Angkor keyboard is added and displayed on the Screen.
41. Open Firefox browser in macOS.
42. Enter ‘https://build.palaso.org/repository/download/Keymanweb_TestPullRequests/391530:id/index.html' in the Search bar.
-43.Verify that the testing index page opens.
+43. Verify that the testing index page opens.
44. Click 'View Keymanweb use samples' link button.
45. Verify KeymanWeb Samples page opens.
46. Click 'Example1 - Toggle UI, all resources in same folder as page' link button.
@@ -191,7 +191,7 @@ Original TestLodge ID: TC163
50. Verify that the Khmer Angkor keyboard is added and displayed on the Screen.
51. Open Firefox browser in Linux OS.
52. Enter ‘https://build.palaso.org/repository/download/Keymanweb_TestPullRequests/391530:id/index.html' in the Search bar.
-53.Verify that the testing index page opens.
+53. Verify that the testing index page opens.
54. Click 'View Keymanweb use samples' link button.
55. Verify KeymanWeb Samples page opens.
56. Click 'Example1 - Toggle UI, all resources in same folder as page' link button.
@@ -252,7 +252,7 @@ Original TestLodge ID: TC164
1. Open Firefox browser in Windows OS.
2. Enter ‘https://build.palaso.org/repository/download/Keymanweb_TestPullRequests/391530:id/index.html' in the Search bar.
-3.Verify that the testing index page opens.
+3. Verify that the testing index page opens.
4. Click 'View Keymanweb use samples' link button.
5. Verify KeymanWeb Samples page opens.
6. Click 'Example1 - Toggle UI, all resources in same folder as page' link button.
@@ -276,7 +276,7 @@ Original TestLodge ID: TC164
24. Verify it deletes the remaining letter on the screen.
25. Open Chrome browser in Windows OS.
22. Enter ‘https://build.palaso.org/repository/download/Keymanweb_TestPullRequests/391530:id/index.html' in the Search bar.
-23.Verify that the testing index page opens.
+23. Verify that the testing index page opens.
24. Click 'View Keymanweb use samples' link button.
25. Verify KeymanWeb Samples page opens.
26. Click 'Example1 - Toggle UI, all resources in same folder as page' link button.
@@ -300,7 +300,7 @@ Original TestLodge ID: TC164
40. Verify it deletes the remaining letter on the screen.
41. Open Safari browser in macOS
42. Enter ‘https://build.palaso.org/repository/download/Keymanweb_TestPullRequests/391530:id/index.html' in the Search bar.
-43.Verify that the testing index page opens.
+43. Verify that the testing index page opens.
44. Click 'View Keymanweb use samples' link button.
45. Verify KeymanWeb Samples page opens.
46. Click 'Example1 - Toggle UI, all resources in same folder as page' link button.
@@ -324,7 +324,7 @@ Original TestLodge ID: TC164
64. Verify it deletes the remaining letter on the screen.
61. Open Chrome browser in macOS.
62. Enter ‘https://build.palaso.org/repository/download/Keymanweb_TestPullRequests/391530:id/index.html' in the Search bar.
-63.Verify that the testing index page opens.
+63. Verify that the testing index page opens.
64. Click 'View Keymanweb use samples' link button.
65. Verify KeymanWeb Samples page opens.
66. Click 'Example1 - Toggle UI, all resources in same folder as page' link button.
@@ -348,7 +348,7 @@ Original TestLodge ID: TC164
84. Verify it deletes the remaining letter on the screen.
85. Open Firefox browser in macOS.
86. Enter ‘https://build.palaso.org/repository/download/Keymanweb_TestPullRequests/391530:id/index.html' in the Search bar.
-87.Verify that the testing index page opens.
+87. Verify that the testing index page opens.
88. Click 'View Keymanweb use samples' link button.
89. Verify KeymanWeb Samples page opens.
90. Click 'Example1 - Toggle UI, all resources in same folder as page' link button.
@@ -372,7 +372,7 @@ Original TestLodge ID: TC164
108. Verify it deletes the remaining letter on the screen.
101. Open Firefox browser in Linux OS.
102. Enter ‘https://build.palaso.org/repository/download/Keymanweb_TestPullRequests/391530:id/index.html' in the Search bar.
-103.Verify that the testing index page opens.
+103. Verify that the testing index page opens.
104. Click 'View Keymanweb use samples' link button.
105. Verify KeymanWeb Samples page opens.
106. Click 'Example1 - Toggle UI, all resources in same folder as page' link button.
@@ -447,7 +447,7 @@ Original TestLodge ID: TC165
1. Open Firefox browser in Windows OS.
2. Enter ‘https://build.palaso.org/repository/download/Keymanweb_TestPullRequests/391530:id/index.html' in the Search bar.
-3.Verify that the testing index page opens.
+3. Verify that the testing index page opens.
4. Click 'View Keymanweb use samples' link button.
5. Verify KeymanWeb Samples page opens.
6. Click 'Example1 - Toggle UI, all resources in same folder as page' link button.
@@ -458,7 +458,7 @@ Original TestLodge ID: TC165
11. Verify that a Spanish keyboard is added to the list.
12. Open Chrome browser in Windows OS.
13. Enter ‘https://build.palaso.org/repository/download/Keymanweb_TestPullRequests/391530:id/index.html' in the Search bar.
-14.Verify that the testing index page opens.
+14. Verify that the testing index page opens.
15. Click 'View Keymanweb use samples' link button.
16. Verify KeymanWeb Samples page opens.
17. Click 'Example1 - Toggle UI, all resources in same folder as page' link button.
@@ -469,7 +469,7 @@ Original TestLodge ID: TC165
22. Verify that a Spanish keyboard is added to the list.
23. Open Safari browser in macOS.
24. Enter ‘https://build.palaso.org/repository/download/Keymanweb_TestPullRequests/391530:id/index.html' in the Search bar.
-25.Verify that the testing index page opens.
+25. Verify that the testing index page opens.
26. Click 'View Keymanweb use samples' link button.
27. Verify KeymanWeb Samples page opens.
28. Click 'Example1 - Toggle UI, all resources in same folder as page' link button.
@@ -480,7 +480,7 @@ Original TestLodge ID: TC165
33. Verify that a Spanish keyboard is added to the list.
34. Open Chrome browser in macOS.
35. Enter ‘https://build.palaso.org/repository/download/Keymanweb_TestPullRequests/391530:id/index.html' in the Search bar.
-36.Verify that the testing index page opens.
+36. Verify that the testing index page opens.
37. Click 'View Keymanweb use samples' link button.
38. Verify KeymanWeb Samples page opens.
39. Click 'Example1 - Toggle UI, all resources in same folder as page' link button.
@@ -491,7 +491,7 @@ Original TestLodge ID: TC165
44. Verify that a Spanish keyboard is added to the list.
45. Open Firefox browser in macOS.
46. Enter ‘https://build.palaso.org/repository/download/Keymanweb_TestPullRequests/391530:id/index.html' in the Search bar.
-47.Verify that the testing index page opens.
+47. Verify that the testing index page opens.
48. Click 'View Keymanweb use samples' link button.
49. Verify KeymanWeb Samples page opens.
50. Click 'Example1 - Toggle UI, all resources in same folder as page' link button.
@@ -502,7 +502,7 @@ Original TestLodge ID: TC165
55. Verify that a Spanish keyboard is added to the list.
56. Open Firefox browser in Linux OS.
57. Enter ‘https://build.palaso.org/repository/download/Keymanweb_TestPullRequests/391530:id/index.html' in the Search bar.
-58.Verify that the testing index page opens.
+58. Verify that the testing index page opens.
59. Click 'View Keymanweb use samples' link button.
60. Verify KeymanWeb Samples page opens.
61. Click 'Example1 - Toggle UI, all resources in same folder as page' link button.
@@ -564,7 +564,7 @@ Original TestLodge ID: TC166
1. Open Firefox browser in Windows OS.
2. Enter ‘https://build.palaso.org/repository/download/Keymanweb_TestPullRequests/391530:id/index.html' in the Search bar.
-3.Verify that the testing index page opens.
+3. Verify that the testing index page opens.
4. Click 'View Keymanweb use samples' link button.
5. Verify KeymanWeb Samples page opens.
6. Click 'Example1 - Toggle UI, all resources in same folder as page' link button.
@@ -677,7 +677,7 @@ Original TestLodge ID: TC167
45. Type d.
46. Verify that the final letter should be xdx.
47. Open Chrome browser in Windows OS.
-48.Enter ‘https://build.palaso.org/repository/download/Keymanweb_TestPullRequests/391530:id/index.html' in the Search bar.
+48. Enter ‘https://build.palaso.org/repository/download/Keymanweb_TestPullRequests/391530:id/index.html' in the Search bar.
49. Verify that the testing index page opens.
50. Click 'View Keymaweb website-oriented manual test pages' link button.
51. Verify KeymanWeb Samples page opens.
@@ -951,7 +951,7 @@ Original TestLodge ID: TC169
Action
1. Open Firefox browser in Linux OS.
-2.Enter ‘https://build.palaso.org/repository/download/Keymanweb_TestPullRequests/391530:id/index.html' in the Search bar.
+2. Enter ‘https://build.palaso.org/repository/download/Keymanweb_TestPullRequests/391530:id/index.html' in the Search bar.
3. Verify that the testing index page opens.
4. Click 'View Keymaweb website-oriented manual test pages' link button.
5. Verify KeymanWeb Samples page opens.
@@ -1176,7 +1176,7 @@ Original TestLodge ID: TC171
11. Click / touch a blank area of the page.
12. Verify that the OSK should automatically hide.
13. Open Chrome in windows OS.
-14.Enter ‘https://build.palaso.org/repository/download/Keymanweb_TestPullRequests/391530:id/index.html' in the Search bar.
+14. Enter ‘https://build.palaso.org/repository/download/Keymanweb_TestPullRequests/391530:id/index.html' in the Search bar.
15. Verify that the testing index page opens.
16. Click 'Tests the new Attachment/Enablement API functionality' link button.
17. Verify KeymanWeb Samples - Attachment API Testing page opens.
@@ -1293,8 +1293,8 @@ Original TestLodge ID: TC172
1. Open Firefox browser in Windows OS.
2. Enter ‘https://build.palaso.org/repository/download/Keymanweb_TestPullRequests/391530:id/index.html' in the Search bar.
-3.Verify that the testing index page opens.
-4.Click 'Tests the new Attachment/Enablement API functionality' link button.
+3. Verify that the testing index page opens.
+4. Click 'Tests the new Attachment/Enablement API functionality' link button.
5. Verify KeymanWeb Samples - Attachment API Testing page opens.
6. Click the ‘Create Inputs’ button one time.
7. Click the ‘Create Textarea’ button one time.
@@ -1451,7 +1451,7 @@ Verify KeymanWeb Samples - Attachment API Testing page opens.
15. Click Dynamic area #2.
16. Verify that the Lao keyboard should be displayed.
17. Open Chrome browser in Windows OS.
-18.Enter ‘https://build.palaso.org/repository/download/Keymanweb_TestPullRequests/391530:id/index.html' in the Search bar.
+18. Enter ‘https://build.palaso.org/repository/download/Keymanweb_TestPullRequests/391530:id/index.html' in the Search bar.
19. Verify that the testing index page opens.
20. Click 'Tests the new Attachment/Enablement API functionality' link button.
21. Verify KeymanWeb Samples - Attachment API Testing page opens.
@@ -1523,7 +1523,7 @@ Verify KeymanWeb Samples - Attachment API Testing page opens.
87. Click Dynamic area #2.
88. Verify that the Lao keyboard should be displayed.
89. Open Firefox browser in macOS.
-90.Enter ‘https://build.palaso.org/repository/download/Keymanweb_TestPullRequests/391530:id/index.html' in the Search bar.
+90. Enter ‘https://build.palaso.org/repository/download/Keymanweb_TestPullRequests/391530:id/index.html' in the Search bar.
91. Verify that the testing index page opens.
92. Click 'Tests the new Attachment/Enablement API functionality' link button.
93. Verify KeymanWeb Samples - Attachment API Testing page opens.
@@ -1628,7 +1628,7 @@ Original TestLodge ID: TC174
15. Type 2.
16. Verify the second option should replace the context.
17. Open Chrome browser in Windows OS.
-18.Enter ‘https://build.palaso.org/repository/download/Keymanweb_TestPullRequests/391530:id/index.html' in the Search bar.
+18. Enter ‘https://build.palaso.org/repository/download/Keymanweb_TestPullRequests/391530:id/index.html' in the Search bar.
19. Verify that the testing index page opens.
20. Click 'View Keymaweb website-oriented manual test pages' link button.
21. Verify KeymanWeb Samples page opens.
@@ -1644,7 +1644,7 @@ Original TestLodge ID: TC174
31. Type 2.
32. Verify the second option should replace the context.
33. Open Safari browser in macOS.
-34.Enter ‘https://build.palaso.org/repository/download/Keymanweb_TestPullRequests/391530:id/index.html' in the Search bar.
+34. Enter ‘https://build.palaso.org/repository/download/Keymanweb_TestPullRequests/391530:id/index.html' in the Search bar.
35. Verify that the testing index page opens.
36. Click 'View Keymaweb website-oriented manual test pages' link button.
37. Verify KeymanWeb Samples page opens.
@@ -1692,7 +1692,7 @@ Original TestLodge ID: TC174
80. Type 2.
81. Verify the second option should replace the context.
82. Open Firefox in Linux OS.
-83.Enter ‘https://build.palaso.org/repository/download/Keymanweb_TestPullRequests/391530:id/index.html' in the Search bar.
+83. Enter ‘https://build.palaso.org/repository/download/Keymanweb_TestPullRequests/391530:id/index.html' in the Search bar.
84. Verify that the testing index page opens.
85. Click 'View Keymaweb website-oriented manual test pages' link button.
86. Verify KeymanWeb Samples page opens.
@@ -1760,10 +1760,10 @@ Original TestLodge ID: TC175
1. Open Firefox browser in Windows OS.
2. Enter ‘https://build.palaso.org/repository/download/Keymanweb_TestPullRequests/391530:id/index.html' in the Search bar.
-3.Verify that the testing index page opens.
+3. Verify that the testing index page opens.
4. Click 'View Keymaweb website-oriented manual test pages' link button.
5. Verify KeymanWeb Samples page opens.
-6.Click 'Test unminified Keymanweb' link button.
+6. Click 'Test unminified Keymanweb' link button.
7. Verify the corresponding KeymaWeb Sample page opens.
8. Type 'japanese' under "Add a keyboard by keyboard name" text box.
9. Click Add button.
@@ -1843,7 +1843,7 @@ Original TestLodge ID: TC175
83. Verify that the OSK should remain visible.
84. Verify the caret should move from the input control to the textarea control.
85. Open Chrome browser in macOS.
-86.Enter ‘https://build.palaso.org/repository/download/Keymanweb_TestPullRequests/391530:id/index.html' in the Search bar.
+86. Enter ‘https://build.palaso.org/repository/download/Keymanweb_TestPullRequests/391530:id/index.html' in the Search bar.
87. Verify that the testing index page opens.
88. Click 'View Keymaweb website-oriented manual test pages' link button.
89. Verify KeymanWeb Samples page opens.
@@ -2028,7 +2028,7 @@ Original TestLodge ID: TC176
49. Verify that the letter ‘ŋ’ appears on the text input screen.
50. Click the Safari browser in iPad Tablet.
51. Enter ‘https://build.palaso.org/repository/download/Keymanweb_TestPullRequests/391530:id/index.html' in the Search bar.
-52.Verify that the testing index page opens.
+52. Verify that the testing index page opens.
53. Click 'View Keymanweb use samples' link button.
54. Verify KeymanWeb Samples page opens.
55. Click 'Example1 - Toggle UI, all resources in same folder as page' link button.
@@ -2039,7 +2039,7 @@ Original TestLodge ID: TC176
60. Long-press ‘n’ key, while keeping the finger down, move on the long-press options ‘ŋ‘ so it's highlighted, and release.
61. Verify that the letter ‘ŋ’ appears on the text input screen.
62. Click the Safari browser in the iPad Tablet with a physical keyboard.
-63.Enter ‘https://build.palaso.org/repository/download/Keymanweb_TestPullRequests/391530:id/index.html' in the Search bar.
+63. Enter ‘https://build.palaso.org/repository/download/Keymanweb_TestPullRequests/391530:id/index.html' in the Search bar.
64. Verify that the testing index page opens.
65. Click 'View Keymanweb use samples' link button.
66. Verify KeymanWeb Samples page opens.
@@ -2262,7 +2262,7 @@ Original TestLodge ID: TC178
48. Hit Backspace key.
49. Verify that it shows an empty text area.
50. Click the Safari browser in an iPhone Mobile.
-51.Enter ‘https://build.palaso.org/repository/download/Keymanweb_TestPullRequests/391530:id/index.html' in the Search bar.
+51. Enter ‘https://build.palaso.org/repository/download/Keymanweb_TestPullRequests/391530:id/index.html' in the Search bar.
52. Verify that the testing index page opens.
53. Click 'View Keymanweb use samples' link button.
54. Verify KeymanWeb Samples page opens.
@@ -2432,7 +2432,7 @@ Original TestLodge ID: TC179
20. Click the Add button.
21. Verify that the Spanish keyboard is added to the list.
22. Click Safari browser in an iPhone Mobile.
-23.Enter ‘https://build.palaso.org/repository/download/Keymanweb_TestPullRequests/391530:id/index.html' in the Search bar.
+23. Enter ‘https://build.palaso.org/repository/download/Keymanweb_TestPullRequests/391530:id/index.html' in the Search bar.
24. Verify that the testing index page opens.
25. Click 'View Keymanweb use samples' link button.
26. Verify KeymanWeb Samples page opens.
@@ -2807,7 +2807,7 @@ Original TestLodge ID: TC182
8. Verify that manual attachment mode results in a page with no KMW-activated controls.
9. Verify that the KeymanWeb is properly attached to and detaches from each relevant type of control with the page’s API-interface controls.
10. Click the Chrome browser icon in an Android Mobile device attached with a physical keyboard.
-11.Enter ‘https://build.palaso.org/repository/download/Keymanweb_TestPullRequests/391530:id/index.html' in the Search bar.
+11. Enter ‘https://build.palaso.org/repository/download/Keymanweb_TestPullRequests/391530:id/index.html' in the Search bar.
12. Verify that the testing index page opens.
13. Click 'View Keymanweb website-oriented manual test pages' link button.
14. Verify KeymanWeb 17 Testing page opens.
@@ -3081,7 +3081,7 @@ Original TestLodge ID: TC184
16. Click / touch a blank area of the page.
17. Verify that the OSK should automatically hide.
18. Click the Chrome browser in Android mobile attached with physical keyboard
-19.Enter ‘https://build.palaso.org/repository/download/Keymanweb_TestPullRequests/391530:id/index.html' in the Search bar.
+19. Enter ‘https://build.palaso.org/repository/download/Keymanweb_TestPullRequests/391530:id/index.html' in the Search bar.
20. Verify that the testing index page opens.
21. Click 'View Keymanweb website-oriented manual test pages' link button.
22. Verify KeymanWeb 17 Testing page opens.
@@ -3132,7 +3132,7 @@ Original TestLodge ID: TC184
73. Click / touch a blank area of the page.
74. Verify that the OSK should automatically hide.
75. Click the Safari browser icon on the iPad device.
-76.Enter ‘https://build.palaso.org/repository/download/Keymanweb_TestPullRequests/391530:id/index.html' in the Search bar.
+76. Enter ‘https://build.palaso.org/repository/download/Keymanweb_TestPullRequests/391530:id/index.html' in the Search bar.
77. Verify that the testing index page opens.
78. Click 'View Keymanweb website-oriented manual test pages' link button.
79. Verify KeymanWeb 17 Testing page opens.
diff --git a/docs/tests/acceptance/windows.md b/docs/tests/acceptance/windows.md
index b8edc32dc9..dce81ce2f9 100644
--- a/docs/tests/acceptance/windows.md
+++ b/docs/tests/acceptance/windows.md
@@ -1,5 +1,20 @@
# Windows Acceptance Tests
+### Clean up instructions for manual tests
+For all these acceptance steps to perform a `cleanup` Uninstall Keyman and any third-party applications installed as part for the `Setup` steps.
+
+If an installation becomes corrupted and it is not possible to uninstall `Keyman for Windows` through `Add or remove programs`, clean up the files in the following folders if they exist.
+
+- %ProgramFiles(x86)%\Keyman or %ProgramFiles%\Keyman
+- %CommonProgramFiles(x86)%\Keyman or %CommonProgramFiles%\Keyman
+- %ProgramData%\Keyman
+- %AppData%\Keyman
+- %LocalAppData%\Keyman
+
+If still having trouble remove the registry values at
+- HKCU\Software\Keyman
+- HKLM\Software\Wow6432Node\Keyman
+
**TEST_1**
Test case for INSTALL Keyman
@@ -56,21 +71,6 @@ Original TestLodge ID: TC01
-
-Cleanup
-
-1. Type ‘Control panel’ in the Search bar (in Task bar)
-2. Verify that the ‘Control panel’ appears in the menu list.
-3. Click the Control panel option.
-4. Verify that the Control Panel dialog appears.
-5. Click the ‘Uninstall a Program’ option.
-6. Verify that the Programs and Features dialog box opens.
-7. Select the installed Keyman version from the list.
-8. Click the Uninstall option.
-9. Verify that the Keyman Uninstallation completed successfully.
-
-
-
---
**TEST_2**
@@ -134,21 +134,6 @@ Original TestLodge ID: TC02
-
-Cleanup
-
-1. Type ‘Control panel’ in the Search bar (in Task bar)
-2. Verify that the ‘Control panel’ appears in the menu list.
-3. Click the Control panel option.
-4. Verify that the Control Panel dialog appears.
-5. Click the ‘Uninstall a Program’ option.
-6. Verify that the Programs and Features dialog box opens.
-7. Select the installed Keyman version from the list.
-8. Click the Uninstall option.
-9. Verify that the the Keyman Uninstallation completed successfully
-
-
-
---
**TEST_3**
@@ -203,21 +188,6 @@ Original TestLodge ID: TC03
-
-Cleanup
-
-1. Type ‘Control panel’ in the Search bar (in Task bar)
-2. Verify that the ‘Control panel’ appears in the menu list.
-3. Click the Control panel option.
-4. Verify that the Control Panel dialog appears.
-5. Click the ‘Uninstall a Program’ option.
-6. Verify that the Programs and Features dialog box opens.
-7. Select the installed Keyman version from the list.
-8. Click the Uninstall option.
-9. Verify that the the Keyman Uninstallation completed successfully
-
-
-
---
**TEST_4**
@@ -269,21 +239,6 @@ Original TestLodge ID: TC04
-
-Cleanup
-
-1. Type ‘Control panel’ in the Search bar (in Task bar)
-2. Verify that the ‘Control panel’ appears in the menu list.
-3. Click the Control panel option.
-4. Verify that the Control Panel dialog appears.
-5. Click the ‘Uninstall a Program’ option.
-6. Verify that the Programs and Features dialog box opens.
-7. Select the installed Keyman version from the list.
-8. Click the Uninstall option.
-9. Verify that the the Keyman Uninstallation completed successfully
-
-
-
---
**TEST_5**
@@ -328,21 +283,6 @@ Original TestLodge ID: TC05
-
-Cleanup
-
-1. Type ‘Control panel’ in the Search bar (in Task bar)
-2. Verify that the ‘Control panel’ appears in the menu list.
-3. Click the Control panel option.
-4. Verify that the Control Panel dialog appears.
-5. Click the ‘Uninstall a Program’ option.
-6. Verify that the Programs and Features dialog box opens.yman 16.0’ from the list.
-7. Select the installed Keyman version from the list.
-8. Click the Uninstall option.
-9. Verify that the the Keyman Uninstallation completed successfully
-
-
-
---
**TEST_6**
@@ -367,9 +307,9 @@ Original TestLodge ID: TC06
Setup
-1.Install Keyman latest Stable build from Keyman.com site.
-2.Install CapsLock Keyboard.
-3.CapsLock is currently on
+1. Install Keyman latest Stable build from Keyman.com site.
+2. Install CapsLock Keyboard.
+3. CapsLock is currently on
4. Currently active keyboard is the CapsLock Keyboard.
@@ -384,21 +324,6 @@ Original TestLodge ID: TC06
-
-Cleanup
-
-1. Type ‘Control panel’ in the Search bar (in Task bar)
-2. Verify that the ‘Control panel’ appears in the menu list.
-3. Click the Control panel option.
-4. Verify that the Control Panel dialog appears.
-5. Click the ‘Uninstall a Program’ option.
-6. Verify that the Programs and Features dialog box opens.
-7. Select the installed Keyman version from the list.
-8. Click the Uninstall option.
-9. Verify that the the Keyman Uninstallation completed successfully
-
-
-
---
**TEST_7**
@@ -423,10 +348,10 @@ Original TestLodge ID: TC07
Setup
-1.Install Keyman latest Stable build from Keyman.com Site.
-2.Install CapsLock Keyboard.
+1. Install Keyman latest Stable build from Keyman.com Site.
+2. Install CapsLock Keyboard.
3. CapsLock is currently on
-4.Currently active keyboard is the CapsLock Keyboard.
+4. Currently active keyboard is the CapsLock Keyboard.
@@ -440,21 +365,6 @@ Original TestLodge ID: TC07
-
-Cleanup
-
-1. Type ‘Control panel’ in the Search bar (in Task bar)
-2. Verify that the ‘Control panel’ appears in the menu list.
-3. Click the Control panel option.
-4. Verify that the Control Panel dialog appears.
-5. Click the ‘Uninstall a Program’ option.
-6. Verify that the Programs and Features dialog box opens.
-7. Select the installed Keyman version from the list.
-8. Click the Uninstall option.
-9. Verify that the the Keyman Uninstallation completed successfully
-
-
-
---
**TEST_8**
@@ -496,21 +406,6 @@ Original TestLodge ID: TC08
-
-Cleanup
-
-1. Type ‘Control panel’ in the Search bar (in Task bar)
-2. Verify that the ‘Control panel’ appears in the menu list.
-3. Click the Control panel option.
-4. Verify that the Control Panel dialog appears.
-5. Click the ‘Uninstall a Program’ option.
-6. Verify that the Programs and Features dialog box opens.
-7. Select the installed Keyman version from the list.
-8. Click the Uninstall option.
-9. Verify that the the Keyman Uninstallation completed successfully
-
-
-
---
**TEST_9**
@@ -552,21 +447,6 @@ Original TestLodge ID: TC09
-
-Cleanup
-
-1. Type ‘Control panel’ in the Search bar (in Task bar)
-2. Verify that the ‘Control panel’ appears in the menu list.
-3. Click the Control panel option.
-4. Verify that the Control Panel dialog appears.
-5. Click the ‘Uninstall a Program’ option.
-6. Verify that the Programs and Features dialog box opens.
-7. Select the installed Keyman version from the list.
-8. Click the Uninstall option.
-9. Verify that the the Keyman Uninstallation completed successfully
-
-
-
---
**TEST_10**
@@ -608,21 +488,6 @@ Original TestLodge ID: TC10
-
-Cleanup
-
-1. Type ‘Control panel’ in the Search bar (in Task bar)
-2. Verify that the ‘Control panel’ appears in the menu list.
-3. Click the Control panel option.
-4. Verify that the Control Panel dialog appears.
-5. Click the ‘Uninstall a Program’ option.
-6. Verify that the Programs and Features dialog box opens.
-7. Select the installed Keyman version from the list.
-8. Click the Uninstall option.
-9. Verify that the the Keyman Uninstallation completed successfully
-
-
-
---
**TEST_11**
@@ -667,21 +532,6 @@ Original TestLodge ID: TC11
-
-Cleanup
-
-1. Type ‘Control panel’ in the Search bar (in Task bar)
-2. Verify that the ‘Control panel’ appears in the menu list.
-3. Click the Control panel option.
-4. Verify that the Control Panel dialog appears.
-5. Click the ‘Uninstall a Program’ option.
-6. Verify that the Programs and Features dialog box opens.
-7. Select the installed Keyman version from the list.
-8. Click the Uninstall option.
-9. Verify that the the Keyman Uninstallation completed successfully
-
-
-
---
**TEST_12**
@@ -728,21 +578,6 @@ Original TestLodge ID: TC12
-
-Cleanup
-
-1. Type ‘Control panel’ in the Search bar (in Task bar)
-2. Verify that the ‘Control panel’ appears in the menu list.
-3. Click the Control panel option.
-4. Verify that the Control Panel dialog appears.
-5. Click the ‘Uninstall a Program’ option.
-6. Verify that the Programs and Features dialog box opens.
-7. Select the installed Keyman version from the list.
-8. Click the Uninstall option.
-9. Verify that the the Keyman Uninstallation completed successfully
-
-
-
---
**TEST_13**
@@ -789,21 +624,6 @@ Original TestLodge ID: TC13
-
-Cleanup
-
-1. Type ‘Control panel’ in the Search bar (in Task bar)
-2. Verify that the ‘Control panel’ appears in the menu list.
-3. Click the Control panel option.
-4. Verify that the Control Panel dialog appears.
-5. Click the ‘Uninstall a Program’ option.
-6. Verify that the Programs and Features dialog box opens.
-7. Select the installed Keyman version from the list.
-8. Click the Uninstall option.
-9. Verify that the the Keyman Uninstallation completed successfully
-
-
-
---
**TEST_14**
@@ -848,21 +668,6 @@ Original TestLodge ID: TC14
-
-Cleanup
-
-1. Type ‘Control panel’ in the Search bar (in Task bar)
-2. Verify that the ‘Control panel’ appears in the menu list.
-3. Click the Control panel option.
-4. Verify that the Control Panel dialog appears.
-5. Click the ‘Uninstall a Program’ option.
-6. Verify that the Programs and Features dialog box opens.
-7. Select the installed Keyman version from the list.
-8. Click the Uninstall option.
-9. Verify that the the Keyman Uninstallation completed successfully
-
-
-
---
**TEST_15**
@@ -908,21 +713,6 @@ Original TestLodge ID: TC15
-
-Cleanup
-
-1. Type ‘Control panel’ in the Search bar (in Task bar)
-2. Verify that the ‘Control panel’ appears in the menu list.
-3. Click the Control panel option.
-4. Verify that the Control Panel dialog appears.
-5. Click the ‘Uninstall a Program’ option.
-6. Verify that the Programs and Features dialog box opens.
-7. Select the installed Keyman version from the list.
-8. Click the Uninstall option.
-9. Verify that the the Keyman Uninstallation completed successfully
-
-
-
---
**TEST_16**
@@ -964,21 +754,6 @@ Original TestLodge ID: TC16
-
-Cleanup
-
-1. Type ‘Control panel’ in the Search bar (in Task bar)
-2. Verify that the ‘Control panel’ appears in the menu list.
-3. Click the Control panel option.
-4. Verify that the Control Panel dialog appears.
-5. Click the ‘Uninstall a Program’ option.
-6. Verify that the Programs and Features dialog box opens.
-7. Select the installed Keyman version from the list.
-8. Click the Uninstall option.
-9. Verify that the the Keyman Uninstallation completed successfully
-
-
-
---
**TEST_17**
@@ -1022,21 +797,6 @@ Original TestLodge ID: TC17
-
-Cleanup
-
-1. Type ‘Control panel’ in the Search bar (in Task bar)
-2. Verify that the ‘Control panel’ appears in the menu list.
-3. Click the Control panel option.
-4. Verify that the Control Panel dialog appears.
-5. Click the ‘Uninstall a Program’ option.
-6. Verify that the Programs and Features dialog box opens.
-7. Select the installed Keyman version from the list.
-8. Click the Uninstall option.
-9. Verify that the the Keyman Uninstallation completed successfully
-
-
-
---
**TEST_18**
@@ -1081,21 +841,6 @@ Original TestLodge ID: TC18
-
-Cleanup
-
-1. Type ‘Control panel’ in the Search bar (in Task bar)
-2. Verify that the ‘Control panel’ appears in the menu list.
-3. Click the Control panel option.
-4. Verify that the Control Panel dialog appears.
-5. Click the ‘Uninstall a Program’ option.
-6. Verify that the Programs and Features dialog box opens.
-7. Select the installed Keyman version from the list.
-8. Click the Uninstall option.
-9. Verify that the the Keyman Uninstallation completed successfully
-
-
-
---
**TEST_19**
@@ -1139,21 +884,6 @@ Original TestLodge ID: TC19
-
-Cleanup
-
-1. Type ‘Control panel’ in the Search bar (in Task bar)
-2. Verify that the ‘Control panel’ appears in the menu list.
-3. Click the Control panel option.
-4. Verify that the Control Panel dialog appears.
-5. Click the ‘Uninstall a Program’ option.
-6. Verify that the Programs and Features dialog box opens.
-7. Select the installed Keyman version from the list.
-8. Click the Uninstall option.
-9. Verify that the the Keyman Uninstallation completed successfully
-
-
-
---
**TEST_20**
@@ -1198,21 +928,6 @@ Original TestLodge ID: TC20
-
-Cleanup
-
-1. Type ‘Control panel’ in the Search bar (in Task bar)
-2. Verify that the ‘Control panel’ appears in the menu list.
-3. Click the Control panel option.
-4. Verify that the Control Panel dialog appears.
-5. Click the ‘Uninstall a Program’ option.
-6. Verify that the Programs and Features dialog box opens.
-7. Select the installed Keyman version from the list.
-8. Click the Uninstall option.
-9. Verify that the the Keyman Uninstallation completed successfully
-
-
-
---
**TEST_21**
@@ -1273,21 +988,6 @@ Original TestLodge ID: TC21
-
-Cleanup
-
-1. Type ‘Control panel’ in the Search bar (in Task bar)
-2. Verify that the ‘Control panel’ appears in the menu list.
-3. Click the Control panel option.
-4. Verify that the Control Panel dialog appears.
-5. Click the ‘Uninstall a Program’ option.
-6. Verify that the Programs and Features dialog box opens.
-7. Select the installed Keyman version from the list.
-8. Click the Uninstall option.
-9. Verify that the the Keyman Uninstallation completed successfully
-
-
-
---
**TEST_22**
@@ -1331,21 +1031,6 @@ Original TestLodge ID: TC22
-
-Cleanup
-
-1. Type ‘Control panel’ in the Search bar (in Task bar)
-2. Verify that the ‘Control panel’ appears in the menu list.
-3. Click the Control panel option.
-4. Verify that the Control Panel dialog appears.
-5. Click the ‘Uninstall a Program’ option.
-6. Verify that the Programs and Features dialog box opens.
-7. Select the installed Keyman version from the list.
-8. Click the Uninstall option.
-9. Verify that the the Keyman Uninstallation completed successfully
-
-
-
---
**TEST_23**
@@ -1389,21 +1074,6 @@ Original TestLodge ID: TC23
-
-Cleanup
-
-1. Type ‘Control panel’ in the Search bar (in Task bar)
-2. Verify that the ‘Control panel’ appears in the menu list.
-3. Click the Control panel option.
-4. Verify that the Control Panel dialog appears.
-5. Click the ‘Uninstall a Program’ option.
-6. Verify that the Programs and Features dialog box opens.
-7. Select the installed Keyman version from the list.
-8. Click the Uninstall option.
-9. Verify that the the Keyman Uninstallation completed successfully
-
-
-
---
**TEST_24**
@@ -1462,21 +1132,6 @@ Original TestLodge ID: TC24
-
-Cleanup
-
-1. Type ‘Control panel’ in the Search bar (in Task bar)
-2. Verify that the ‘Control panel’ appears in the menu list.
-3. Click the Control panel option.
-4. Verify that the Control Panel dialog appears.
-5. Click the ‘Uninstall a Program’ option.
-6. Verify that the Programs and Features dialog box opens.
-7. Select the installed Keyman version from the list.
-8. Click the Uninstall option.
-9. Verify that the the Keyman Uninstallation completed successfully
-
-
-
---
**TEST_25**
@@ -1535,21 +1190,6 @@ Original TestLodge ID: TC25
-
-Cleanup
-
-1. Type ‘Control panel’ in the Search bar (in Task bar)
-2. Verify that the ‘Control panel’ appears in the menu list.
-3. Click the Control panel option.
-4. Verify that the Control Panel dialog appears.
-5. Click the ‘Uninstall a Program’ option.
-6. Verify that the Programs and Features dialog box opens.
-7. Select the installed Keyman version from the list.
-8. Click the Uninstall option.
-9. Verify that the the Keyman Uninstallation completed successfully
-
-
-
---
**TEST_26**
@@ -1582,7 +1222,7 @@ Original TestLodge ID: TC26
6. Create New>DWORD(32-bit) key.
7. Rename ‘ShowIMWindowAlways’ to the new DWORD key.
8. Set the Key value to1
-9.This keyboard uses the letters aeom to allow IMX input. This time a IM window should display.
+9. This keyboard uses the letters aeom to allow IMX input. This time a IM window should display.
@@ -1607,21 +1247,6 @@ Original TestLodge ID: TC26
-
-Cleanup
-
-1. Type ‘Control panel’ in the Search bar (in Task bar)
-2. Verify that the ‘Control panel’ appears in the menu list.
-3. Click the Control panel option.
-4. Verify that the Control Panel dialog appears.
-5. Click the ‘Uninstall a Program’ option.
-6. Verify that the Programs and Features dialog box opens.
-7. Select the installed Keyman version from the list.
-8. Click the Uninstall option.
-9. Verify that the the Keyman Uninstallation completed successfully
-
-
-
---
**TEST_27**
@@ -1667,21 +1292,6 @@ Original TestLodge ID: TC27
-
-Cleanup
-
-1. Type ‘Control panel’ in the Search bar (in Task bar)
-2. Verify that the ‘Control panel’ appears in the menu list.
-3. Click the Control panel option.
-4. Verify that the Control Panel dialog appears.
-5. Click the ‘Uninstall a Program’ option.
-6. Verify that the Programs and Features dialog box opens.
-7. Select the installed Keyman version from the list.
-8. Click the Uninstall option.
-9. Verify that the the Keyman Uninstallation completed successfully
-
-
-
---
**TEST_28**
@@ -1727,21 +1337,6 @@ Original TestLodge ID: TC28
-
-Cleanup
-
-1. Type ‘Control panel’ in the Search bar (in Task bar)
-2. Verify that the ‘Control panel’ appears in the menu list.
-3. Click the Control panel option.
-4. Verify that the Control Panel dialog appears.
-5. Click the ‘Uninstall a Program’ option.
-6. Verify that the Programs and Features dialog box opens.
-7. Select the installed Keyman version from the list.
-8. Click the Uninstall option.
-9. Verify that the the Keyman Uninstallation completed successfully
-
-
-
---
**TEST_29**
@@ -1789,21 +1384,6 @@ Original TestLodge ID: TC29
-
-Cleanup
-
-1. Type ‘Control panel’ in the Search bar (in Task bar)
-2. Verify that the ‘Control panel’ appears in the menu list.
-3. Click the Control panel option.
-4. Verify that the Control Panel dialog appears.
-5. Click the ‘Uninstall a Program’ option.
-6. Verify that the Programs and Features dialog box opens.
-7. Select the installed Keyman version from the list.
-8. Click the Uninstall option.
-9. Verify that the the Keyman Uninstallation completed successfully
-
-
-
---
**TEST_30**
@@ -1851,21 +1431,6 @@ Original TestLodge ID: TC30
-
-Cleanup
-
-1. Type ‘Control panel’ in the Search bar (in Task bar)
-2. Verify that the ‘Control panel’ appears in the menu list.
-3. Click the Control panel option.
-4. Verify that the Control Panel dialog appears.
-5. Click the ‘Uninstall a Program’ option.
-6. Verify that the Programs and Features dialog box opens.
-7. Select the installed Keyman version from the list.
-8. Click the Uninstall option.
-9. Verify that the the Keyman Uninstallation completed successfully
-
-
-
---
**TEST_31**
@@ -1910,21 +1475,6 @@ Original TestLodge ID: TC31
-
-Cleanup
-
-1. Type ‘Control panel’ in the Search bar (in Task bar)
-2. Verify that the ‘Control panel’ appears in the menu list.
-3. Click the Control panel option.
-4. Verify that the Control Panel dialog appears.
-5. Click the ‘Uninstall a Program’ option.
-6. Verify that the Programs and Features dialog box opens.
-7. Select the installed Keyman version from the list.
-8. Click the Uninstall option.
-9. Verify that the the Keyman Uninstallation completed successfully
-
-
-
---
**TEST_32**
@@ -1969,21 +1519,6 @@ Original TestLodge ID: TC32
-
-Cleanup
-
-1. Type ‘Control panel’ in the Search bar (in Task bar)
-2. Verify that the ‘Control panel’ appears in the menu list.
-3. Click the Control panel option.
-4. Verify that the Control Panel dialog appears.
-5. Click the ‘Uninstall a Program’ option.
-6. Verify that the Programs and Features dialog box opens.
-7. Select the installed Keyman version from the list.
-8. Click the Uninstall option.
-9. Verify that the the Keyman Uninstallation completed successfully
-
-
-
---
**TEST_33**
@@ -2032,21 +1567,6 @@ Original TestLodge ID: TC33
-
-Cleanup
-
-1. Type ‘Control panel’ in the Search bar (in Task bar)
-2. Verify that the ‘Control panel’ appears in the menu list.
-3. Click the Control panel option.
-4. Verify that the Control Panel dialog appears.
-5. Click the ‘Uninstall a Program’ option.
-6. Verify that the Programs and Features dialog box opens.
-7. Select the installed Keyman version from the list.
-8. Click the Uninstall option.
-9. Verify that the the Keyman Uninstallation completed successfully
-
-
-
---
**TEST_34**
@@ -2091,21 +1611,6 @@ Original TestLodge ID: TC34
-
-Cleanup
-
-1. Type ‘Control panel’ in the Search bar (in Task bar)
-2. Verify that the ‘Control panel’ appears in the menu list.
-3. Click the Control panel option.
-4. Verify that the Control Panel dialog appears.
-5. Click the ‘Uninstall a Program’ option.
-6. Verify that the Programs and Features dialog box opens.
-7. Select the installed Keyman version from the list.
-8. Click the Uninstall option.
-9. Verify that the the Keyman Uninstallation completed successfully
-
-
-
---
**TEST_35**
@@ -2141,19 +1646,7 @@ Original TestLodge ID: TC186
2. Change the directory path to where we downloaded the Keyman Alpha Build.
3. Type the command : keyman latest version number.exe -o (say “17.0.210.exe -o”).
4. Verify that the self extract process happened without any errors.
-5.) Verify the build was installed successfully without showing any error messages.
-
-
-
-
-Cleanup
-
-1. Type ‘Control panel’ in the Search bar (in Task bar)
-2. Click the Control Panel option.
-3. Click the ‘Uninstall a Program’ option.
-4. Select the installed Keyman version from the list.
-5. Click the Uninstall option.
-6. Verify that the keyman uninstallation was completed successfully.
+5. ) Verify the build was installed successfully without showing any error messages.
@@ -2213,21 +1706,6 @@ Original TestLodge ID: TC187
-
-Cleanup
-
-1. Type ‘Control panel’ in the Search bar (in Task bar)
-2. Verify that the ‘Control panel’ appears in the menu list.
-3. Click the Control panel option.
-4. Verify that the Control Panel dialog appears.
-5. Click the ‘Uninstall a Program’ option.
-6. Verify that the Programs and Features dialog box opens.
-7. Select the installed Keyman version from the list.
-8. Click the Uninstall option.
-9. Verify that the the Keyman Uninstallation completed successfully
-
-
-
---
**TEST_38**
@@ -2270,21 +1748,6 @@ Original TestLodge ID: TC205
-
-Cleanup
-
-1. Type ‘Control panel’ in the Search bar (in Taskbar)
-2. Verify that the ‘Control panel’ appeared in the menu list.
-3. Click the Control panel option.
-4. Verify that the Control Panel dialog appeared.
-5. Click the ‘Uninstall a Program’ option.
-6. Verify that the Programs and Features dialog box opens.
-7. Select the installed Keyman version from the list.
-8. Click the Uninstall option.
-9. Verify that the Keyman Uninstallation was completed successfully
-
-
-
---
**TEST_41**
@@ -2326,14 +1789,6 @@ Original TestLodge ID: TC218
-
-Cleanup
-
-1. Uninstall Keyman build on the Windows
-2. Uninstall the TextEdit app.
-
-
-
---
**TEST_43**
@@ -2376,14 +1831,6 @@ Original TestLodge ID: TC220
-
-Cleanup
-
-1. Uninstall Keyman build on the Windows
-2. Uninstall the TextEdit app.
-
-
-
---
**TEST_46**
@@ -2425,13 +1872,6 @@ Original TestLodge ID: TC232
-
-Cleanup
-
-1. Uninstall Keyman build on the Windows
-
-
-
---
**TEST_48**
@@ -2473,13 +1913,6 @@ Original TestLodge ID: TC234
-
-Cleanup
-
-1. Uninstall Keyman build on the Windows
-
-
-
---
**TEST_51**
@@ -2522,14 +1955,6 @@ Original TestLodge ID: TC246
-
-Cleanup
-
-1. Uninstall Keyman build on the Windows
-2. Uninstall the TextEdit app.
-
-
-
---
**TEST_53**
@@ -2572,14 +1997,6 @@ Original TestLodge ID: TC248
-
-Cleanup
-
-1. Uninstall Keyman build on the Windows
-2. Uninstall the TextEdit app.
-
-
-
---
**TEST_56**
@@ -2622,14 +2039,6 @@ Original TestLodge ID: TC261
-
-Cleanup
-
-1. Uninstall Keyman build on the Windows
-2. Uninstall the WordPad app.
-
-
-
---
**TEST_58**
@@ -2672,14 +2081,6 @@ Original TestLodge ID: TC263
-
-Cleanup
-
-1. Uninstall Keyman build on the Windows
-2. Uninstall the WordPad app.
-
-
-
---
**TEST_61**
@@ -2733,21 +2134,6 @@ Original TestLodge ID: TC295
-
-Cleanup
-
-1. Type ‘Control panel’ in the search bar (in the taskbar)
-2. Verify that the ‘Control Panel’ appears in the menu list.
-3. Click the Control Panel option.
-4. Verify that the Control Panel dialog appears.
-5. Click the ‘Uninstall a Program’ option.
-6. Verify that the Programs and Features dialog box opens.
-7. Select the installed Keyman version from the list.
-8. Click the Uninstall option.
-9. Verify that the Keyman Uninstallation was completed successfully.
-
-
-
---
**TEST_304**
@@ -2809,21 +2195,6 @@ TC - feat(windows): kmshell switch handling for the installing state_TEST_INSTAL
-
-Cleanup
-
-1. Type ‘Control panel’ in the search bar (in the task bar)
-2. Verify that the ‘Control Panel’ appears in the menu list.
-3. Click the Control Panel option.
-4. Verify that the Control Panel dialog appears.
-5. Click the ‘Uninstall a Program’ option.
-6. Verify that the Programs and Features dialog box opens.
-7. Select the installed Keyman version from the list.
-8. Click the Uninstall option.
-9. Verify that the Keyman Uninstallation was completed successfully.
-
-
-
---
**TEST_309**
@@ -2887,21 +2258,6 @@ TC - fix(windows): handle keyboard package not downloaded #12948
-
-Cleanup
-
-1. Type ‘Control panel’ in the search bar (in the task bar)
-2. Verify that the ‘Control Panel’ appears in the menu list.
-3. Click the Control Panel option.
-4. Verify that the Control Panel dialog appears.
-5. Click the ‘Uninstall a Program’ option.
-6. Verify that the Programs and Features dialog box opens.
-7. Select the installed Keyman version from the list.
-8. Click the Uninstall option.
-9. Verify that the Keyman Uninstallation was completed successfully.
-
-
-
---
**TEST_324**
@@ -2950,17 +2306,3 @@ TC - feat(windows): UI layout for update tab_TEST_UI_UPDATES_KBD #12840
-
-Cleanup
-
-1. Type ‘Control panel’ in the search bar (in the task bar)
-2. Verify that the ‘Control Panel’ appears in the menu list.
-3. Click the Control Panel option.
-4. Verify that the Control Panel dialog appears.
-5. Click the ‘Uninstall a Program’ option.
-6. Verify that the Programs and Features dialog box opens.
-7. Select the installed Keyman version from the list.
-8. Click the Uninstall option.
-9. Verify that the Keyman Uninstallation was completed successfully.
-
-
diff --git a/ios/tools/prepRelease.sh b/ios/tools/prepRelease.sh
index c54748b548..6c2c38e1af 100755
--- a/ios/tools/prepRelease.sh
+++ b/ios/tools/prepRelease.sh
@@ -25,9 +25,9 @@ if [ -d "upload" ]; then
rm -rf upload
fi
-#Include script dependency
-. $KEYMAN_ROOT/resources/build/history/history-utils.sh #includes the following
-#. ../resources/build/utils.inc.sh
+# Include script dependency
+. "$KEYMAN_ROOT/resources/build/utils.inc.sh"
+
BUILD_NUMBER="${KEYMAN_VERSION}"
@@ -36,8 +36,6 @@ CHANGELOG_PATH="upload/$BUILD_NUMBER/$KEYMAN_CHANGELOG"
WORK_DIR=`pwd`
-BUILD_COUNTER="$((${BUILD_NUMBER##*.}))"
-
UPLOAD_BASE="upload"
UPLOAD_FOLDER="${BUILD_NUMBER}"
UPLOAD_DIR="${UPLOAD_BASE}/${UPLOAD_FOLDER}"
@@ -47,8 +45,8 @@ mkdir -p "${UPLOAD_DIR}"
# First, we prep the files for publication: write changelog
echo "Writing changelog to $CHANGELOG_PATH"
-get_version_notes "ios" "${BUILD_NUMBER}" "$KEYMAN_TIER" > $CHANGELOG_PATH
-echo "* Minor fixes and performance improvements" >> $CHANGELOG_PATH
+echo "* Minor fixes and performance improvements" > $CHANGELOG_PATH
+echo "* See keyman.com/ios for full change history" >> $CHANGELOG_PATH
# Strip emoji as App Store does not allow emoji in changelogs
node "$KEYMAN_ROOT/resources/tools/strip-emoji" < "$CHANGELOG_PATH" > "$CHANGELOG_PATH.1"
diff --git a/linux/debian/changelog b/linux/debian/changelog
index e2e8f9afdd..971042b075 100644
--- a/linux/debian/changelog
+++ b/linux/debian/changelog
@@ -1,8 +1,17 @@
-keyman (18.0.249-1) UNRELEASED; urgency=medium
+keyman (18.0.253-1) UNRELEASED; urgency=medium
- * Add procps dependency (closes: 1136515)
+ * Add procps dependency (closes: #1136515)
- -- Eberhard Beilharz Mon, 18 May 2026 18:06:49 +0200
+ -- Eberhard Beilharz Tue, 06 Oct 2026 11:05:30 +0200
+
+keyman (18.0.248-2) unstable; urgency=medium
+
+ * Team upload.
+ * debian/patches/e77d2432ef91465e72460b32e5bc3e870b77fe9c.patch:
+ Backport upstream patch to fix FTBFS due to pkg_resources.
+ (Closes: #1149425)
+
+ -- Boyuan Yang Wed, 30 Sep 2026 10:39:04 -0400
keyman (18.0.248-1) unstable; urgency=medium
diff --git a/resources/build/builder-basic.inc.sh b/resources/build/builder-basic.inc.sh
index f016b3dc1e..ddb321a271 100644
--- a/resources/build/builder-basic.inc.sh
+++ b/resources/build/builder-basic.inc.sh
@@ -151,6 +151,9 @@ function _builder_basic_find_version() {
export KEYMAN_VERSION_ENVIRONMENT
export KEYMAN_VERSION_GIT_TAG
export KEYMAN_VERSION_FOR_FILENAME
+ export KEYMAN_TIER
+ export UPLOAD_SENTRY
+ export BUILDER_OS
}
function _builder_basic_find_tier() {
diff --git a/resources/build/history/history-utils.sh b/resources/build/history/history-utils.sh
deleted file mode 100755
index 9a1f8f6b5e..0000000000
--- a/resources/build/history/history-utils.sh
+++ /dev/null
@@ -1,199 +0,0 @@
-#!/usr/bin/env bash
-
-#set -x
-#DEBUG=1
-
-_hu_base_dir=$(dirname "$BASH_SOURCE")/../../..
-
-. $_hu_base_dir/resources/build/utils.inc.sh
-
-_hu_debug() {
- if [[ ! -z ${DEBUG+x} ]] && [[ $DEBUG == 1 ]]; then echo "$1"; fi
-}
-
-get_history_file_path() {
- history_file_path="$_hu_base_dir/HISTORY.md"
-}
-
-# Creates and initializes a variable called `history_file` that contains the raw content
-# of the specified project's `history.md` file.
-get_history_file() {
- get_history_file_path
-
- history_file=`cat $history_file_path`
-}
-
-### Parsing Utilities ###
-enum_line_types=("version-header", "title", "whitespace", "listitem", "other")
-
-# Title Match: # Keyman Version History
-# ${BASH_REMATCH[1]} - history.md's "Title" text.
-re_title="^#[^#](.+)"
-
-# Release Subtitle Match: ## version tier date
-# Example: ## 14.0.2 alpha 2020-02-02
-# ${BASH_REMATCH[1]} - version
-# ${BASH_REMATCH[2]} - tier
-# ${BASH_REMATCH[3]} - publishing date
-re_header="^##[[:space:]]*([0-9]+\.[0-9]+\.[0-9]+)[[:space:]]*(alpha|beta|stable)[[:space:]]*([0-9]{4}-[0-9]{2}-[0-9]{2})"
-
-# Entry in release log
-# ${BASH_REMATCH[1]} - the full line of text
-re_item="(.+)"
-
-# Checks that it's a simple line of whitespace.
-re_blank="^[[:space:]]*$"
-
-re_v_major="^([0-9]+)\.[0-9]+"
-re_v_alpha="^([0-9]+\.[0-9]+)"
-re_v_build="^[0-9]+\.[0-9]+\.([0-9]+)"
-
-### Core Parsing ###
-
-# $1 - should be the $line being processed.
-get_line_type() {
- line_type="other"
-
- if [[ "$1" =~ $re_title ]]; then
- line_type="title"
- elif [[ "$1" =~ $re_header ]]; then
- line_type="version-header"
- line_version="${BASH_REMATCH[1]}"
- line_tier="${BASH_REMATCH[2]}"
- line_date="${BASH_REMATCH[3]}"
- elif [[ "$1" =~ $re_blank ]]; then
- line_type="whitespace"
- elif [[ "$1" =~ $re_item ]]; then
- line_type="listitem"
- fi
-
- # This section is quite useful for debugging purposes.
- #if [[ $line_type != "other" ]]; then
- _hu_debug "$line_type: $1"
- #fi
-}
-
-# $1 - the markdown block to be processed. May be the subset of a file, rather than its full body.
-# $2 - a shell script command to be performed on the line. Shell script functors!
-# $3, $4 - external arguments provided to the shell script command.
-process_history_loop() {
- # Grabs one line from the specified file at a time.
- #printf "%s\n" "$1" | while IFS= read -r line || [[ -n "$line" ]]; do
- while IFS= read -r line || [[ -n "$line" ]]; do
- # Do things with the $line.
- # Like, what kind of $line is this?
- $2 "$line" "$3" "$4" "$5"
- done <<< "$1" # The triple <<< forces the loop to evaluate within the same script, preserving variable changes.
-}
-
-### Version Changelog Extraction ###
-
-# $1 - a full version string (likely in major.minor.build form)
-# Returns $v_alpha, containing only major.minor if it may be extracted. Returns $1 if not.
-get_alpha_version() {
- [[ $1 =~ $re_v_alpha ]]
- if [ ! -z ${BASH_REMATCH[1]} ]; then
- v_alpha=${BASH_REMATCH[1]}
- else
- v_alpha=$1
- fi
-}
-
-# $1 - a full version string
-# Returns $v_build, containing the final .build portion of a major.minor.build version number.
-# If missing, returns an empty string.
-get_build_number() {
- [[ "$1" =~ $re_v_build ]]
- if [ ! -z "${BASH_REMATCH[1]}" ]; then
- v_build="${BASH_REMATCH[1]}"
- else
- v_build=
- fi
-}
-
-# Used internally by get_version_notes, passed as a pseudo-functor to process_history_loop.
-get_version_helper() {
- local line="$1"
- local version="$2"
- local tier="$3"
- local product="$4"
- get_line_type "$line"
-
- if [ $in_block = true ]; then
- if [[ $line_type = "version-header" ]]; then
- in_block=false
- elif [[ $line_type = "listitem" ]]; then
- if [[ "$product" == "ios" ]]; then
- # We have to filter out other platforms to satisfy Apple
- if [[ "$line" =~ \(ios|web|common ]]; then
- echo "$line" | sed -e "s/Android/mobile platform/"
- fi
- else
- if [[ "$line" =~ "\($product|web|common" ]]; then
- echo "$line"
- fi
- fi
- elif [[ $line_type = "whitespace" ]]; then
- echo "";
- fi
- else
- v= # Must be cleared initially for the test to work correctly!
- t=
- d=
-
- if [[ $line_type = "version-header" ]]; then
- d="$line_date"
- v="$line_version"
- t="$line_tier"
- fi
-
- # Splits the version numbers into their components to facilitate finding
- # 1) the FIRST version in history.md
- # 2) with equal to or lesser version
- # 3) of the same tier.
- if [[ "$v" != "" && "$t" = "$tier" && $version_found = false ]]; then
- get_alpha_version "$v"
- get_build_number "$v"
-
- found_v="$v_alpha"
- found_b="$v_build"
-
- get_alpha_version "$version"
- get_build_number "$version"
-
- search_v="$v_alpha"
- search_b="$v_build"
-
- if [[ "$found_v" = "$search_v" && ( $found_b -le $search_b ) ]]; then
- in_block=true
- version_found=true
-
- if [[ -n $d ]]; then
- echo "Published on $d."
- fi
- fi
- fi
- fi
-}
-
-# $1 - the product whose version notes we wish to obtain
-# $2 - the version number to be obtained.
-# $3 - the tier of the product to be obtained (alpha, beta, stable)
-get_version_notes() {
- # State-tracking variable(s).
- in_block=false
- version_found=false
-
- local vn_product=$1
- local vn_version=$2
- local vn_tier=$3
-
- get_history_file
- process_history_loop "${history_file}" get_version_helper "$vn_version" "$vn_tier" "$vn_product"
-
- if [ $version_found = false ]; then
- builder_die "Could not find changelog information for $vn_product version $vn_version $vn_tier."
- fi
-}
-
-### End Version Changelog Extraction ###
\ No newline at end of file
diff --git a/resources/build/history/validate-all-history.sh b/resources/build/history/validate-all-history.sh
deleted file mode 100755
index 69b4b12c53..0000000000
--- a/resources/build/history/validate-all-history.sh
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/usr/bin/env bash
-
-echo "**TODO** Update script to work with new history/versioning"
-exit 1
-
-FAIL=0
-./validateHistory.sh android || FAIL=$(($FAIL + 1))
-./validateHistory.sh desktop || FAIL=$(($FAIL + 2))
-./validateHistory.sh developer || FAIL=$(($FAIL + 4))
-./validateHistory.sh ios || FAIL=$(($FAIL + 8))
-./validateHistory.sh linux || FAIL=$(($FAIL + 16))
-./validateHistory.sh mac || FAIL=$(($FAIL + 32))
-./validateHistory.sh web || FAIL=$(($FAIL + 64))
-echo Final status = $FAIL
-exit $FAIL
diff --git a/resources/build/history/validate-history.sh b/resources/build/history/validate-history.sh
deleted file mode 100755
index 8242c13d32..0000000000
--- a/resources/build/history/validate-history.sh
+++ /dev/null
@@ -1,9 +0,0 @@
-echo "**TODO** Update script to work with new history/versioning"
-exit 1
-
-_hu_base_dir=$(dirname "$BASH_SOURCE")/..
-
-. $_hu_base_dir/resources/historyUtils.sh
-
-# Insert the shorthand for a platform as the command-line argument.
-validate_history_file "$1"
\ No newline at end of file
diff --git a/resources/build/minimum-versions.inc.sh b/resources/build/minimum-versions.inc.sh
index aa6d9f4c18..27dd458233 100644
--- a/resources/build/minimum-versions.inc.sh
+++ b/resources/build/minimum-versions.inc.sh
@@ -32,6 +32,7 @@ KEYMAN_MIN_VERSION_EMSCRIPTEN=3.1.64 # Use KEYMAN_USE_EMSDK to automati
KEYMAN_MIN_VERSION_VISUAL_STUDIO=2022 # Visual Studio 2022, see /docs/build/windows.md for workloads and components
KEYMAN_MIN_VERSION_MESON=1.0.0 # TODO: rename meson_options.txt to meson.options when updating to >= 1.1, see #15127.
KEYMAN_VERSION_XCODE=26.2 # XCode 26.2 is the current supported version; download from https://developer.apple.com/download/all/
+KEYMAN_VERSION_SENTRY_CLI=1.70.0 # sentry-cli used to upload debug information to Sentry during CI
KEYMAN_VERSION_GRADLE=8.12 # See /android/KMEA/gradle/wrapper/gradle-wrapper.properties
@@ -52,4 +53,4 @@ KEYMAN_VERSION_ISO639_3=2026-08-17 # Date of last import
KEYMAN_VERSION_LANGTAGS=2026-06-09 # _version value
KEYMAN_VERSION_LANGTAGS_API=1.4 # Langtags API version supported
KEYMAN_VERSION_LANGUAGE_SUBTAG_REGISTRY=2026-08-08 # Date from first line of language-subtag-registry
-KEYMAN_VERSION_UNICODE=17.0.0 # UCD + related data
\ No newline at end of file
+KEYMAN_VERSION_UNICODE=17.0.0 # UCD + related data
diff --git a/web/docs/engine/whatsnew.md b/web/docs/engine/whatsnew.md
index ec1bed654d..0fc143f547 100644
--- a/web/docs/engine/whatsnew.md
+++ b/web/docs/engine/whatsnew.md
@@ -2,6 +2,42 @@
title: What's New in KeymanWeb 20.0
---
+* **BREAKING** `file:` protocol is no longer supported, as keyboards are loaded
+ with `fetch()` API (#12334)
+* Bug fix: the `keyboardloaded` event now fires only once per loaded keyboard.
+ Previously the event fired twice. (#16297)
+* Fixed `loaduserinterface` and `unloaduserinterface` events to fire
+ consistently (#16353)
+* Clarified use of asynchronous APIs (such as `addKeyboards()`) (#16064)
+* Cleanup of various examples (#16064)
+* Addressed several bugs with control of active keyboard (#16524)
+* Removed `keyman.FocusLastActiveElement()` (use
+ `keyman.focusLastActiveElement()`) (#16170)
+* Removed `keyman.GetLastActiveElement()` (use `keyman.getLastActiveElement()`)
+ (#16170)
+* Removed `keyman.HideHelp()` (use `keyman.osk.hide()`) (#16170)
+* Removed `keyman.ShowHelp()` (use `keyman.osk.show()`, `keyman.osk.setRect()`)
+ (#16170)
+* Removed `keyman.ShowPinnedHelp()` (use `keyman.osk.show()`,
+ `keyman.osk.setRect()`) (#16170)
+* Deprecated `keyman.build` and `keyman.version` (use `keyman.versionInfo`)
+ (#16351)
+* Deprecated `keyman.helpURL` (use Keyman Cloud APIs) (#16351)
+* Deprecated `keyman.moveToElement` (use `elem.focus()`) (#16661)
+* Deprecated `keyman.interface.FocusLastActiveElement()` (use
+ `keyman.interface.focusLastActiveTextStore()`) (#16170)
+* Deprecated `keyman.interface.GetLastActiveElement()` (use
+ `keyman.interface.getLastActiveTextStore()`) (#16170)
+* Deprecated `keyman.interface.HideHelp()` (use `keyman.osk.hide()`) (#16170)
+* Deprecated `keyman.interface.ShowHelp()` (use `keyman.osk.show()`) (#16170)
+* Deprecated `keyman.interface.ShowPinnedHelp()` (use `keyman.osk.show()`,
+ `keyman.osk.setRect()`) (#16170)
+* Deprecated `keyman.util.toFloat()` (#16351)
+* Deprecated `keyman.util.toNumber()` (#16351)
+* Deprecated `keyman.util.toNzString()` (#16351)
+* Removed deprecated `onunloaded` handler (#16351)
+* About [550 other fixes and changes](https://keyman.com/go/app/whatsnew/web/19.0)
+
## See also
* [Keyman Engine for Web Documentation](index)
diff --git a/web/src/app/browser/src/contextManager.ts b/web/src/app/browser/src/contextManager.ts
index 45898bfee2..7521bda901 100644
--- a/web/src/app/browser/src/contextManager.ts
+++ b/web/src/app/browser/src/contextManager.ts
@@ -423,7 +423,7 @@ export class ContextManager extends ContextManagerBase {
*/
public setKeyboardForTextStore(textStore: AbstractElementTextStore, kbdId?: string | null, langId?: string | null): void {
if(textStore instanceof DesignIFrameElementTextStore) {
- console.warn("'keymanweb.setKeyboardForControl' cannot set keyboard on iframes.");
+ console.warn("ContextManager.setKeyboardForTextStore cannot set keyboard on iframes.");
return;
}
diff --git a/web/src/app/browser/src/keymanEngine.ts b/web/src/app/browser/src/keymanEngine.ts
index e443d5cad8..1ceb9329c0 100644
--- a/web/src/app/browser/src/keymanEngine.ts
+++ b/web/src/app/browser/src/keymanEngine.ts
@@ -77,28 +77,28 @@ export class KeymanEngine extends KeymanEngineBase {
- const e = (textStore as AbstractElementTextStore)?.getElement();
+ const elem = (textStore as AbstractElementTextStore)?.getElement();
if(this.osk) {
- (this.osk.activationModel as TwoStateActivator).activationTrigger = e;
+ (this.osk.activationModel as TwoStateActivator).activationTrigger = elem;
}
if(this.config.hostDevice.touchable && textStore) {
- this.ensureElementVisibility(e);
+ this.ensureElementVisibility(elem);
}
});
}
- public ensureElementVisibility(e: HTMLElement): void {
- if(!e || !this.osk) {
+ public ensureElementVisibility(elem: HTMLElement): void {
+ if(!elem || !this.osk) {
return;
}
// Get the absolute position of the caret
- const y = getAbsoluteY(e);
+ const y = getAbsoluteY(elem);
const t = window.pageYOffset;
let dy = y-t;
if(y >= t) {
- dy -= (window.innerHeight - this.osk._Box.offsetHeight - e.offsetHeight - 2);
+ dy -= (window.innerHeight - this.osk._Box.offsetHeight - elem.offsetHeight - 2);
if(dy < 0) {
dy=0;
}
diff --git a/web/src/engine/predictive-text/wordbreakers/src/main/placeholder.ts b/web/src/engine/predictive-text/wordbreakers/src/main/placeholder.ts
index 2a3c880742..3b44769b3a 100644
--- a/web/src/engine/predictive-text/wordbreakers/src/main/placeholder.ts
+++ b/web/src/engine/predictive-text/wordbreakers/src/main/placeholder.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { LexicalModelTypes } from '@keymanapp/common-types';
/**
diff --git a/web/src/engine/predictive-text/worker-main/unit_tests/headless/promise-store.tests.js b/web/src/engine/predictive-text/worker-main/unit_tests/headless/promise-store.tests.js
index 8e220a5176..25a9410236 100644
--- a/web/src/engine/predictive-text/worker-main/unit_tests/headless/promise-store.tests.js
+++ b/web/src/engine/predictive-text/worker-main/unit_tests/headless/promise-store.tests.js
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
import sinon from 'sinon';
diff --git a/web/src/engine/predictive-text/worker-main/unit_tests/headless/top-level-lmlayer.tests.js b/web/src/engine/predictive-text/worker-main/unit_tests/headless/top-level-lmlayer.tests.js
index 78b071e3c4..6b2609e0dc 100644
--- a/web/src/engine/predictive-text/worker-main/unit_tests/headless/top-level-lmlayer.tests.js
+++ b/web/src/engine/predictive-text/worker-main/unit_tests/headless/top-level-lmlayer.tests.js
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
import sinon from 'sinon';
diff --git a/web/src/engine/predictive-text/worker-main/unit_tests/headless/worker-dummy-integration.tests.js b/web/src/engine/predictive-text/worker-main/unit_tests/headless/worker-dummy-integration.tests.js
index d546edb704..d34549f699 100644
--- a/web/src/engine/predictive-text/worker-main/unit_tests/headless/worker-dummy-integration.tests.js
+++ b/web/src/engine/predictive-text/worker-main/unit_tests/headless/worker-dummy-integration.tests.js
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
import fs from 'fs';
diff --git a/web/src/engine/predictive-text/worker-main/unit_tests/headless/worker-trie-integration.tests.js b/web/src/engine/predictive-text/worker-main/unit_tests/headless/worker-trie-integration.tests.js
index 70583a978e..f5844890ba 100644
--- a/web/src/engine/predictive-text/worker-main/unit_tests/headless/worker-trie-integration.tests.js
+++ b/web/src/engine/predictive-text/worker-main/unit_tests/headless/worker-trie-integration.tests.js
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
import { createRequire } from 'module';
diff --git a/web/src/engine/predictive-text/worker-main/unit_tests/in_browser/cases/top-level-lmlayer.tests.ts b/web/src/engine/predictive-text/worker-main/unit_tests/in_browser/cases/top-level-lmlayer.tests.ts
index df5cb45e3b..b9cdd23c3d 100644
--- a/web/src/engine/predictive-text/worker-main/unit_tests/in_browser/cases/top-level-lmlayer.tests.ts
+++ b/web/src/engine/predictive-text/worker-main/unit_tests/in_browser/cases/top-level-lmlayer.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
import { LMLayer, WebWorker } from "@keymanapp/lexical-model-layer/web";
diff --git a/web/src/engine/predictive-text/worker-main/unit_tests/in_browser/cases/worker-dummy-integration.tests.ts b/web/src/engine/predictive-text/worker-main/unit_tests/in_browser/cases/worker-dummy-integration.tests.ts
index 04af7ec8dc..fbd762b104 100644
--- a/web/src/engine/predictive-text/worker-main/unit_tests/in_browser/cases/worker-dummy-integration.tests.ts
+++ b/web/src/engine/predictive-text/worker-main/unit_tests/in_browser/cases/worker-dummy-integration.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
import { LMLayer, WebWorker } from "@keymanapp/lexical-model-layer/web";
diff --git a/web/src/engine/predictive-text/worker-main/unit_tests/in_browser/cases/worker-trie-integration.tests.ts b/web/src/engine/predictive-text/worker-main/unit_tests/in_browser/cases/worker-trie-integration.tests.ts
index bf8d0aef5c..58d947a2ca 100644
--- a/web/src/engine/predictive-text/worker-main/unit_tests/in_browser/cases/worker-trie-integration.tests.ts
+++ b/web/src/engine/predictive-text/worker-main/unit_tests/in_browser/cases/worker-trie-integration.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
import { LMLayer, WebWorker } from "@keymanapp/lexical-model-layer/web";
diff --git a/web/src/engine/predictive-text/worker-main/unit_tests/in_browser/helpers.mjs b/web/src/engine/predictive-text/worker-main/unit_tests/in_browser/helpers.mjs
index 385379bde6..5e26cc19aa 100644
--- a/web/src/engine/predictive-text/worker-main/unit_tests/in_browser/helpers.mjs
+++ b/web/src/engine/predictive-text/worker-main/unit_tests/in_browser/helpers.mjs
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
export let defaultCapabilities = {
maxLeftContextCodeUnits: 64
-};
\ No newline at end of file
+};
diff --git a/web/src/engine/predictive-text/worker-thread/src/main/correction/execution-timer.ts b/web/src/engine/predictive-text/worker-thread/src/main/correction/execution-timer.ts
index 1ba6f535a0..90fb90f841 100644
--- a/web/src/engine/predictive-text/worker-thread/src/main/correction/execution-timer.ts
+++ b/web/src/engine/predictive-text/worker-thread/src/main/correction/execution-timer.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { timedPromise } from "keyman/common/web-utils";
const MIN_OUTLIER = 1; // 1ms.
diff --git a/web/src/engine/predictive-text/worker-thread/src/tests/test-runner/cases/worker.tests.ts b/web/src/engine/predictive-text/worker-thread/src/tests/test-runner/cases/worker.tests.ts
index fcae30e762..899b0d361f 100644
--- a/web/src/engine/predictive-text/worker-thread/src/tests/test-runner/cases/worker.tests.ts
+++ b/web/src/engine/predictive-text/worker-thread/src/tests/test-runner/cases/worker.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
import { LMLayerWorkerCode } from "@keymanapp/lm-worker/worker-main.wrapped.js";
import { DEFAULT_BROWSER_TIMEOUT } from '@keymanapp/common-test-resources/test-timeouts.mjs';
diff --git a/web/src/engine/src/element-text-stores/nestedInstanceOf.ts b/web/src/engine/src/element-text-stores/nestedInstanceOf.ts
index 739f11a982..933c595057 100644
--- a/web/src/engine/src/element-text-stores/nestedInstanceOf.ts
+++ b/web/src/engine/src/element-text-stores/nestedInstanceOf.ts
@@ -1,38 +1,42 @@
/**
- * Checks the type of an input DOM-related object while ensuring that it is checked against the correct prototype,
- * as class prototypes are (by specification) scoped upon the owning Window.
+ * Checks the type of an input DOM-related object while ensuring that it
+ * is checked against the correct prototype, as class prototypes are (by
+ * specification) scoped upon the owning Window.
*
- * See https://stackoverflow.com/questions/43587286/why-does-instanceof-return-false-on-chrome-safari-and-edge-and-true-on-firefox
+ * See
+ * https://stackoverflow.com/questions/43587286/why-does-instanceof-return-false-on-chrome-safari-and-edge-and-true-on-firefox
* for more details.
*
- * @param {EventTarget} Pelem An element of the web page or one of its IFrame-based subdocuments.
- * @param {string} className The plain-text name of the expected Element type.
+ * @param {EventTarget} elem An element of the web page or one of
+ * its IFrame-based subdocuments.
+ * @param {string} className The plain-text name of the expected
+ * Element type.
* @return {boolean}
*/
-export function nestedInstanceOf(Pelem: EventTarget, className: string): boolean {
+export function nestedInstanceOf(elem: EventTarget, className: string): boolean {
let scopedClass;
- if(!Pelem) {
+ if(!elem) {
// If we're bothering to check something's type, null references don't match
// what we're looking for.
return false;
}
// @ts-ignore
- if (Pelem['Window']) { // Window objects contain the class definitions for types held within them. So, we can check for those.
+ if (elem['Window']) { // Window objects contain the class definitions for types held within them. So, we can check for those.
return className == 'Window';
// @ts-ignore
- } else if (Pelem['defaultView']) { // Covers Document.
+ } else if (elem['defaultView']) { // Covers Document.
// @ts-ignore
- scopedClass = (Pelem as Document)['defaultView'][className];
+ scopedClass = (elem as Document)['defaultView'][className];
// @ts-ignore
- } else if(Pelem['ownerDocument']) {
+ } else if(elem['ownerDocument']) {
// @ts-ignore
- scopedClass = (Pelem as Node).ownerDocument.defaultView[className];
+ scopedClass = (elem as Node).ownerDocument.defaultView[className];
}
if(scopedClass) {
- return Pelem instanceof scopedClass;
+ return elem instanceof scopedClass;
} else {
return false;
}
-}
\ No newline at end of file
+}
diff --git a/web/src/engine/src/interfaces/prediction/predictionContext.ts b/web/src/engine/src/interfaces/prediction/predictionContext.ts
index 6ebcec0db9..38051b7e75 100644
--- a/web/src/engine/src/interfaces/prediction/predictionContext.ts
+++ b/web/src/engine/src/interfaces/prediction/predictionContext.ts
@@ -85,13 +85,14 @@ export class PredictionContext extends EventEmitter {
this.currentTextStore && langProcessor.state == 'configured';
this.suggestionApplier = (suggestion, processorAction) => {
- if(validSuggestionState()) {
+ if (validSuggestionState()) {
const results = langProcessor.applySuggestion(suggestion, this.currentTextStore, getLayerId, processorAction);
- results.reversion.then((reversion) => this._immediateReversion = reversion);
- return results.appendedProcessorAction;
- } else {
- return null;
+ if (results) {
+ results.reversion.then((reversion) => this._immediateReversion = reversion);
+ return results.appendedProcessorAction;
+ }
}
+ return null;
}
this.suggestionReverter = async (reversion) => {
@@ -316,4 +317,4 @@ export class PredictionContext extends EventEmitter {
this.resetContext();
}
}
-}
\ No newline at end of file
+}
diff --git a/web/src/engine/src/main/headless/transcriptionCache.ts b/web/src/engine/src/main/headless/transcriptionCache.ts
index 7ff3832b9b..5fcfd00b33 100644
--- a/web/src/engine/src/main/headless/transcriptionCache.ts
+++ b/web/src/engine/src/main/headless/transcriptionCache.ts
@@ -22,7 +22,7 @@ export class TranscriptionCache extends RewindableCache {
});
return entries
- .map(({key, entry}) => `Context state ${key}'s keystroke:\n${entry.keystroke.inputBreadcrumb ?? ''}`)
+ .map(({key, entry}) => `Context state ${key}'s keystroke:\n${entry?.keystroke?.inputBreadcrumb ?? ''}`)
.join('\n');
}
-}
\ No newline at end of file
+}
diff --git a/web/src/engine/src/osk/banner/suggestionBanner.ts b/web/src/engine/src/osk/banner/suggestionBanner.ts
index 843c0dd912..bab946769d 100644
--- a/web/src/engine/src/osk/banner/suggestionBanner.ts
+++ b/web/src/engine/src/osk/banner/suggestionBanner.ts
@@ -577,8 +577,10 @@ export class SuggestionBanner extends Banner {
return;
}
- const autoselection = this._predictionContext.selected;
- this._predictionContext.selected = null;
+ const autoselection = this.predictionContext?.selected;
+ if (this.predictionContext) {
+ this.predictionContext.selected = null;
+ }
// Always clear pre-existing selections when a new banner input/gesture starts.
this.options.forEach((entry) => {
entry.highlight(false);
@@ -628,9 +630,13 @@ export class SuggestionBanner extends Banner {
return;
}
+ if (!this.predictionContext) {
+ return;
+ }
+
// The suggestions are still current? Then restore the original
// auto-correct suggestion and its highlighting.
- this._predictionContext.selected = autoselection;
+ this.predictionContext.selected = autoselection;
if(autoselection) {
for(const entry of this.options) {
if(entry.suggestion == autoselection) {
@@ -668,11 +674,11 @@ export class SuggestionBanner extends Banner {
// Invalidate the suggestions internally, but don't visually update;
// this will avoid banner-flicker.
this.currentSuggestions = [];
- this.predictionContext.accept(suggestion.suggestion);
+ this.predictionContext?.accept(suggestion.suggestion);
// Trigger new predictions, as no input exists to trigger new ones otherwise.
// Reversions will re-use old suggestions, though.
if(suggestion.suggestion.tag != 'revert') {
- this.predictionContext.triggerPredictions();
+ this.predictionContext?.triggerPredictions();
}
// Reset the scroll state
diff --git a/web/src/engine/src/osk/views/floatingOskView.ts b/web/src/engine/src/osk/views/floatingOskView.ts
index 136c424896..4974799ad4 100644
--- a/web/src/engine/src/osk/views/floatingOskView.ts
+++ b/web/src/engine/src/osk/views/floatingOskView.ts
@@ -183,23 +183,22 @@ export class FloatingOSKView extends OSKView {
}.bind(this);
/**
- * Function enabled
- * Scope Public
- * @return {boolean|number} True if KMW OSK enabled
- * Description Test if KMW OSK is enabled
+ * Test if KMW OSK is enabled
+ *
+ * @return {boolean} True if KMW OSK enabled
*/
- ['isEnabled'](): boolean {
+ public isEnabled(): boolean {
return this.displayIfActive;
}
/**
- * Function isVisible
- * Scope Public
- * @return {boolean|number} True if KMW OSK visible
- * Description Test if KMW OSK is actually visible
- * Note that this will usually return false after any UI event that results in (temporary) loss of input focus
+ * Test if KMW OSK is actually visible
+ * Note that this will usually return false after any UI event that results in
+ * (temporary) loss of input focus.
+ *
+ * @return {boolean} True if KMW OSK visible
*/
- ['isVisible'](): boolean {
+ public isVisible(): boolean {
return this._Visible;
}
@@ -504,30 +503,30 @@ export class FloatingOSKView extends OSKView {
}
public setDisplayPositioning() {
- const Ls = this._Box.style;
+ const {style} = this._Box;
- Ls.position='absolute';
+ style.position='absolute';
// Keep it hidden if not currently displayed.
if(this.activationModel.activate) {
- Ls.display='block'; //Ls.visibility='visible';
+ style.display='block'; //Ls.visibility='visible';
}
- Ls.left='0px';
+ style.left='0px';
if(this.specifiedPosition || this.userPositioned) {
- Ls.left = this.x+'px';
- Ls.top = this.y+'px';
+ style.left = this.x+'px';
+ style.top = this.y+'px';
} else {
const el: HTMLElement = this.typedActivationModel.activationTrigger || null;
if(this.dfltX) {
- Ls.left=this.dfltX;
+ style.left=this.dfltX;
} else if(typeof el != 'undefined' && el != null) {
- Ls.left=getAbsoluteX(el) + 'px';
+ style.left=getAbsoluteX(el) + 'px';
}
if(this.dfltY) {
- Ls.top=this.dfltY;
+ style.top=this.dfltY;
} else if(typeof el != 'undefined' && el != null) {
- Ls.top=(getAbsoluteY(el) + el.offsetHeight)+'px';
+ style.top=(getAbsoluteY(el) + el.offsetHeight)+'px';
}
}
@@ -584,24 +583,22 @@ export class FloatingOSKView extends OSKView {
}
}
- ['show'](bShow?: boolean) {
+ public show(bShow?: boolean) {
if(bShow !== undefined) {
- super['show'](bShow);
+ super.show(bShow);
} else {
- super['show']();
+ super.show();
}
this.savePersistedLayout();
}
/**
- * Function userPositioned
- * Scope Public
- * @return {(boolean|number)} true if user located
- * Description Test if OSK window has been repositioned by user
- *
+ * Test if OSK window has been repositioned by user
* See https://help.keyman.com/developer/engine/web/current-version/reference/osk/userLocated
+ *
+ * @return {boolean} true if user located
*/
- public userLocated() {
+ public userLocated(): boolean {
return this.userPositioned;
}
diff --git a/web/src/engine/src/osk/views/oskView.ts b/web/src/engine/src/osk/views/oskView.ts
index b4bd3855dc..eda7fabbdf 100644
--- a/web/src/engine/src/osk/views/oskView.ts
+++ b/web/src/engine/src/osk/views/oskView.ts
@@ -1280,12 +1280,11 @@ export abstract class OSKView
* @return {boolean}
*
*/
- doShow(p: {
+ protected doShow(p: {
x: number,
y: number,
userLocated: boolean
}) {
- // Newer style 'doShow' emitted from .present by default.
this.legacyEvents.callEvent('show', p);
}
@@ -1296,7 +1295,7 @@ export abstract class OSKView
* @return {void}
*
*/
- doHide(hiddenByUser: boolean) {
+ protected doHide(hiddenByUser: boolean) {
const p={
HiddenByUser: hiddenByUser
};
diff --git a/web/src/test/auto/dom/cases/attachment/pageContextAttachment.tests.ts b/web/src/test/auto/dom/cases/attachment/pageContextAttachment.tests.ts
index 9ea5e97bb9..b1166dc81d 100644
--- a/web/src/test/auto/dom/cases/attachment/pageContextAttachment.tests.ts
+++ b/web/src/test/auto/dom/cases/attachment/pageContextAttachment.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { PageContextAttachment } from 'keyman/engine/attachment';
import { DeviceSpec, timedPromise } from 'keyman/common/web-utils';
import { DEFAULT_BROWSER_TIMEOUT } from '@keymanapp/common-test-resources/test-timeouts.mjs';
@@ -867,4 +870,4 @@ describe('KMW element-attachment logic', function () {
attacher.shutdown();
});
})
-});
\ No newline at end of file
+});
diff --git a/web/src/test/auto/dom/cases/browser/contextManager.tests.ts b/web/src/test/auto/dom/cases/browser/contextManager.tests.ts
index a86e0a20f7..ccaeb98a67 100644
--- a/web/src/test/auto/dom/cases/browser/contextManager.tests.ts
+++ b/web/src/test/auto/dom/cases/browser/contextManager.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { ContextManager } from 'keyman/app/browser';
import { textStoreForElement } from 'keyman/engine/attachment';
import { TextAreaElementTextStore } from 'keyman/engine/element-text-stores';
diff --git a/web/src/test/auto/dom/cases/dom-utils/cookieSerializer.tests.ts b/web/src/test/auto/dom/cases/dom-utils/cookieSerializer.tests.ts
index 1e270480ba..ceba63585b 100644
--- a/web/src/test/auto/dom/cases/dom-utils/cookieSerializer.tests.ts
+++ b/web/src/test/auto/dom/cases/dom-utils/cookieSerializer.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { CookieSerializer } from 'keyman/engine/dom-utils';
import { assert } from 'chai';
@@ -137,4 +140,4 @@ describe('CookieSerializer', function () {
assert.sameDeepMembers(result, []);
});
});
-});
\ No newline at end of file
+});
diff --git a/web/src/test/auto/dom/cases/element-text-stores/element_interfaces.tests.ts b/web/src/test/auto/dom/cases/element-text-stores/element_interfaces.tests.ts
index 413923b5e6..091d6246bd 100644
--- a/web/src/test/auto/dom/cases/element-text-stores/element_interfaces.tests.ts
+++ b/web/src/test/auto/dom/cases/element-text-stores/element_interfaces.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
import { KMWString } from 'keyman/common/web-utils';
@@ -1412,4 +1415,4 @@ describe('Element InputElementTextStore/Output Interfacing', function () {
});
});
});
-});
\ No newline at end of file
+});
diff --git a/web/src/test/auto/dom/cases/element-text-stores/syntheticTextStore.tests.ts b/web/src/test/auto/dom/cases/element-text-stores/syntheticTextStore.tests.ts
index 5419a32218..f49964afed 100644
--- a/web/src/test/auto/dom/cases/element-text-stores/syntheticTextStore.tests.ts
+++ b/web/src/test/auto/dom/cases/element-text-stores/syntheticTextStore.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
import { KMWString } from 'keyman/common/web-utils';
@@ -148,4 +151,4 @@ describe('SyntheticTextStore', function() {
});
});
});
-});
\ No newline at end of file
+});
diff --git a/web/src/test/auto/dom/cases/gesture-processor/canary.tests.ts b/web/src/test/auto/dom/cases/gesture-processor/canary.tests.ts
index 7c3fde9b85..87acebddbc 100644
--- a/web/src/test/auto/dom/cases/gesture-processor/canary.tests.ts
+++ b/web/src/test/auto/dom/cases/gesture-processor/canary.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
import sinon from 'sinon';
@@ -126,4 +129,4 @@ describe("'Canary' checks", function() {
assert.isTrue(fakeHandler.called, "Unit test attempt failed: handler was not called successfully.");
});
});
-});
\ No newline at end of file
+});
diff --git a/web/src/test/auto/dom/cases/gesture-processor/ignoredInputs.tests.ts b/web/src/test/auto/dom/cases/gesture-processor/ignoredInputs.tests.ts
index a288f925a3..bd8d504856 100644
--- a/web/src/test/auto/dom/cases/gesture-processor/ignoredInputs.tests.ts
+++ b/web/src/test/auto/dom/cases/gesture-processor/ignoredInputs.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
import sinon from 'sinon';
@@ -96,4 +99,4 @@ describe("Layer one - DOM -> InputSequence", function() {
assert.equal(recorder.count, 0, "Input starting outside the main receiver element's hierarchy was not ignored!");
});
});
-});
\ No newline at end of file
+});
diff --git a/web/src/test/auto/dom/cases/gesture-processor/recordedCoordSequences.tests.ts b/web/src/test/auto/dom/cases/gesture-processor/recordedCoordSequences.tests.ts
index 61da5cd09c..5734c68e40 100644
--- a/web/src/test/auto/dom/cases/gesture-processor/recordedCoordSequences.tests.ts
+++ b/web/src/test/auto/dom/cases/gesture-processor/recordedCoordSequences.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert, expect } from 'chai';
import sinon from 'sinon';
@@ -156,4 +159,4 @@ describe("Layer one - DOM -> InputSequence", function() {
});
}
});
-});
\ No newline at end of file
+});
diff --git a/web/src/test/auto/dom/cases/keyboard-storage/cloudQueries.tests.ts b/web/src/test/auto/dom/cases/keyboard-storage/cloudQueries.tests.ts
index 7174d6e482..bc71c097b5 100644
--- a/web/src/test/auto/dom/cases/keyboard-storage/cloudQueries.tests.ts
+++ b/web/src/test/auto/dom/cases/keyboard-storage/cloudQueries.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
import sinon from 'sinon';
@@ -171,4 +174,4 @@ describe("Cloud-query interface", () => {
assert.isTrue(stubs[0].KF.includes('s.keyman.com')); // The keyboardsURI property from the cloud options should be applied.
});
});
-});
\ No newline at end of file
+});
diff --git a/web/src/test/auto/dom/cases/keyboard-storage/domCloudRequester.tests.ts b/web/src/test/auto/dom/cases/keyboard-storage/domCloudRequester.tests.ts
index 7165aedbc0..e653c23399 100644
--- a/web/src/test/auto/dom/cases/keyboard-storage/domCloudRequester.tests.ts
+++ b/web/src/test/auto/dom/cases/keyboard-storage/domCloudRequester.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
import sinon from 'sinon';
@@ -96,4 +99,4 @@ describe("Mocked cloud query results ('canary' testing)", () => {
assert.isOk(keyboard.languages.find((language: any) => language.id == 'dz'));
}
});
-});
\ No newline at end of file
+});
diff --git a/web/src/test/auto/dom/cases/keyboard-storage/keyboardRequisitioner.tests.ts b/web/src/test/auto/dom/cases/keyboard-storage/keyboardRequisitioner.tests.ts
index 5ac6f496e1..567f73f200 100644
--- a/web/src/test/auto/dom/cases/keyboard-storage/keyboardRequisitioner.tests.ts
+++ b/web/src/test/auto/dom/cases/keyboard-storage/keyboardRequisitioner.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
import sinon from 'sinon';
@@ -108,4 +111,4 @@ describe("KeyboardRequisitioner", function () {
assert.strictEqual(cache.getKeyboardForStub(stub), khmer_angkor);
assert.isOk(khmer_angkor);
});
-});
\ No newline at end of file
+});
diff --git a/web/src/test/auto/dom/cases/keyboard/domKeyboardLoader.tests.ts b/web/src/test/auto/dom/cases/keyboard/domKeyboardLoader.tests.ts
index e9ea8fe8c0..0c6be385ae 100644
--- a/web/src/test/auto/dom/cases/keyboard/domKeyboardLoader.tests.ts
+++ b/web/src/test/auto/dom/cases/keyboard/domKeyboardLoader.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
import { DOMKeyboardLoader } from 'keyman/engine/keyboard';
diff --git a/web/src/test/auto/dom/cases/osk/activation.tests.ts b/web/src/test/auto/dom/cases/osk/activation.tests.ts
index c567e14315..5af3a5b9b1 100644
--- a/web/src/test/auto/dom/cases/osk/activation.tests.ts
+++ b/web/src/test/auto/dom/cases/osk/activation.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import * as KeymanOSK from 'keyman/engine/osk';
import { DeviceDetector } from 'keyman/engine/main';
@@ -131,4 +134,4 @@ describe('OSK activation', function () {
assert.equal(container.offsetWidth, 600);
assert.equal(container.offsetHeight, 400);
});
-});
\ No newline at end of file
+});
diff --git a/web/src/test/auto/dom/cases/osk/events.tests.ts b/web/src/test/auto/dom/cases/osk/events.tests.ts
index d25c893596..7296efadb7 100644
--- a/web/src/test/auto/dom/cases/osk/events.tests.ts
+++ b/web/src/test/auto/dom/cases/osk/events.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import * as KeymanOSK from 'keyman/engine/osk';
import { DeviceDetector } from 'keyman/engine/main';
@@ -82,4 +85,4 @@ describe('OSK events', function () {
osk.activationModel.enabled = true;
assert.isTrue(legacyShowStub.calledOnce);
});
-});
\ No newline at end of file
+});
diff --git a/web/src/test/auto/dom/init_check.tests.ts b/web/src/test/auto/dom/init_check.tests.ts
index 46ad413673..569c2baa9d 100644
--- a/web/src/test/auto/dom/init_check.tests.ts
+++ b/web/src/test/auto/dom/init_check.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
// A simple "does device detection work properly" unit test.
// We'll let things break after this reports, since this will likely signal a LOT of other failures.
import { assert } from 'chai';
@@ -26,4 +29,4 @@ describe('Test Initialization', function() {
assert.fail(err);
}
});
-});
\ No newline at end of file
+});
diff --git a/web/src/test/auto/dom/kbdLoader.ts b/web/src/test/auto/dom/kbdLoader.ts
index 3c1dd21eef..4f3dbd6296 100644
--- a/web/src/test/auto/dom/kbdLoader.ts
+++ b/web/src/test/auto/dom/kbdLoader.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import {
DOMKeyboardLoader,
JSKeyboard,
@@ -59,4 +62,4 @@ export function loadKeyboardsFromStubs(apiStubs: any, baseDir: string) {
}
return priorPromise.then(() => keyboards);
-}
\ No newline at end of file
+}
diff --git a/web/src/test/auto/dom/test_utils.ts b/web/src/test/auto/dom/test_utils.ts
index c015988707..757ddb989c 100644
--- a/web/src/test/auto/dom/test_utils.ts
+++ b/web/src/test/auto/dom/test_utils.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
// Defines an object for dynamically adding elements for testing purposes.
// Designed for use with the robustAttachment.html fixture.
diff --git a/web/src/test/auto/headless/app/browser/hardware-event-processing.tests.ts b/web/src/test/auto/headless/app/browser/hardware-event-processing.tests.ts
index 6593b4e115..02614baaf4 100644
--- a/web/src/test/auto/headless/app/browser/hardware-event-processing.tests.ts
+++ b/web/src/test/auto/headless/app/browser/hardware-event-processing.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
import { unitTestEndPoints } from 'keyman/app/browser';
@@ -593,4 +596,4 @@ describe("app/browser: hardware event processing", () => {
});
});
});
-});
\ No newline at end of file
+});
diff --git a/web/src/test/auto/headless/engine/attachment/pageContextAttachment.tests.ts b/web/src/test/auto/headless/engine/attachment/pageContextAttachment.tests.ts
index 9b873d38a1..95ebaeffea 100644
--- a/web/src/test/auto/headless/engine/attachment/pageContextAttachment.tests.ts
+++ b/web/src/test/auto/headless/engine/attachment/pageContextAttachment.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
// @ts-ignore // Type info unavailable; doing a npm-install for it breaks things much worse in other ways.
import { JSDOM } from 'jsdom';
diff --git a/web/src/test/auto/headless/engine/events/emitterListenerSpy.tests.js b/web/src/test/auto/headless/engine/events/emitterListenerSpy.tests.js
index 49fe322129..e050d23011 100644
--- a/web/src/test/auto/headless/engine/events/emitterListenerSpy.tests.js
+++ b/web/src/test/auto/headless/engine/events/emitterListenerSpy.tests.js
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
import sinon from 'sinon';
@@ -47,4 +50,4 @@ describe("EmitterListenerSpy", () => {
assert.isTrue(fakeRemoveListener.calledOnce);
assert.equal(fakeRemoveListener.firstCall.args[0], 'event');
});
-});
\ No newline at end of file
+});
diff --git a/web/src/test/auto/headless/engine/events/legacyEventEmitter.tests.js b/web/src/test/auto/headless/engine/events/legacyEventEmitter.tests.js
index 103443fbbc..37142e9745 100644
--- a/web/src/test/auto/headless/engine/events/legacyEventEmitter.tests.js
+++ b/web/src/test/auto/headless/engine/events/legacyEventEmitter.tests.js
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
import sinon from 'sinon';
@@ -29,4 +32,4 @@ describe("LegacyEventEmitter", () => {
* - Adherence to the callEvent return-type spec
* - Listener returns false => no further listeners get called.
*/
-});
\ No newline at end of file
+});
diff --git a/web/src/test/auto/headless/engine/interfaces/pathConfiguration.tests.ts b/web/src/test/auto/headless/engine/interfaces/pathConfiguration.tests.ts
index 3421a4679e..924ddfa1e6 100644
--- a/web/src/test/auto/headless/engine/interfaces/pathConfiguration.tests.ts
+++ b/web/src/test/auto/headless/engine/interfaces/pathConfiguration.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
import { PathOptionDefaults, PathConfiguration } from 'keyman/engine/interfaces';
@@ -67,4 +70,4 @@ describe("Path Configuration", () => {
assert.equal(paths.keyboards, '');
assert.equal(paths.fonts, '');
});
-});
\ No newline at end of file
+});
diff --git a/web/src/test/auto/headless/engine/interfaces/prediction/predictionContext.tests.ts b/web/src/test/auto/headless/engine/interfaces/prediction/predictionContext.tests.ts
index 15faf2189f..46108b01f0 100644
--- a/web/src/test/auto/headless/engine/interfaces/prediction/predictionContext.tests.ts
+++ b/web/src/test/auto/headless/engine/interfaces/prediction/predictionContext.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
import sinon from 'sinon';
diff --git a/web/src/test/auto/headless/engine/js-processor/basic-init.tests.js b/web/src/test/auto/headless/engine/js-processor/basic-init.tests.js
index 29d6fb02de..8f677d8a4b 100644
--- a/web/src/test/auto/headless/engine/js-processor/basic-init.tests.js
+++ b/web/src/test/auto/headless/engine/js-processor/basic-init.tests.js
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
import { createRequire } from 'module';
diff --git a/web/src/test/auto/headless/engine/js-processor/bundled-module.tests.js b/web/src/test/auto/headless/engine/js-processor/bundled-module.tests.js
index 40b78362ed..33884814dd 100644
--- a/web/src/test/auto/headless/engine/js-processor/bundled-module.tests.js
+++ b/web/src/test/auto/headless/engine/js-processor/bundled-module.tests.js
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from "chai";
import { DEFAULT_PROCESSOR_INIT_OPTIONS } from 'keyman/test/resources';
import { JSKeyboardProcessor } from "keyman/engine/js-processor";
diff --git a/web/src/test/auto/headless/engine/js-processor/engine/context.tests.js b/web/src/test/auto/headless/engine/js-processor/engine/context.tests.js
index 668b1b8962..8a7fcd2a29 100644
--- a/web/src/test/auto/headless/engine/js-processor/engine/context.tests.js
+++ b/web/src/test/auto/headless/engine/js-processor/engine/context.tests.js
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
import { createRequire } from 'module';
@@ -1233,4 +1236,4 @@ describe('Engine - Context Matching', function() {
runEngineRuleSet([NOTANY_NUL_TEST_3]);
});
});
-});
\ No newline at end of file
+});
diff --git a/web/src/test/auto/headless/engine/js-processor/engine/notany_context.tests.js b/web/src/test/auto/headless/engine/js-processor/engine/notany_context.tests.js
index b7a1d3cfd0..189cb61189 100644
--- a/web/src/test/auto/headless/engine/js-processor/engine/notany_context.tests.js
+++ b/web/src/test/auto/headless/engine/js-processor/engine/notany_context.tests.js
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
import { createRequire } from 'module';
@@ -103,4 +106,4 @@ describe('Engine - notany() and context()', function() {
it('verify notany comparison flip correction from #3817', function() {
runStringRuleSet('YZ', 'pass!');
});
-});
\ No newline at end of file
+});
diff --git a/web/src/test/auto/headless/engine/js-processor/engine/stores.tests.js b/web/src/test/auto/headless/engine/js-processor/engine/stores.tests.js
index eeb976a096..2aa8825649 100644
--- a/web/src/test/auto/headless/engine/js-processor/engine/stores.tests.js
+++ b/web/src/test/auto/headless/engine/js-processor/engine/stores.tests.js
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
import { KMWString } from 'keyman/common/web-utils';
@@ -49,4 +52,4 @@ describe('Engine - Stores', function() {
});
// TODO: Migrate a Node-based copy of the variable store tests here as well.
-});
\ No newline at end of file
+});
diff --git a/web/src/test/auto/headless/engine/js-processor/kbdInterface.tests.ts b/web/src/test/auto/headless/engine/js-processor/kbdInterface.tests.ts
index 32dbbc188c..0cfa199a9c 100644
--- a/web/src/test/auto/headless/engine/js-processor/kbdInterface.tests.ts
+++ b/web/src/test/auto/headless/engine/js-processor/kbdInterface.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
import { createRequire } from 'module';
diff --git a/web/src/test/auto/headless/engine/js-processor/non-positional-rules.tests.js b/web/src/test/auto/headless/engine/js-processor/non-positional-rules.tests.js
index 4f261cd867..ca9dcdc5e0 100644
--- a/web/src/test/auto/headless/engine/js-processor/non-positional-rules.tests.js
+++ b/web/src/test/auto/headless/engine/js-processor/non-positional-rules.tests.js
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
import { ModifierKeyConstants } from '@keymanapp/common-types';
diff --git a/web/src/test/auto/headless/engine/js-processor/specialized-backspace.tests.ts b/web/src/test/auto/headless/engine/js-processor/specialized-backspace.tests.ts
index 9a14c23b53..353ee351ac 100644
--- a/web/src/test/auto/headless/engine/js-processor/specialized-backspace.tests.ts
+++ b/web/src/test/auto/headless/engine/js-processor/specialized-backspace.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
import { createRequire } from 'module';
diff --git a/web/src/test/auto/headless/engine/js-processor/transcriptions.tests.js b/web/src/test/auto/headless/engine/js-processor/transcriptions.tests.js
index ab1403f2fa..c52dee280b 100644
--- a/web/src/test/auto/headless/engine/js-processor/transcriptions.tests.js
+++ b/web/src/test/auto/headless/engine/js-processor/transcriptions.tests.js
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
import { SyntheticTextStore, findCommonSubstringEndIndex } from 'keyman/engine/keyboard';
@@ -509,4 +512,4 @@ but not himself.`; // Sheev Palpatine, in the Star Wars prequels.
});
});
*/
-});
\ No newline at end of file
+});
diff --git a/web/src/test/auto/headless/engine/keyboard-storage/stubAndKeyboardCache.tests.js b/web/src/test/auto/headless/engine/keyboard-storage/stubAndKeyboardCache.tests.js
index 082d40c247..6b3e25b0b4 100644
--- a/web/src/test/auto/headless/engine/keyboard-storage/stubAndKeyboardCache.tests.js
+++ b/web/src/test/auto/headless/engine/keyboard-storage/stubAndKeyboardCache.tests.js
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
import sinon from 'sinon';
import fs from 'fs';
@@ -172,4 +175,4 @@ describe('StubAndKeyboardCache', function () {
assert.isTrue(err.message.includes('bad_stub'));
};
});
-});
\ No newline at end of file
+});
diff --git a/web/src/test/auto/headless/engine/keyboard/jskeyboard.tests.ts b/web/src/test/auto/headless/engine/keyboard/jskeyboard.tests.ts
index dcf2de6b85..4f27b86839 100644
--- a/web/src/test/auto/headless/engine/keyboard/jskeyboard.tests.ts
+++ b/web/src/test/auto/headless/engine/keyboard/jskeyboard.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
import { createRequire } from 'module';
diff --git a/web/src/test/auto/headless/engine/keyboard/keyboard-loading.tests.js b/web/src/test/auto/headless/engine/keyboard/keyboard-loading.tests.js
index b426539227..0b556d9bdd 100644
--- a/web/src/test/auto/headless/engine/keyboard/keyboard-loading.tests.js
+++ b/web/src/test/auto/headless/engine/keyboard/keyboard-loading.tests.js
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
import { createRequire } from 'module';
diff --git a/web/src/test/auto/headless/engine/keyboard/keyboard-properties.tests.js b/web/src/test/auto/headless/engine/keyboard/keyboard-properties.tests.js
index f23d56e3b5..b15a1e1cf0 100644
--- a/web/src/test/auto/headless/engine/keyboard/keyboard-properties.tests.js
+++ b/web/src/test/auto/headless/engine/keyboard/keyboard-properties.tests.js
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
import fs from 'fs';
import path from 'path';
@@ -95,4 +98,4 @@ describe('Keyboard Properties', function() {
propObject.displayName = customDisplayName;
assert.equal(propObject.displayName, customDisplayName);
});
-});
\ No newline at end of file
+});
diff --git a/web/src/test/auto/headless/engine/keyboard/keyboardLoaderBase.tests.ts b/web/src/test/auto/headless/engine/keyboard/keyboardLoaderBase.tests.ts
index 94b9400a80..3b3ce34026 100644
--- a/web/src/test/auto/headless/engine/keyboard/keyboardLoaderBase.tests.ts
+++ b/web/src/test/auto/headless/engine/keyboard/keyboardLoaderBase.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
import { createRequire } from 'module';
diff --git a/web/src/test/auto/headless/engine/keyboard/syntheticTextStore.tests.js b/web/src/test/auto/headless/engine/keyboard/syntheticTextStore.tests.js
index 8ecc3c4c37..66f1214c38 100644
--- a/web/src/test/auto/headless/engine/keyboard/syntheticTextStore.tests.js
+++ b/web/src/test/auto/headless/engine/keyboard/syntheticTextStore.tests.js
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
import { SyntheticTextStore } from 'keyman/engine/keyboard';
@@ -89,4 +92,4 @@ describe('SyntheticTextStoreTests', function() {
assert.deepEqual(postClear, editTextStore);
});
});
-});
\ No newline at end of file
+});
diff --git a/web/src/test/auto/headless/engine/main/inputProcessor.tests.ts b/web/src/test/auto/headless/engine/main/inputProcessor.tests.ts
index d76b774d61..732bda7fbb 100644
--- a/web/src/test/auto/headless/engine/main/inputProcessor.tests.ts
+++ b/web/src/test/auto/headless/engine/main/inputProcessor.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { env } from 'node:process';
import fs from 'node:fs';
import { createRequire } from 'node:module';
diff --git a/web/src/test/auto/headless/engine/osk/activation.tests.ts b/web/src/test/auto/headless/engine/osk/activation.tests.ts
index 0b74d0bd92..779a114cf8 100644
--- a/web/src/test/auto/headless/engine/osk/activation.tests.ts
+++ b/web/src/test/auto/headless/engine/osk/activation.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
import sinon from 'sinon';
@@ -230,4 +233,4 @@ describe("Activators", () => {
assert.deepStrictEqual(stub.firstCall.args[0], object);
});
});
-});
\ No newline at end of file
+});
diff --git a/web/src/test/auto/headless/engine/osk/gesture-processor/asyncClosureDispatchQueue.tests.ts b/web/src/test/auto/headless/engine/osk/gesture-processor/asyncClosureDispatchQueue.tests.ts
index 469642451f..1c09e1a09b 100644
--- a/web/src/test/auto/headless/engine/osk/gesture-processor/asyncClosureDispatchQueue.tests.ts
+++ b/web/src/test/auto/headless/engine/osk/gesture-processor/asyncClosureDispatchQueue.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai'
import { default as sinon, type SinonSpy } from 'sinon';
import { AsyncClosureDispatchQueue, type QueueClosure } from 'keyman/engine/gesture-processor';
@@ -233,4 +236,4 @@ describe('AsyncClosureDispatchQueue', () => {
fakeTimers.restore();
}
});
-});
\ No newline at end of file
+});
diff --git a/web/src/test/auto/headless/engine/osk/gesture-processor/gesturePath.tests.ts b/web/src/test/auto/headless/engine/osk/gesture-processor/gesturePath.tests.ts
index 9df87a7b68..0e1455ed7e 100644
--- a/web/src/test/auto/headless/engine/osk/gesture-processor/gesturePath.tests.ts
+++ b/web/src/test/auto/headless/engine/osk/gesture-processor/gesturePath.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai'
import sinon from 'sinon';
import path from 'path';
@@ -289,4 +292,4 @@ describe("GesturePath", function() {
this.fakeClock.restore();
})
});
-});
\ No newline at end of file
+});
diff --git a/web/src/test/auto/headless/engine/osk/gesture-processor/gestureSource.tests.ts b/web/src/test/auto/headless/engine/osk/gesture-processor/gestureSource.tests.ts
index 689c806bbb..1914f73dd8 100644
--- a/web/src/test/auto/headless/engine/osk/gesture-processor/gestureSource.tests.ts
+++ b/web/src/test/auto/headless/engine/osk/gesture-processor/gestureSource.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai'
import { GestureDebugSource, InputSample } from 'keyman/engine/gesture-processor';
@@ -217,4 +220,4 @@ describe("GestureSource", function() {
source.popRecognizerConfig();
});
});
-});
\ No newline at end of file
+});
diff --git a/web/src/test/auto/headless/engine/osk/gesture-processor/gestures/gestureMatcher.tests.ts b/web/src/test/auto/headless/engine/osk/gesture-processor/gestures/gestureMatcher.tests.ts
index 52f1dea656..5b9444cb78 100644
--- a/web/src/test/auto/headless/engine/osk/gesture-processor/gestures/gestureMatcher.tests.ts
+++ b/web/src/test/auto/headless/engine/osk/gesture-processor/gestures/gestureMatcher.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai'
import sinon from 'sinon';
import * as PromiseStatusModule from 'promise-status-async';
@@ -908,4 +911,4 @@ describe("GestureMatcher", function() {
assert.isTrue(sources[0].path.isComplete);
});
});
-});
\ No newline at end of file
+});
diff --git a/web/src/test/auto/headless/engine/osk/gesture-processor/gestures/gestureModelDefs.tests.ts b/web/src/test/auto/headless/engine/osk/gesture-processor/gestures/gestureModelDefs.tests.ts
index 05b38aa857..172597ac34 100644
--- a/web/src/test/auto/headless/engine/osk/gesture-processor/gestures/gestureModelDefs.tests.ts
+++ b/web/src/test/auto/headless/engine/osk/gesture-processor/gestures/gestureModelDefs.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
import { GestureModelDefs, gestures } from 'keyman/engine/gesture-processor';
@@ -44,4 +47,4 @@ describe("Gesture model definitions", () => {
assert.throws(() => getGestureModelSet(TestGestureModelDefinitions, 'malformed'));
assert.throws(() => getGestureModelSet(TestGestureModelDefinitions, 'unavailable-set'));
});
-});
\ No newline at end of file
+});
diff --git a/web/src/test/auto/headless/engine/osk/gesture-processor/gestures/gestureSequence.tests.ts b/web/src/test/auto/headless/engine/osk/gesture-processor/gestures/gestureSequence.tests.ts
index 94b5f597f7..06b15db3c5 100644
--- a/web/src/test/auto/headless/engine/osk/gesture-processor/gestures/gestureSequence.tests.ts
+++ b/web/src/test/auto/headless/engine/osk/gesture-processor/gestures/gestureSequence.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai'
import sinon from 'sinon';
import * as PromiseStatusModule from 'promise-status-async';
@@ -586,4 +589,4 @@ describe("GestureSequence", function() {
await sequenceEmulationAndAssertion(emulationEngine, completionPromise, [sequenceAssertion]);
});
-});
\ No newline at end of file
+});
diff --git a/web/src/test/auto/headless/engine/osk/gesture-processor/gestures/matcherSelector.tests.ts b/web/src/test/auto/headless/engine/osk/gesture-processor/gestures/matcherSelector.tests.ts
index d727cf5923..8833e6e2fb 100644
--- a/web/src/test/auto/headless/engine/osk/gesture-processor/gestures/matcherSelector.tests.ts
+++ b/web/src/test/auto/headless/engine/osk/gesture-processor/gestures/matcherSelector.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai'
import sinon from 'sinon';
@@ -749,4 +752,4 @@ describe("MatcherSelector", function () {
});
});
});
-});
\ No newline at end of file
+});
diff --git a/web/src/test/auto/headless/engine/osk/gesture-processor/gestures/pathMatcher.tests.ts b/web/src/test/auto/headless/engine/osk/gesture-processor/gestures/pathMatcher.tests.ts
index 64702cca86..268c6da1ae 100644
--- a/web/src/test/auto/headless/engine/osk/gesture-processor/gestures/pathMatcher.tests.ts
+++ b/web/src/test/auto/headless/engine/osk/gesture-processor/gestures/pathMatcher.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai'
import sinon from 'sinon';
import * as PromiseStatusModule from 'promise-status-async';
@@ -746,4 +749,4 @@ describe("PathMatcher", function() {
assert.deepEqual(await modelMatcher.promise, {type: 'reject', cause: 'item'});
});
});
-});
\ No newline at end of file
+});
diff --git a/web/src/test/auto/headless/engine/osk/gesture-processor/gestures/touchpointCoordinator.tests.ts b/web/src/test/auto/headless/engine/osk/gesture-processor/gestures/touchpointCoordinator.tests.ts
index 812a0e5651..aeafba26bc 100644
--- a/web/src/test/auto/headless/engine/osk/gesture-processor/gestures/touchpointCoordinator.tests.ts
+++ b/web/src/test/auto/headless/engine/osk/gesture-processor/gestures/touchpointCoordinator.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai'
import sinon from 'sinon';
import * as PromiseStatusModule from 'promise-status-async';
@@ -1749,4 +1752,4 @@ describe("TouchpointCoordinator", () => {
await runnerPromise;
assert.isEmpty(touchpointCoordinator.activeGestures);
});
-});
\ No newline at end of file
+});
diff --git a/web/src/test/auto/headless/engine/osk/gesture-processor/pathStats.tests.ts b/web/src/test/auto/headless/engine/osk/gesture-processor/pathStats.tests.ts
index 4a29363ca9..ff51d11be2 100644
--- a/web/src/test/auto/headless/engine/osk/gesture-processor/pathStats.tests.ts
+++ b/web/src/test/auto/headless/engine/osk/gesture-processor/pathStats.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
import { CumulativePathStats, InputSample } from 'keyman/engine/gesture-processor';
@@ -167,4 +170,4 @@ describe("CumulativePathStats", function() {
assert.equal(deaccumulatedSecondHalfStats.initialSample, secondHalfStats.initialSample);
assert.equal(deaccumulatedSecondHalfStats.lastSample, secondHalfStats.lastSample);
});
-});
\ No newline at end of file
+});
diff --git a/web/src/test/auto/headless/engine/osk/input/gestures/browser/subkeyPopup.tests.ts b/web/src/test/auto/headless/engine/osk/input/gestures/browser/subkeyPopup.tests.ts
index e4ce793e14..13b8fc792e 100644
--- a/web/src/test/auto/headless/engine/osk/input/gestures/browser/subkeyPopup.tests.ts
+++ b/web/src/test/auto/headless/engine/osk/input/gestures/browser/subkeyPopup.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
// @ts-ignore // Type info unavailable; doing a npm-install for it breaks things much worse in other ways.
import { JSDOM } from 'jsdom';
diff --git a/web/src/test/auto/headless/engine/predictive-text/templates/common.tests.ts b/web/src/test/auto/headless/engine/predictive-text/templates/common.tests.ts
index 95db19df8d..9e75f9d948 100644
--- a/web/src/test/auto/headless/engine/predictive-text/templates/common.tests.ts
+++ b/web/src/test/auto/headless/engine/predictive-text/templates/common.tests.ts
@@ -1,4 +1,6 @@
/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ *
* Unit tests for common utility functions/methods.
*/
diff --git a/web/src/test/auto/headless/engine/predictive-text/templates/custom-breakers.def.ts b/web/src/test/auto/headless/engine/predictive-text/templates/custom-breakers.def.ts
index d80776ee5f..33275cc2f0 100644
--- a/web/src/test/auto/headless/engine/predictive-text/templates/custom-breakers.def.ts
+++ b/web/src/test/auto/headless/engine/predictive-text/templates/custom-breakers.def.ts
@@ -1,4 +1,6 @@
-/**
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ *
* The custom wordbreaker used by the sil.km.gcc model as of
* https://github.com/keymanapp/lexical-models/pull/265.
* @type {WordBreakingFunction}
@@ -126,4 +128,4 @@ export function customWordBreakerFormer (str: string) {
length: token.length
}
});
-}
\ No newline at end of file
+}
diff --git a/web/src/test/auto/headless/engine/predictive-text/templates/helpers.ts b/web/src/test/auto/headless/engine/predictive-text/templates/helpers.ts
index f39cde9fa1..75e5064e0d 100644
--- a/web/src/test/auto/headless/engine/predictive-text/templates/helpers.ts
+++ b/web/src/test/auto/headless/engine/predictive-text/templates/helpers.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import path from 'node:path';
import { createRequire } from "node:module";
import { fileURLToPath } from 'node:url';
diff --git a/web/src/test/auto/headless/engine/predictive-text/templates/quote-behavior.tests.ts b/web/src/test/auto/headless/engine/predictive-text/templates/quote-behavior.tests.ts
index c6348d651d..8816d36b92 100644
--- a/web/src/test/auto/headless/engine/predictive-text/templates/quote-behavior.tests.ts
+++ b/web/src/test/auto/headless/engine/predictive-text/templates/quote-behavior.tests.ts
@@ -1,4 +1,6 @@
/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ *
* Unit tests for quote behaviors.
*/
diff --git a/web/src/test/auto/headless/engine/predictive-text/templates/tokenization.tests.ts b/web/src/test/auto/headless/engine/predictive-text/templates/tokenization.tests.ts
index 3bc636c412..995308c4b1 100644
--- a/web/src/test/auto/headless/engine/predictive-text/templates/tokenization.tests.ts
+++ b/web/src/test/auto/headless/engine/predictive-text/templates/tokenization.tests.ts
@@ -1,4 +1,6 @@
/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ *
* Unit tests for common utility functions/methods.
*/
diff --git a/web/src/test/auto/headless/engine/predictive-text/templates/trie-model.tests.ts b/web/src/test/auto/headless/engine/predictive-text/templates/trie-model.tests.ts
index 25cb5adfae..f7338ef68d 100644
--- a/web/src/test/auto/headless/engine/predictive-text/templates/trie-model.tests.ts
+++ b/web/src/test/auto/headless/engine/predictive-text/templates/trie-model.tests.ts
@@ -1,4 +1,6 @@
/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ *
* Unit tests for the Trie prediction model.
*/
diff --git a/web/src/test/auto/headless/engine/predictive-text/templates/trie-traversal.tests.ts b/web/src/test/auto/headless/engine/predictive-text/templates/trie-traversal.tests.ts
index 7f8947ca16..f5b9353ab1 100644
--- a/web/src/test/auto/headless/engine/predictive-text/templates/trie-traversal.tests.ts
+++ b/web/src/test/auto/headless/engine/predictive-text/templates/trie-traversal.tests.ts
@@ -1,4 +1,6 @@
/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ *
* Unit tests for the Trie prediction model.
*/
diff --git a/web/src/test/auto/headless/engine/predictive-text/wordbreakers/ascii-word-breaker.tests.ts b/web/src/test/auto/headless/engine/predictive-text/wordbreakers/ascii-word-breaker.tests.ts
index 843df8c002..84a26b77ca 100644
--- a/web/src/test/auto/headless/engine/predictive-text/wordbreakers/ascii-word-breaker.tests.ts
+++ b/web/src/test/auto/headless/engine/predictive-text/wordbreakers/ascii-word-breaker.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
import { ascii as breakASCIIWords } from '@keymanapp/models-wordbreakers';
diff --git a/web/src/test/auto/headless/engine/predictive-text/wordbreakers/default-word-breaker.tests.ts b/web/src/test/auto/headless/engine/predictive-text/wordbreakers/default-word-breaker.tests.ts
index 192385ba10..68f0e516ac 100644
--- a/web/src/test/auto/headless/engine/predictive-text/wordbreakers/default-word-breaker.tests.ts
+++ b/web/src/test/auto/headless/engine/predictive-text/wordbreakers/default-word-breaker.tests.ts
@@ -1,4 +1,6 @@
-/**
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ *
* Smoke-test the default
*/
diff --git a/web/src/test/auto/headless/engine/predictive-text/wordbreakers/placeholder-word-breaker.tests.ts b/web/src/test/auto/headless/engine/predictive-text/wordbreakers/placeholder-word-breaker.tests.ts
index 0991315cd2..bb584069a0 100644
--- a/web/src/test/auto/headless/engine/predictive-text/wordbreakers/placeholder-word-breaker.tests.ts
+++ b/web/src/test/auto/headless/engine/predictive-text/wordbreakers/placeholder-word-breaker.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
import { placeholder as breakWords } from '@keymanapp/models-wordbreakers';
diff --git a/web/src/test/auto/headless/engine/predictive-text/wordbreakers/search-property.tests.ts b/web/src/test/auto/headless/engine/predictive-text/wordbreakers/search-property.tests.ts
index e345154fa0..6fa973e1ed 100644
--- a/web/src/test/auto/headless/engine/predictive-text/wordbreakers/search-property.tests.ts
+++ b/web/src/test/auto/headless/engine/predictive-text/wordbreakers/search-property.tests.ts
@@ -1,4 +1,6 @@
-/**
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ *
* Smoke-test the default
*/
diff --git a/web/src/test/auto/headless/engine/predictive-text/worker-thread/correction-search/classical-calculation.tests.ts b/web/src/test/auto/headless/engine/predictive-text/worker-thread/correction-search/classical-calculation.tests.ts
index de321ffc7e..bf8493c8b3 100644
--- a/web/src/test/auto/headless/engine/predictive-text/worker-thread/correction-search/classical-calculation.tests.ts
+++ b/web/src/test/auto/headless/engine/predictive-text/worker-thread/correction-search/classical-calculation.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
import { ClassicalDistanceCalculation, EditOperation, EditTuple, forNewIndices } from '@keymanapp/lm-worker/test-index';
import sinon from 'sinon';
diff --git a/web/src/test/auto/headless/engine/predictive-text/worker-thread/correction-search/early-correction-search-stopping.tests.ts b/web/src/test/auto/headless/engine/predictive-text/worker-thread/correction-search/early-correction-search-stopping.tests.ts
index 6958c783a4..90238867b5 100644
--- a/web/src/test/auto/headless/engine/predictive-text/worker-thread/correction-search/early-correction-search-stopping.tests.ts
+++ b/web/src/test/auto/headless/engine/predictive-text/worker-thread/correction-search/early-correction-search-stopping.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
import { CORRECTION_SEARCH_THRESHOLDS, CorrectionPredictionTupleCore, ModelCompositor, shouldStopSearchingEarly } from "@keymanapp/lm-worker/test-index";
@@ -57,4 +60,4 @@ describe('correction-search: shouldStopSearchingEarly', () => {
assert.isFalse(shouldStopSearchingEarly(baseCost, baseCost + expectedThreshold - 0.01, predictions));
assert.isTrue(shouldStopSearchingEarly(baseCost, baseCost + expectedThreshold + 0.01, predictions));
});
-});
\ No newline at end of file
+});
diff --git a/web/src/test/auto/headless/engine/predictive-text/worker-thread/correction-search/execution-timer.tests.ts b/web/src/test/auto/headless/engine/predictive-text/worker-thread/correction-search/execution-timer.tests.ts
index 461ccf2f30..8942dc1137 100644
--- a/web/src/test/auto/headless/engine/predictive-text/worker-thread/correction-search/execution-timer.tests.ts
+++ b/web/src/test/auto/headless/engine/predictive-text/worker-thread/correction-search/execution-timer.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
import { useFakeTimers, type SinonFakeTimers } from 'sinon';
@@ -379,4 +382,4 @@ describe('ExecutionBucket', () => {
assert.isBelow(bucket.variance, 0.5);
});
});
-});
\ No newline at end of file
+});
diff --git a/web/src/test/auto/headless/engine/predictive-text/worker-thread/correction-search/segmentable-calculation.tests.ts b/web/src/test/auto/headless/engine/predictive-text/worker-thread/correction-search/segmentable-calculation.tests.ts
index 1abdfa89e4..6af1ed048c 100644
--- a/web/src/test/auto/headless/engine/predictive-text/worker-thread/correction-search/segmentable-calculation.tests.ts
+++ b/web/src/test/auto/headless/engine/predictive-text/worker-thread/correction-search/segmentable-calculation.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
import { SegmentableDistanceCalculation } from '@keymanapp/lm-worker/test-index';
@@ -205,4 +208,4 @@ describe('Split/merge aware edit-distance calculation', () => {
{ op: 'substitute', input: 3, match: 3 } // 'g' -> 'efgh'
]);
});
-});
\ No newline at end of file
+});
diff --git a/web/src/test/auto/headless/engine/predictive-text/worker-thread/prediction-helpers/auto-correct.tests.ts b/web/src/test/auto/headless/engine/predictive-text/worker-thread/prediction-helpers/auto-correct.tests.ts
index 9306371712..2617f0953e 100644
--- a/web/src/test/auto/headless/engine/predictive-text/worker-thread/prediction-helpers/auto-correct.tests.ts
+++ b/web/src/test/auto/headless/engine/predictive-text/worker-thread/prediction-helpers/auto-correct.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
import {
@@ -571,4 +574,4 @@ describe('predictionAutoSelect', () => {
// it.skip("properly groups sufficiently-similar suggestions for auto-correction based on engine settings", () => {
// //
// });
-});
\ No newline at end of file
+});
diff --git a/web/src/test/auto/headless/engine/predictive-text/worker-thread/prediction-helpers/base-context-state.tests.ts b/web/src/test/auto/headless/engine/predictive-text/worker-thread/prediction-helpers/base-context-state.tests.ts
index a38b4e3012..d938fff5b2 100644
--- a/web/src/test/auto/headless/engine/predictive-text/worker-thread/prediction-helpers/base-context-state.tests.ts
+++ b/web/src/test/auto/headless/engine/predictive-text/worker-thread/prediction-helpers/base-context-state.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
import sinon from 'sinon';
@@ -255,4 +258,4 @@ describe('matchBaseContextState', () => {
warningSpy.restore();
}
});
-});
\ No newline at end of file
+});
diff --git a/web/src/test/auto/headless/engine/predictive-text/worker-thread/prediction-helpers/casing-detection.tests.ts b/web/src/test/auto/headless/engine/predictive-text/worker-thread/prediction-helpers/casing-detection.tests.ts
index 84e80a00f2..109e2f693a 100644
--- a/web/src/test/auto/headless/engine/predictive-text/worker-thread/prediction-helpers/casing-detection.tests.ts
+++ b/web/src/test/auto/headless/engine/predictive-text/worker-thread/prediction-helpers/casing-detection.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
import { LexicalModelTypes } from '@keymanapp/common-types';
@@ -383,4 +386,4 @@ describe('detectCasing', () => {
deleteLeft: 0
}, context));
});
-});
\ No newline at end of file
+});
diff --git a/web/src/test/auto/headless/engine/predictive-text/worker-thread/prediction-helpers/determine-suggestion-alignment.tests.ts b/web/src/test/auto/headless/engine/predictive-text/worker-thread/prediction-helpers/determine-suggestion-alignment.tests.ts
index 1e5146795f..66c7fa5b52 100644
--- a/web/src/test/auto/headless/engine/predictive-text/worker-thread/prediction-helpers/determine-suggestion-alignment.tests.ts
+++ b/web/src/test/auto/headless/engine/predictive-text/worker-thread/prediction-helpers/determine-suggestion-alignment.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
import { LexicalModelTypes } from '@keymanapp/common-types';
@@ -100,4 +103,4 @@ describe('determineSuggestionAlignment', () => {
assert.equal(results.correctionDeleteLeft, "tech".length /* does not include the deleted whitespace */);
assert.equal(results.committedDeleteLeft, 1 /* for the deleted whitespace */);
});
-});
\ No newline at end of file
+});
diff --git a/web/src/test/auto/headless/engine/predictive-text/worker-thread/prediction-helpers/determine-suggestion-context-transition.tests.ts b/web/src/test/auto/headless/engine/predictive-text/worker-thread/prediction-helpers/determine-suggestion-context-transition.tests.ts
index e911021537..4e0e54b3bb 100644
--- a/web/src/test/auto/headless/engine/predictive-text/worker-thread/prediction-helpers/determine-suggestion-context-transition.tests.ts
+++ b/web/src/test/auto/headless/engine/predictive-text/worker-thread/prediction-helpers/determine-suggestion-context-transition.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
import sinon from 'sinon';
@@ -453,4 +456,4 @@ describe('determineContextTransition', () => {
warningEmitterSpy.restore();
}
});
-});
\ No newline at end of file
+});
diff --git a/web/src/test/auto/headless/engine/predictive-text/worker-thread/prediction-helpers/predict-from-corrections.tests.ts b/web/src/test/auto/headless/engine/predictive-text/worker-thread/prediction-helpers/predict-from-corrections.tests.ts
index d18f287841..2790522ee3 100644
--- a/web/src/test/auto/headless/engine/predictive-text/worker-thread/prediction-helpers/predict-from-corrections.tests.ts
+++ b/web/src/test/auto/headless/engine/predictive-text/worker-thread/prediction-helpers/predict-from-corrections.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
diff --git a/web/src/test/auto/headless/engine/predictive-text/worker-thread/prediction-helpers/suggestion-deduplication.tests.ts b/web/src/test/auto/headless/engine/predictive-text/worker-thread/prediction-helpers/suggestion-deduplication.tests.ts
index 1a3aad48a2..5d62044cdb 100644
--- a/web/src/test/auto/headless/engine/predictive-text/worker-thread/prediction-helpers/suggestion-deduplication.tests.ts
+++ b/web/src/test/auto/headless/engine/predictive-text/worker-thread/prediction-helpers/suggestion-deduplication.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
import * as wordBreakers from '@keymanapp/models-wordbreakers';
@@ -167,4 +170,4 @@ describe('dedupeSuggestions', () => {
assert.deepEqual(deduplicated, expected);
});
-});
\ No newline at end of file
+});
diff --git a/web/src/test/auto/headless/engine/predictive-text/worker-thread/prediction-helpers/suggestion-finalization.tests.ts b/web/src/test/auto/headless/engine/predictive-text/worker-thread/prediction-helpers/suggestion-finalization.tests.ts
index 74bcf0c91a..a21918822f 100644
--- a/web/src/test/auto/headless/engine/predictive-text/worker-thread/prediction-helpers/suggestion-finalization.tests.ts
+++ b/web/src/test/auto/headless/engine/predictive-text/worker-thread/prediction-helpers/suggestion-finalization.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
diff --git a/web/src/test/auto/headless/engine/predictive-text/worker-thread/prediction-helpers/suggestion-similarity.tests.ts b/web/src/test/auto/headless/engine/predictive-text/worker-thread/prediction-helpers/suggestion-similarity.tests.ts
index 9e88e8af22..bae0c1c8a5 100644
--- a/web/src/test/auto/headless/engine/predictive-text/worker-thread/prediction-helpers/suggestion-similarity.tests.ts
+++ b/web/src/test/auto/headless/engine/predictive-text/worker-thread/prediction-helpers/suggestion-similarity.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
import { QuoteBehavior } from "@keymanapp/models-templates";
@@ -417,4 +420,4 @@ describe('processSimilarity', () => {
assert.sameDeepMembers(distribution, expectation);
});
});
-});
\ No newline at end of file
+});
diff --git a/web/src/test/auto/headless/engine/predictive-text/worker-thread/transform-utils.tests.ts b/web/src/test/auto/headless/engine/predictive-text/worker-thread/transform-utils.tests.ts
index e7d992ae64..d075ea429d 100644
--- a/web/src/test/auto/headless/engine/predictive-text/worker-thread/transform-utils.tests.ts
+++ b/web/src/test/auto/headless/engine/predictive-text/worker-thread/transform-utils.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
import { TransformUtils } from '@keymanapp/lm-worker/test-index';
diff --git a/web/src/test/auto/headless/engine/predictive-text/worker-thread/worker-custom-punctuation.tests.ts b/web/src/test/auto/headless/engine/predictive-text/worker-thread/worker-custom-punctuation.tests.ts
index 9b9ab2c312..908929fea4 100644
--- a/web/src/test/auto/headless/engine/predictive-text/worker-thread/worker-custom-punctuation.tests.ts
+++ b/web/src/test/auto/headless/engine/predictive-text/worker-thread/worker-custom-punctuation.tests.ts
@@ -1,4 +1,6 @@
/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ *
* Unit tests for the Dummy prediction model.
*/
diff --git a/web/src/test/auto/headless/engine/predictive-text/worker-thread/worker-initialization.tests.ts b/web/src/test/auto/headless/engine/predictive-text/worker-thread/worker-initialization.tests.ts
index 6fd84c5602..ac5cc951ba 100644
--- a/web/src/test/auto/headless/engine/predictive-text/worker-thread/worker-initialization.tests.ts
+++ b/web/src/test/auto/headless/engine/predictive-text/worker-thread/worker-initialization.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import fs from 'node:fs';
import { createRequire } from 'node:module';
diff --git a/web/src/test/auto/headless/engine/predictive-text/worker-thread/worker-model-compositor.tests.ts b/web/src/test/auto/headless/engine/predictive-text/worker-thread/worker-model-compositor.tests.ts
index f01cafbac6..408b5fe144 100644
--- a/web/src/test/auto/headless/engine/predictive-text/worker-thread/worker-model-compositor.tests.ts
+++ b/web/src/test/auto/headless/engine/predictive-text/worker-thread/worker-model-compositor.tests.ts
@@ -1,4 +1,6 @@
/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ *
* Integration tests for the model compositor with the trie model.
*/
diff --git a/web/src/test/auto/headless/engine/predictive-text/worker-thread/worker-predict-dummy.tests.ts b/web/src/test/auto/headless/engine/predictive-text/worker-thread/worker-predict-dummy.tests.ts
index 536c8d266f..181dd06e9a 100644
--- a/web/src/test/auto/headless/engine/predictive-text/worker-thread/worker-predict-dummy.tests.ts
+++ b/web/src/test/auto/headless/engine/predictive-text/worker-thread/worker-predict-dummy.tests.ts
@@ -1,4 +1,6 @@
/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ *
* Unit tests for the Dummy prediction model.
*/
diff --git a/web/src/test/auto/headless/engine/predictive-text/worker-thread/worker-predict.tests.ts b/web/src/test/auto/headless/engine/predictive-text/worker-thread/worker-predict.tests.ts
index 2214d6e61c..4b19f54a83 100644
--- a/web/src/test/auto/headless/engine/predictive-text/worker-thread/worker-predict.tests.ts
+++ b/web/src/test/auto/headless/engine/predictive-text/worker-thread/worker-predict.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { createRequire } from 'node:module';
import { assert } from 'chai';
diff --git a/web/src/test/auto/integrated/cases/basics.tests.ts b/web/src/test/auto/integrated/cases/basics.tests.ts
index b44907f243..026c714a80 100644
--- a/web/src/test/auto/integrated/cases/basics.tests.ts
+++ b/web/src/test/auto/integrated/cases/basics.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
import { DEVICE_DETECT_FAILURE, setupKMW, teardownKMW } from "../test_utils.js";
@@ -195,4 +198,4 @@ if(!device.touchable) {
assert.isNotNull(toolbar, 'The main toolbar element was not added to the page!');
})
});
-}
\ No newline at end of file
+}
diff --git a/web/src/test/auto/integrated/cases/engine.tests.ts b/web/src/test/auto/integrated/cases/engine.tests.ts
index a7e624cbf4..7f59652267 100644
--- a/web/src/test/auto/integrated/cases/engine.tests.ts
+++ b/web/src/test/auto/integrated/cases/engine.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
import {
@@ -336,4 +339,4 @@ describe('Engine - Browser Interactions', function() {
}); // THEN we run our checks.
});
});
-});
\ No newline at end of file
+});
diff --git a/web/src/test/auto/integrated/cases/engine_chirality.tests.ts b/web/src/test/auto/integrated/cases/engine_chirality.tests.ts
index 57dbf1b48b..8ce0d1d713 100644
--- a/web/src/test/auto/integrated/cases/engine_chirality.tests.ts
+++ b/web/src/test/auto/integrated/cases/engine_chirality.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
import {
@@ -49,4 +52,4 @@ describe('Engine - Chirality', function() {
return await runKeyboardTestFromJSON('resources/json/engine_tests/chirality.json', {usingOSK: true}, assert.equal, baseTimeout);
});
});
-});
\ No newline at end of file
+});
diff --git a/web/src/test/auto/integrated/cases/events.tests.ts b/web/src/test/auto/integrated/cases/events.tests.ts
index 29a9e24d1b..fcc08354bb 100644
--- a/web/src/test/auto/integrated/cases/events.tests.ts
+++ b/web/src/test/auto/integrated/cases/events.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
import {
@@ -153,4 +156,4 @@ describe('Event Management', function() {
assert.equal(counterObj.i, fin, "Event handler not called the expected number of times");
});
-});
\ No newline at end of file
+});
diff --git a/web/src/test/auto/integrated/cases/text_selection.tests.ts b/web/src/test/auto/integrated/cases/text_selection.tests.ts
index 9bc9de9cd4..d6ac60d8bc 100644
--- a/web/src/test/auto/integrated/cases/text_selection.tests.ts
+++ b/web/src/test/auto/integrated/cases/text_selection.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { assert } from 'chai';
import {
diff --git a/web/src/test/auto/integrated/init_check.tests.ts b/web/src/test/auto/integrated/init_check.tests.ts
index 813ac7ba45..aebfc70412 100644
--- a/web/src/test/auto/integrated/init_check.tests.ts
+++ b/web/src/test/auto/integrated/init_check.tests.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
// A simple "does device detection work properly" unit test.
// We'll let things break after this reports, since this will likely signal a LOT of other failures.
import { assert } from 'chai';
@@ -27,4 +30,4 @@ describe('Test Initialization', function() {
assert.fail(err);
}
});
-});
\ No newline at end of file
+});
diff --git a/web/src/test/auto/integrated/test_utils.ts b/web/src/test/auto/integrated/test_utils.ts
index 585fac8084..07baedb23d 100644
--- a/web/src/test/auto/integrated/test_utils.ts
+++ b/web/src/test/auto/integrated/test_utils.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
// KeymanWeb test suite - processing of the Karma configuration's client.args parameter.
import { DeviceDetector } from 'keyman/engine/main';
@@ -266,4 +269,4 @@ export function toEscapedSupplementaryPairString(code: number) {
const L = ((code - 0x10000) % 0x400 + 0xDC00).toString(16);
return "\\u"+H+"\\u"+L;
-}
\ No newline at end of file
+}
diff --git a/web/src/test/auto/resources/simulateMultiSourceInput.ts b/web/src/test/auto/resources/simulateMultiSourceInput.ts
index 452cec9285..b210825a9b 100644
--- a/web/src/test/auto/resources/simulateMultiSourceInput.ts
+++ b/web/src/test/auto/resources/simulateMultiSourceInput.ts
@@ -1,3 +1,6 @@
+/*
+ * Keyman is copyright (C) SIL Global. MIT License.
+ */
import { InputSample, buildGestureMatchInspector, GestureSource, GestureSourceSubview, gestures } from 'keyman/engine/gesture-processor';
import { ManagedPromise, timedPromise } from 'keyman/common/web-utils';
@@ -417,4 +420,4 @@ export function simulateSelectorInput(
selectorPromise: testObjPromise,
executor
};
-}
\ No newline at end of file
+}
diff --git a/windows/docs/engine/whatsnew.md b/windows/docs/engine/whatsnew.md
new file mode 100644
index 0000000000..d9be30aef7
--- /dev/null
+++ b/windows/docs/engine/whatsnew.md
@@ -0,0 +1,19 @@
+---
+title: What's New in Keyman Engine 19.0 for Windows
+---
+
+* **kmcomapi:** Added the `MCompileForBaseKeyboard(long KLID)` COM method to the
+ new `IKeymanKeyboardInstalled2` interface, which extends
+ `IKeymanKeyboardInstalled`. The method accepts the user's base keyboard ID and
+ allows `mcompile` to compile all installed keyboard layouts against that
+ keyboard ID. See #16162 for details.
+* **kmcomapi:** Added the `Install3` COM method, which accepts a base keyboard
+ ID. The base keyboard ID is passed to `mcompile` during installation so that
+ the keyboard layout can be compiled against the specified base keyboard.
+ `Install3` has been added to the following interfaces: `IKeymanKeyboardFile3`,
+ `IKeymanPackageFile3`, `IKeymanKeyboardsInstalled3`, and
+ `IKeymanPackagesInstalled3`. See #16528 for details.
+
+## See Also
+
+* [Keyman Engine for Windows Documentation](index)
\ No newline at end of file
diff --git a/windows/docs/help/about/whatsnew.md b/windows/docs/help/about/whatsnew.md
index fcb10c1e8b..5dbe585580 100644
--- a/windows/docs/help/about/whatsnew.md
+++ b/windows/docs/help/about/whatsnew.md
@@ -4,6 +4,13 @@ title: What's New in Keyman 20.0 for Windows
Here are some of the new features we have added to Keyman 20.0 for Windows:
+- Full support for Windows on ARM64 processors (#14621)
+- Keyboard search pages are now available in more languages (#15510)
+- Improved startup time (#14795)
+- Improved stability on heavily loaded systems (#15179)
+- Improvements to selection of base keyboard for mnemonic layouts (#16162)
+- About [250 other fixes and changes](https://keyman.com/go/app/whatsnew/windows/19.0)
+
## Related Topics
- [Version History](history)
diff --git a/windows/src/header_format.txt b/windows/src/header_format.txt
deleted file mode 100644
index 3e9a7f3874..0000000000
--- a/windows/src/header_format.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# File describing header requirements for PAS files
-# This file is in SDF format -- see TStringList.CommaText for details
-#
-# , , ,
-#
-Name,True,False,Name
-Copyright,True,False,Copyright
-Documentation,True,True,Documentation
-Description,True,True,Description
-"Create Date",True,True,CreateDate
-"Modified Date",False,True,ModifiedDate
-Authors,True,True,Authors,Authors
-"Related Files",False,True,RelatedFiles
-Dependencies,False,True,Dependencies
-Bugs,False,True,Bugs
-Todo,False,True,Todo
-Notes,False,True,Notes
-History,True,True,History
diff --git a/windows/src/header_template.txt b/windows/src/header_template.txt
deleted file mode 100644
index e793379e3b..0000000000
--- a/windows/src/header_template.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-(*
- Name:
- Copyright:
- Documentation:
- Description:
- Create Date:
-
- Modified Date:
- Authors:
- Related Files:
- Dependencies:
-
- Bugs:
- Todo:
- Notes:
- History:
-*)