From 61a6e3643caac5c80f465ceae5900f06fd2f6d9d Mon Sep 17 00:00:00 2001 From: Aleksander Guryanov Date: Wed, 28 Aug 2019 22:05:49 +0700 Subject: [PATCH] publish: 6.22.32 --- README.md | 21 ++++++++ dist/docs/api/js-dos-ts/js-dos-build.md | 4 +- dist/docs/api/js-dos-ts/js-dos-ci.md | 71 +++++++++++++++++++++++++ js-dos-ts/js-dos-build.ts | 4 +- js-dos-ts/js-dos-ci.ts | 29 ++++++++++ package.json | 2 +- test/index.html | 5 +- test/test.ts | 19 +++++++ 8 files changed, 149 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 5471c008..425bee07 100644 --- a/README.md +++ b/README.md @@ -369,6 +369,27 @@ export default JsDos; Then you can use it as simple html tag `````` +### Keyboard in iframe + +Normally when you use js-dos in iframe keyboard should work. But remember that iframe must be focused +to receive keyboard events. By default when you click on iframe it recives focus, but if you use +mouse event listener with prevent default at the end, then iframe will not recieve focus. You can solve +this problem by calling `iframe.focus()` function. + +### Simulating keyboard events + +You can easily simulate key press and release using [CommandInterface.simulateKeyEvent(keyCode: number, pressed: boolean)](https://js-dos.com/6.22/docs/api/generate.html?page=js-dos-ci). Or you can use shortcut for single event `simulateKeyPress(keyCode: number)`, like in example: + +```javascript + Dos(canvas).ready((fs, main) => { + fs.extract("digger.zip").then(() => { + main(["-c", "DIGGER.COM"]).then((ci) => { + ci.simulateKeyPress(37); // left arrow + }) + }); + }); +``` + ## Building Building process have two steps: diff --git a/dist/docs/api/js-dos-ts/js-dos-build.md b/dist/docs/api/js-dos-ts/js-dos-build.md index f1333144..923c82e6 100644 --- a/dist/docs/api/js-dos-ts/js-dos-build.md +++ b/dist/docs/api/js-dos-ts/js-dos-build.md @@ -20,8 +20,8 @@ gulpfile.js --> generateBuildInfo ``` export const Build = { - version: "6.22.31 (c994d52c63db2dbfb069d76356df78e0)", - jsVersion: "97110c66c9e0731fa6728b56e7e944f3c5f5a144", + version: "6.22.32 (b41b4a60d500f0255d9de52283a44732)", + jsVersion: "eb4d0b7c1dbef664e89bcae806ae531f2cd1a712", jsSize: 196977, wasmVersion: "03ff8f9208bc11b041bebc7cce39e56d", wasmSize: 1810179, diff --git a/dist/docs/api/js-dos-ts/js-dos-ci.md b/dist/docs/api/js-dos-ts/js-dos-ci.md index 2c1b54b9..39cecd59 100644 --- a/dist/docs/api/js-dos-ts/js-dos-ci.md +++ b/dist/docs/api/js-dos-ts/js-dos-ci.md @@ -149,6 +149,77 @@ resolves when commands sequence is executed return -1; } + +``` + + + + + + + +* `simulateKeyEvent(keyCode, pressed)` - allows to simulate key press OR release on js-dos canvas + + + + +``` + public simulateKeyEvent(keyCode: number, pressed: boolean): void { + const name = pressed ? "keydown" : "keyup"; + const event = document.createEvent("KeyboardEvent") as any; + const getter: any = { + get() { + return this.keyCodeVal; + }, + }; + + +``` + + + + + + + +Chromium Hack + + + + +``` + Object.defineProperty(event, "keyCode", getter); + Object.defineProperty(event, "which", getter); + Object.defineProperty(event, "charCode", getter); + + event.initKeyboardEvent + ? event.initKeyboardEvent(name, true, true, document.defaultView, false, false, false, false, keyCode, keyCode) + : event.initKeyEvent(name, true, true, document.defaultView, false, false, false, false, keyCode, 0); + + event.keyCodeVal = keyCode; + this.dos.canvas && this.dos.canvas.dispatchEvent(event); + } + + +``` + + + + + + + +* `simulateKeyPress(keyCode)` - allows to simulate key press AND release on js-dos canvas + + + + +``` + public simulateKeyPress(keyCode: number): void { + this.simulateKeyEvent(keyCode, true); + setTimeout(() => this.simulateKeyEvent(keyCode, false), 100); + } + private sendKeyPress(code: number) { this.api.send("sdl_key_event", code + ""); } diff --git a/js-dos-ts/js-dos-build.ts b/js-dos-ts/js-dos-build.ts index 32c10c2c..c73e9643 100644 --- a/js-dos-ts/js-dos-build.ts +++ b/js-dos-ts/js-dos-build.ts @@ -3,8 +3,8 @@ // gulpfile.js --> generateBuildInfo export const Build = { - version: "6.22.31 (c994d52c63db2dbfb069d76356df78e0)", - jsVersion: "97110c66c9e0731fa6728b56e7e944f3c5f5a144", + version: "6.22.32 (b41b4a60d500f0255d9de52283a44732)", + jsVersion: "eb4d0b7c1dbef664e89bcae806ae531f2cd1a712", jsSize: 196977, wasmVersion: "03ff8f9208bc11b041bebc7cce39e56d", wasmSize: 1810179, diff --git a/js-dos-ts/js-dos-ci.ts b/js-dos-ts/js-dos-ci.ts index 7fa9b810..51a76c91 100644 --- a/js-dos-ts/js-dos-ci.ts +++ b/js-dos-ts/js-dos-ci.ts @@ -70,6 +70,35 @@ export class DosCommandInterface { return -1; } + // * `simulateKeyEvent(keyCode, pressed)` - allows to simulate key press OR release on js-dos canvas + public simulateKeyEvent(keyCode: number, pressed: boolean): void { + const name = pressed ? "keydown" : "keyup"; + const event = document.createEvent("KeyboardEvent") as any; + const getter: any = { + get() { + return this.keyCodeVal; + }, + }; + + // Chromium Hack + Object.defineProperty(event, "keyCode", getter); + Object.defineProperty(event, "which", getter); + Object.defineProperty(event, "charCode", getter); + + event.initKeyboardEvent + ? event.initKeyboardEvent(name, true, true, document.defaultView, false, false, false, false, keyCode, keyCode) + : event.initKeyEvent(name, true, true, document.defaultView, false, false, false, false, keyCode, 0); + + event.keyCodeVal = keyCode; + this.dos.canvas && this.dos.canvas.dispatchEvent(event); + } + + // * `simulateKeyPress(keyCode)` - allows to simulate key press AND release on js-dos canvas + public simulateKeyPress(keyCode: number): void { + this.simulateKeyEvent(keyCode, true); + setTimeout(() => this.simulateKeyEvent(keyCode, false), 100); + } + private sendKeyPress(code: number) { this.api.send("sdl_key_event", code + ""); } diff --git a/package.json b/package.json index 11ed0e65..e9c3d9d2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "js-dos", - "version": "6.22.31", + "version": "6.22.32", "description": "Easiest API to run dos programs in browser", "main": "dist/js-dos.js", "types": "dist/typescript/js-dos.ts", diff --git a/test/index.html b/test/index.html index ee6ef3e2..260ca71d 100644 --- a/test/index.html +++ b/test/index.html @@ -18,7 +18,10 @@ diff --git a/test/test.ts b/test/test.ts index ce28426e..6a1f8f00 100644 --- a/test/test.ts +++ b/test/test.ts @@ -355,6 +355,25 @@ test("js-dos can run digger.zip", (done) => { }); }); +test("js-dos can simulate key events", (done) => { + const dos = Dos(document.getElementById("canvas") as HTMLCanvasElement, { + wdosboxUrl: "/wdosbox.js", + }); + + doReady(dos, (fs, main) => { + doNext(fs.extract("digger.zip"), () => { + doNext(main(["DIGGER.COM"]), (ci) => { + ci.simulateKeyPress(37); // left arrow + const fn = () => { + compareAndExit("digger-end.png", ci, done); + }; + + setTimeout(fn, 5000); + }); + }); + }); +}); + const saveImage = (ci: DosCommandInterface) => { ci.screenshot().then((data) => { const w = window.open("about:blank", "image from canvas");