From 741060f8578b184edc3474b2294b50df14e7997c Mon Sep 17 00:00:00 2001 From: Sam Clegg Date: Mon, 8 Jul 2024 18:29:47 -0700 Subject: [PATCH] Factor out html5 event faking code used in browser tests. NFC --- test/browser/fake_events.js | 52 ++++++ test/browser/test_sdl2_key.c | 14 +- test/browser/test_sdl2_mouse.c | 16 +- test/browser/test_sdl2_pumpevents.c | 6 +- test/browser/test_sdl2_text.c | 4 +- test/browser/test_sdl_mouse.c | 16 +- test/browser/test_sdl_pumpevents.c | 6 +- test/browser/test_sdl_text.c | 6 +- test/hello_world_gles_shell.html | 9 +- test/test_browser.py | 248 ++++------------------------ 10 files changed, 128 insertions(+), 249 deletions(-) create mode 100644 test/browser/fake_events.js diff --git a/test/browser/fake_events.js b/test/browser/fake_events.js new file mode 100644 index 0000000000000..6e1b48accb296 --- /dev/null +++ b/test/browser/fake_events.js @@ -0,0 +1,52 @@ +/* + * Helper function used in browser tests to simulate HTML5 events + */ + +function simulateKeyEvent(eventType, keyCode, code) { + var props = { keyCode, charCode: keyCode, view: window, bubbles: true, cancelable: true }; + if (code) props['code'] = code; + var event = new KeyboardEvent(eventType, props); + return document.dispatchEvent(event); +} + +function simulateKeyDown(keyCode, code = undefined) { + var doDefault = simulateKeyEvent('keydown', keyCode, code); + // As long as not handler called `preventDefault` we also send a keypress + // event. + if (doDefault) { + simulateKeyEvent('keypress', keyCode, code); + } +} + +function simulateKeyUp(keyCode, code = undefined) { + simulateKeyEvent('keyup', keyCode, code); +} + +function simulateMouseEvent(x, y, button, absolute) { + if (!absolute) { + x += Module['canvas'].offsetLeft; + y += Module['canvas'].offsetTop; + } + var event = document.createEvent("MouseEvents"); + if (button >= 0) { + var event1 = document.createEvent("MouseEvents"); + event1.initMouseEvent('mousedown', true, true, window, + 1, x, y, x, y, + 0, 0, 0, 0, + button, null); + Module['canvas'].dispatchEvent(event1); + var event2 = document.createEvent("MouseEvents"); + event2.initMouseEvent('mouseup', true, true, window, + 1, x, y, x, y, + 0, 0, 0, 0, + button, null); + Module['canvas'].dispatchEvent(event2); + } else { + var event1 = document.createEvent("MouseEvents"); + event1.initMouseEvent('mousemove', true, true, window, + 1, x, y, x, y, + 0, 0, 0, 0, + 0, null); + Module['canvas'].dispatchEvent(event1); + } +} diff --git a/test/browser/test_sdl2_key.c b/test/browser/test_sdl2_key.c index 52b7fa4b9124a..2db9199a47f67 100644 --- a/test/browser/test_sdl2_key.c +++ b/test/browser/test_sdl2_key.c @@ -62,13 +62,13 @@ int main(int argc, char **argv) { SDL_StartTextInput(); - emscripten_run_script("keydown(38, 'ArrowUp'); keyup(38, 'ArrowUp')"); // up - emscripten_run_script("keydown(40, 'ArrowDown'); keyup(40, 'ArrowDown')"); // down - emscripten_run_script("keydown(37, 'ArrowLeft'); keyup(37, 'ArrowLeft');"); // left - emscripten_run_script("keydown(39, 'ArrowRight');keyup(39, 'ArrowRight');"); // right - emscripten_run_script("keydown(65, 'KeyA'); keyup(65, 'KeyA');"); // a - emscripten_run_script("keydown(66, 'KeyB'); keyup(66, 'KeyB');"); // b - emscripten_run_script("keydown(100, 'Numpad4'); keyup(100, 'Numpad4');"); // trigger the end + emscripten_run_script("simulateKeyDown(38, 'ArrowUp'); simulateKeyUp(38, 'ArrowUp')"); // up + emscripten_run_script("simulateKeyDown(40, 'ArrowDown'); simulateKeyUp(40, 'ArrowDown')"); // down + emscripten_run_script("simulateKeyDown(37, 'ArrowLeft'); simulateKeyUp(37, 'ArrowLeft');"); // left + emscripten_run_script("simulateKeyDown(39, 'ArrowRight');simulateKeyUp(39, 'ArrowRight');"); // right + emscripten_run_script("simulateKeyDown(65, 'KeyA'); simulateKeyUp(65, 'KeyA');"); // a + emscripten_run_script("simulateKeyDown(66, 'KeyB'); simulateKeyUp(66, 'KeyB');"); // b + emscripten_run_script("simulateKeyDown(100, 'Numpad4'); simulateKeyUp(100, 'Numpad4');"); // trigger the end emscripten_set_main_loop(pump_events, 3, 0); return 99; diff --git a/test/browser/test_sdl2_mouse.c b/test/browser/test_sdl2_mouse.c index 52cc6248e33d8..1473c300a6dbe 100644 --- a/test/browser/test_sdl2_mouse.c +++ b/test/browser/test_sdl2_mouse.c @@ -84,11 +84,17 @@ int main() { SDL_Rect rect = { 0, 0, 600, 450 }; SDL_RenderFillRect(renderer, &rect); - emscripten_run_script("simulateMouseEvent(10, 20, -1)"); // move from 0,0 to 10,20 - emscripten_run_script("simulateMouseEvent(10, 20, 0)"); // click - emscripten_run_script("simulateMouseEvent(10, 20, 0)"); // click some more, but this one should be ignored through PeepEvent - emscripten_run_script("simulateMouseEvent(30, 70, -1)"); // move some more - emscripten_run_script("simulateMouseEvent(30, 70, 1)"); // trigger the end +#ifdef TEST_SDL_MOUSE_OFFSETS + int absolute = true; +#else + int absolute = false; +#endif + + EM_ASM(simulateMouseEvent(10, 20, -1, $0), absolute); // move from 0,0 to 10,20 + EM_ASM(simulateMouseEvent(10, 20, 0, $0), absolute); // click + EM_ASM(simulateMouseEvent(10, 20, 0, $0), absolute); // click some more, but this one should be ignored through PeepEvent + EM_ASM(simulateMouseEvent(30, 70, -1, $0), absolute); // move some more + EM_ASM(simulateMouseEvent(30, 70, 1, $0), absolute); // trigger the end emscripten_set_main_loop(one, 0, 0); } diff --git a/test/browser/test_sdl2_pumpevents.c b/test/browser/test_sdl2_pumpevents.c index 55cfbd602894f..215245f18e4b2 100644 --- a/test/browser/test_sdl2_pumpevents.c +++ b/test/browser/test_sdl2_pumpevents.c @@ -56,11 +56,11 @@ int main(int argc, char *argv[]) SDL_Window *window; SDL_CreateWindow("window", 0, 0, 600, 450, 0); - emscripten_run_script("keydown(37, 'ArrowLeft');"); // left + emscripten_run_script("simulateKeyDown(37, 'ArrowLeft');"); // left loop1(); - emscripten_run_script("keydown(39, 'ArrowRight');"); // right + emscripten_run_script("simulateKeyDown(39, 'ArrowRight');"); // right loop2(); - emscripten_run_script("keydown(65, 'KeyA');"); // A + emscripten_run_script("simulateKeyDown(65, 'KeyA');"); // A alphakey(); return 0; } diff --git a/test/browser/test_sdl2_text.c b/test/browser/test_sdl2_text.c index 7ee8b86e3da19..df9b3e5a8c5c6 100644 --- a/test/browser/test_sdl2_text.c +++ b/test/browser/test_sdl2_text.c @@ -37,8 +37,8 @@ int main() { SDL_CreateWindow("window", 0, 0, 600, 450, 0); SDL_StartTextInput(); - emscripten_run_script("simulateKeyEvent('a'.charCodeAt(0))"); // a - emscripten_run_script("simulateKeyEvent('A'.charCodeAt(0))"); // A + emscripten_run_script("simulateKeyDown('a'.charCodeAt(0))"); + emscripten_run_script("simulateKeyDown('A'.charCodeAt(0))"); one(); diff --git a/test/browser/test_sdl_mouse.c b/test/browser/test_sdl_mouse.c index ff83029d54810..8de4d65fc819a 100644 --- a/test/browser/test_sdl_mouse.c +++ b/test/browser/test_sdl_mouse.c @@ -70,11 +70,17 @@ int main() { SDL_Rect rect = { 0, 0, 600, 450 }; SDL_FillRect(screen, &rect, 0x2244ffff); - emscripten_run_script("simulateMouseEvent(10, 20, -1)"); // move from 0,0 to 10,20 - emscripten_run_script("simulateMouseEvent(10, 20, 0)"); // click - emscripten_run_script("simulateMouseEvent(10, 20, 0)"); // click some more, but this one should be ignored through PeepEvent - emscripten_run_script("simulateMouseEvent(30, 77, -1)"); // move some more - emscripten_run_script("simulateMouseEvent(30, 77, 1)"); // trigger the end +#ifdef TEST_SDL_MOUSE_OFFSETS + int absolute = true; +#else + int absolute = false; +#endif + + EM_ASM(simulateMouseEvent(10, 20, -1, $0), absolute); // move from 0,0 to 10,20 + EM_ASM(simulateMouseEvent(10, 20, 0, $0), absolute); // click + EM_ASM(simulateMouseEvent(10, 20, 0, $0), absolute); // click some more, but this one should be ignored through PeepEvent + EM_ASM(simulateMouseEvent(30, 77, -1, $0), absolute); // move some more + EM_ASM(simulateMouseEvent(30, 77, 1, $0), absolute); // trigger the end emscripten_set_main_loop(one, 0, 0); } diff --git a/test/browser/test_sdl_pumpevents.c b/test/browser/test_sdl_pumpevents.c index 3b1e8dba90e43..f9c934e640ce6 100644 --- a/test/browser/test_sdl_pumpevents.c +++ b/test/browser/test_sdl_pumpevents.c @@ -54,11 +54,11 @@ int main(int argc, char *argv[]) { SDL_Init(SDL_INIT_EVERYTHING); SDL_SetVideoMode(600, 400, 32, SDL_SWSURFACE); - emscripten_run_script("keydown(37);"); // left + emscripten_run_script("simulateKeyDown(37);"); // left loop1(); - emscripten_run_script("keydown(39);"); // right + emscripten_run_script("simulateKeyDown(39);"); // right loop2(); - emscripten_run_script("keydown(65);"); // A + emscripten_run_script("simulateKeyDown(65);"); // A alphakey(); return 0; } diff --git a/test/browser/test_sdl_text.c b/test/browser/test_sdl_text.c index 4588e998383da..b0ab8cd5998a6 100644 --- a/test/browser/test_sdl_text.c +++ b/test/browser/test_sdl_text.c @@ -38,8 +38,8 @@ int main() { SDL_SetVideoMode(600, 450, 32, SDL_HWSURFACE); SDL_StartTextInput(); - emscripten_run_script("simulateKeyEvent('a'.charCodeAt(0))"); // a - emscripten_run_script("simulateKeyEvent('A'.charCodeAt(0))"); // A - // + emscripten_run_script("simulateKeyDown('a'.charCodeAt(0))"); + emscripten_run_script("simulateKeyDown('A'.charCodeAt(0))"); + emscripten_exit_with_live_runtime(); } diff --git a/test/hello_world_gles_shell.html b/test/hello_world_gles_shell.html index fd46205318545..3bc85e5263a6e 100644 --- a/test/hello_world_gles_shell.html +++ b/test/hello_world_gles_shell.html @@ -8,6 +8,7 @@

+ ''') create_file('test.html', html) @@ -963,47 +952,24 @@ def test_keydown_preventdefault_proxy(self): def post(): html = read_file('test.html') html = html.replace('', ''' + ''') create_file('test.html', html) + shutil.copyfile(test_file('browser/fake_events.js'), 'fake_events.js') self.btest_exit('browser/test_keydown_preventdefault_proxy.c', 300, args=['--proxy-to-worker'], post_build=post) def test_sdl_text(self): @@ -1015,72 +981,14 @@ def test_sdl_text(self): } setTimeout(doOne, 1000/60); } - - function simulateKeyEvent(c) { - var event = new KeyboardEvent('keypress', { keyCode: c, charCode: c, view: window, bubbles: true, cancelable: true }); - document.body.dispatchEvent(event); - } ''') - self.btest_exit('test_sdl_text.c', args=['--pre-js', 'pre.js', '-lSDL', '-lGL']) + self.btest_exit('test_sdl_text.c', args=['--pre-js', 'pre.js', '--pre-js', test_file('browser/fake_events.js'), '-lSDL', '-lGL']) def test_sdl_mouse(self): - create_file('pre.js', ''' - globalThis.simulateMouseEvent = (x, y, button) => { - var event = document.createEvent("MouseEvents"); - if (button >= 0) { - var event1 = document.createEvent("MouseEvents"); - event1.initMouseEvent('mousedown', true, true, window, - 1, Module['canvas'].offsetLeft + x, Module['canvas'].offsetTop + y, Module['canvas'].offsetLeft + x, Module['canvas'].offsetTop + y, - 0, 0, 0, 0, - button, null); - Module['canvas'].dispatchEvent(event1); - var event2 = document.createEvent("MouseEvents"); - event2.initMouseEvent('mouseup', true, true, window, - 1, Module['canvas'].offsetLeft + x, Module['canvas'].offsetTop + y, Module['canvas'].offsetLeft + x, Module['canvas'].offsetTop + y, - 0, 0, 0, 0, - button, null); - Module['canvas'].dispatchEvent(event2); - } else { - var event1 = document.createEvent("MouseEvents"); - event1.initMouseEvent('mousemove', true, true, window, - 0, Module['canvas'].offsetLeft + x, Module['canvas'].offsetTop + y, Module['canvas'].offsetLeft + x, Module['canvas'].offsetTop + y, - 0, 0, 0, 0, - 0, null); - Module['canvas'].dispatchEvent(event1); - } - } - ''') - - self.btest_exit('test_sdl_mouse.c', args=['-O2', '--minify=0', '--pre-js', 'pre.js', '-lSDL', '-lGL']) + self.btest_exit('test_sdl_mouse.c', args=['-O2', '--minify=0', '--pre-js', test_file('browser/fake_events.js'), '-lSDL', '-lGL']) def test_sdl_mouse_offsets(self): - create_file('pre.js', ''' - globalThis.simulateMouseEvent = (x, y, button) => { - var event = document.createEvent("MouseEvents"); - if (button >= 0) { - var event1 = document.createEvent("MouseEvents"); - event1.initMouseEvent('mousedown', true, true, window, - 1, x, y, x, y, - 0, 0, 0, 0, - button, null); - Module['canvas'].dispatchEvent(event1); - var event2 = document.createEvent("MouseEvents"); - event2.initMouseEvent('mouseup', true, true, window, - 1, x, y, x, y, - 0, 0, 0, 0, - button, null); - Module['canvas'].dispatchEvent(event2); - } else { - var event1 = document.createEvent("MouseEvents"); - event1.initMouseEvent('mousemove', true, true, window, - 0, x, y, x, y, - 0, 0, 0, 0, - 0, null); - Module['canvas'].dispatchEvent(event1); - } - } - ''') create_file('page.html', ''' @@ -1127,7 +1035,7 @@ def test_sdl_mouse_offsets(self): ''') - self.compile_btest('browser/test_sdl_mouse.c', ['-DTEST_SDL_MOUSE_OFFSETS', '-O2', '--minify=0', '-o', 'sdl_mouse.js', '--pre-js', 'pre.js', '-lSDL', '-lGL', '-sEXIT_RUNTIME']) + self.compile_btest('browser/test_sdl_mouse.c', ['-DTEST_SDL_MOUSE_OFFSETS', '-O2', '--minify=0', '-o', 'sdl_mouse.js', '--pre-js', test_file('browser/fake_events.js'), '-lSDL', '-lGL', '-sEXIT_RUNTIME']) self.run_browser('page.html', '', '/report_result?exit:0') def test_glut_touchevents(self): @@ -1506,13 +1414,7 @@ def test_force_exit(self): def test_sdl_pumpevents(self): # key events should be detected using SDL_PumpEvents - create_file('pre.js', ''' - function keydown(c) { - var event = new KeyboardEvent('keydown', { keyCode: c, charCode: c, view: window, bubbles: true, cancelable: true }); - document.dispatchEvent(event); - } - ''') - self.btest_exit('test_sdl_pumpevents.c', args=['--pre-js', 'pre.js', '-lSDL', '-lGL']) + self.btest_exit('test_sdl_pumpevents.c', args=['--pre-js', test_file('browser/fake_events.js'), '-lSDL', '-lGL']) def test_sdl_canvas_size(self): self.btest_exit('test_sdl_canvas_size.c', @@ -1772,6 +1674,7 @@ def test_glgears_long(self, args): 'full_944': ('hello_world_gles_full_944.c',), }) def test_glgears_animation(self, filename): + shutil.copyfile(test_file('browser/fake_events.js'), 'fake_events.js') args = ['-o', 'something.html', '-DHAVE_BUILTIN_SINCOS', '-sGL_TESTING', '-lGL', '-lglut', '--shell-file', test_file('hello_world_gles_shell.html')] @@ -2590,9 +2493,8 @@ def test_doublestart_bug(self): 'legacy': (['-sMIN_FIREFOX_VERSION=0', '-sMIN_SAFARI_VERSION=0', '-sMIN_CHROME_VERSION=0', '-Wno-transpile'],) }) def test_html5_core(self, opts): - if self.is_wasm64(): - if '-sMIN_CHROME_VERSION=0' in opts: - self.skipTest('wasm64 does not support older browsers') + if self.is_wasm64() and '-sMIN_CHROME_VERSION=0' in opts: + self.skipTest('wasm64 does not support older browsers') if '-sHTML5_SUPPORT_DEFERRING_USER_SENSITIVE_REQUESTS=0' in opts: # In this mode an exception can be thrown by the browser, and we don't # want the test to fail in that case so we override the error handling. @@ -2937,25 +2839,7 @@ def test_sdl2_image_formats(self): ]) def test_sdl2_key(self): - create_file('pre.js', ''' - function keydown(keyCode, code) { - var event = new KeyboardEvent('keydown', { keyCode, code, charCode: keyCode, view: window, bubbles: true, cancelable: true }); - var prevented = !document.dispatchEvent(event); - - //send keypress if not prevented - if (!prevented) { - var event = new KeyboardEvent('keypress', { keyCode, code, charCode: keyCode, view: window, bubbles: true, cancelable: true }); - document.dispatchEvent(event); - } - } - - function keyup(keyCode, code) { - var event = new KeyboardEvent('keyup', { keyCode, code, charCode: keyCode, view: window, bubbles: true, cancelable: true }); - document.dispatchEvent(event); - } - ''') - - self.btest_exit('test_sdl2_key.c', 37182145, args=['-sUSE_SDL=2', '--pre-js', 'pre.js']) + self.btest_exit('test_sdl2_key.c', 37182145, args=['-sUSE_SDL=2', '--pre-js', test_file('browser/fake_events.js')]) def test_sdl2_text(self): create_file('pre.js', ''' @@ -2966,74 +2850,16 @@ def test_sdl2_text(self): } setTimeout(doOne, 1000/60); } - - function simulateKeyEvent(c) { - var event = new KeyboardEvent('keypress', { keyCode: c, charCode: c, view: window, bubbles: true, cancelable: true }); - document.body.dispatchEvent(event); - } ''') - self.btest_exit('test_sdl2_text.c', args=['--pre-js', 'pre.js', '-sUSE_SDL=2']) + self.btest_exit('test_sdl2_text.c', args=['--pre-js', 'pre.js', '--pre-js', test_file('browser/fake_events.js'), '-sUSE_SDL=2']) @requires_graphics_hardware def test_sdl2_mouse(self): - create_file('pre.js', ''' - globalThis.simulateMouseEvent = (x, y, button) => { - var event = document.createEvent("MouseEvents"); - if (button >= 0) { - var event1 = document.createEvent("MouseEvents"); - event1.initMouseEvent('mousedown', true, true, window, - 1, Module['canvas'].offsetLeft + x, Module['canvas'].offsetTop + y, Module['canvas'].offsetLeft + x, Module['canvas'].offsetTop + y, - 0, 0, 0, 0, - button, null); - Module['canvas'].dispatchEvent(event1); - var event2 = document.createEvent("MouseEvents"); - event2.initMouseEvent('mouseup', true, true, window, - 1, Module['canvas'].offsetLeft + x, Module['canvas'].offsetTop + y, Module['canvas'].offsetLeft + x, Module['canvas'].offsetTop + y, - 0, 0, 0, 0, - button, null); - Module['canvas'].dispatchEvent(event2); - } else { - var event1 = document.createEvent("MouseEvents"); - event1.initMouseEvent('mousemove', true, true, window, - 0, Module['canvas'].offsetLeft + x, Module['canvas'].offsetTop + y, Module['canvas'].offsetLeft + x, Module['canvas'].offsetTop + y, - 0, 0, 0, 0, - 0, null); - Module['canvas'].dispatchEvent(event1); - } - } - ''') - - self.btest_exit('test_sdl2_mouse.c', args=['-O2', '--minify=0', '--pre-js', 'pre.js', '-sUSE_SDL=2']) + self.btest_exit('test_sdl2_mouse.c', args=['-O2', '--minify=0', '--pre-js', test_file('browser/fake_events.js'), '-sUSE_SDL=2']) @requires_graphics_hardware def test_sdl2_mouse_offsets(self): - create_file('pre.js', ''' - globalThis.simulateMouseEvent = (x, y, button) => { - var event = document.createEvent("MouseEvents"); - if (button >= 0) { - var event1 = document.createEvent("MouseEvents"); - event1.initMouseEvent('mousedown', true, true, window, - 1, x, y, x, y, - 0, 0, 0, 0, - button, null); - Module['canvas'].dispatchEvent(event1); - var event2 = document.createEvent("MouseEvents"); - event2.initMouseEvent('mouseup', true, true, window, - 1, x, y, x, y, - 0, 0, 0, 0, - button, null); - Module['canvas'].dispatchEvent(event2); - } else { - var event1 = document.createEvent("MouseEvents"); - event1.initMouseEvent('mousemove', true, true, window, - 0, x, y, x, y, - 0, 0, 0, 0, - 0, null); - Module['canvas'].dispatchEvent(event1); - } - } - ''') create_file('page.html', ''' @@ -3080,7 +2906,7 @@ def test_sdl2_mouse_offsets(self): ''') - self.compile_btest('browser/test_sdl2_mouse.c', ['-DTEST_SDL_MOUSE_OFFSETS=1', '-O2', '--minify=0', '-o', 'sdl2_mouse.js', '--pre-js', 'pre.js', '-sUSE_SDL=2', '-sEXIT_RUNTIME']) + self.compile_btest('browser/test_sdl2_mouse.c', ['-DTEST_SDL_MOUSE_OFFSETS=1', '-O2', '--minify=0', '-o', 'sdl2_mouse.js', '--pre-js', test_file('browser/fake_events.js'), '-sUSE_SDL=2', '-sEXIT_RUNTIME']) self.run_browser('page.html', '', '/report_result?exit:0') def test_sdl2_threads(self): @@ -3150,13 +2976,7 @@ def test_sdl2_canvas_proxy(self): def test_sdl2_pumpevents(self): # key events should be detected using SDL_PumpEvents - create_file('pre.js', ''' - function keydown(keyCode, code) { - var event = new KeyboardEvent('keydown', { keyCode, code, charCode: keyCode, view: window, bubbles: true, cancelable: true }); - document.dispatchEvent(event); - } - ''') - self.btest_exit('test_sdl2_pumpevents.c', args=['--pre-js', 'pre.js', '-sUSE_SDL=2']) + self.btest_exit('test_sdl2_pumpevents.c', args=['--pre-js', test_file('browser/fake_events.js'), '-sUSE_SDL=2']) def test_sdl2_timer(self): self.btest_exit('test_sdl2_timer.c', args=['-sUSE_SDL=2'])