diff --git a/web/source/kmwdevice.ts b/web/source/kmwdevice.ts
index 5588601aa4..b2d1de871f 100644
--- a/web/source/kmwdevice.ts
+++ b/web/source/kmwdevice.ts
@@ -1,6 +1,7 @@
// Includes version-related functionality
///
///
+///
// The Device object definition -------------------------------------------------
@@ -249,5 +250,9 @@ namespace com.keyman {
return this._styles;
}
+
+ public get headlessSpec(): text.EngineDeviceSpec {
+ return new text.EngineDeviceSpec(this.browser, this.formFactor, this.OS, this.touchable);
+ }
}
}
\ No newline at end of file
diff --git a/web/source/text/engineDeviceSpec.ts b/web/source/text/engineDeviceSpec.ts
new file mode 100644
index 0000000000..15f96be720
--- /dev/null
+++ b/web/source/text/engineDeviceSpec.ts
@@ -0,0 +1,76 @@
+namespace com.keyman.text {
+ export enum Browser {
+ Chrome = 'chrome',
+ Edge = 'edge',
+ Firefox = 'firefox',
+ Native = 'native', // Used by embedded mode
+ Opera = 'opera',
+ Safari = 'safari',
+ Other = 'other'
+ }
+
+ export enum OperatingSystem {
+ Windows = 'Windows',
+ macOS = 'MacOSX',
+ Linux = 'Linux',
+ Android = 'Android',
+ iOS = 'iOS',
+ Other = 'other'
+ }
+
+ export enum FormFactor {
+ Desktop = 'desktop',
+ Phone = 'phone',
+ Tablet = 'tablet'
+ }
+
+ /**
+ * This class provides an abstract version of com.keyman.Device that is headless-friendly,
+ * containing only the information needed by web-core for text processing use.
+ */
+ export class EngineDeviceSpec {
+ readonly browser: Browser;
+ readonly formFactor: FormFactor;
+ readonly OS: OperatingSystem;
+ readonly touchable: boolean;
+
+ constructor(browser: string, formFactor: string, OS: string, touchable: boolean) {
+ switch(browser as Browser) {
+ case Browser.Chrome:
+ case Browser.Edge:
+ case Browser.Firefox:
+ case Browser.Native:
+ case Browser.Opera:
+ case Browser.Safari:
+ this.browser = browser as Browser;
+ break;
+ default:
+ this.browser = Browser.Other;
+ }
+
+ switch(formFactor.toLowerCase()) {
+ case FormFactor.Desktop:
+ case FormFactor.Phone:
+ case FormFactor.Tablet:
+ this.formFactor = formFactor as FormFactor;
+ break;
+ default:
+ throw ("Invalid form factor specified for device!");
+ }
+
+ switch(OS.toLowerCase()) {
+ case OperatingSystem.Windows.toLowerCase():
+ case OperatingSystem.macOS.toLowerCase():
+ case OperatingSystem.Linux.toLowerCase():
+ case OperatingSystem.Android.toLowerCase():
+ case OperatingSystem.iOS.toLowerCase():
+ this.OS = OS as OperatingSystem;
+ break;
+ default:
+ this.OS = OperatingSystem.Other;
+ }
+
+ this.touchable = touchable;
+ }
+ }
+}
\ No newline at end of file