From b75b4570caab84ea71449773716987b4dc750fe0 Mon Sep 17 00:00:00 2001 From: "Joseph C. Osborn" Date: Mon, 18 Nov 2024 18:58:44 -0800 Subject: [PATCH 1/4] Fix #22942 by falling back findCanvasEventTarget to findEventTarget, and fix default canvas lookup bug --- src/library_html5.js | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/library_html5.js b/src/library_html5.js index 0e2971e78f79d..88142bf5edb8d 100644 --- a/src/library_html5.js +++ b/src/library_html5.js @@ -344,7 +344,7 @@ var LibraryHTML5 = { }, #if OFFSCREENCANVAS_SUPPORT - $findCanvasEventTarget__deps: ['$GL', '$maybeCStringToJsString'], + $findCanvasEventTarget__deps: ['$GL', '$maybeCStringToJsString', "$findEventTarget"], $findCanvasEventTarget: (target) => { target = maybeCStringToJsString(target); @@ -362,13 +362,9 @@ var LibraryHTML5 = { return GL.offscreenCanvases[target.substr(1)] // Remove '#' prefix // If not found, if one is querying by using DOM tag name selector 'canvas', grab the first // OffscreenCanvas that we can find. - || (target == 'canvas' && Object.keys(GL.offscreenCanvases)[0]) + || (target == 'canvas' && Object.keys(GL.offscreenCanvases) && GL.offscreenCanvases[Object.keys(GL.offScreenCanvases)[0]]) // If that is not found either, query via the regular DOM selector. -#if PTHREADS - || (typeof document != 'undefined' && document.querySelector(target)); -#else - || document.querySelector(target); -#endif + || findEventTarget(target); }, #else $findCanvasEventTarget: '$findEventTarget', From b3b5ca66ae8436290278036dae70779e64a796d5 Mon Sep 17 00:00:00 2001 From: "Joseph C. Osborn" Date: Wed, 20 Nov 2024 17:08:53 -0800 Subject: [PATCH 2/4] Simplify lookup of "first offscreen canvas" --- src/library_html5.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/library_html5.js b/src/library_html5.js index 88142bf5edb8d..5020f1e5e2f4b 100644 --- a/src/library_html5.js +++ b/src/library_html5.js @@ -362,7 +362,7 @@ var LibraryHTML5 = { return GL.offscreenCanvases[target.substr(1)] // Remove '#' prefix // If not found, if one is querying by using DOM tag name selector 'canvas', grab the first // OffscreenCanvas that we can find. - || (target == 'canvas' && Object.keys(GL.offscreenCanvases) && GL.offscreenCanvases[Object.keys(GL.offScreenCanvases)[0]]) + || (target == 'canvas' && Object.values(GL.offscreenCanvases)[0]) // If that is not found either, query via the regular DOM selector. || findEventTarget(target); }, From d89f1ddfa6721c6bc95c8284cb81242798c56e10 Mon Sep 17 00:00:00 2001 From: "Joseph C. Osborn" Date: Thu, 21 Nov 2024 11:24:35 -0800 Subject: [PATCH 3/4] Add test for findCanvasEventTarget's various cases --- src/library_html5.js | 2 +- .../html5_special_canvas_event_targets.cpp | 36 +++++++++++++++++++ test/test_browser.py | 12 +++++++ 3 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 test/browser/html5_special_canvas_event_targets.cpp diff --git a/src/library_html5.js b/src/library_html5.js index 5020f1e5e2f4b..b5edfcac40bee 100644 --- a/src/library_html5.js +++ b/src/library_html5.js @@ -363,7 +363,7 @@ var LibraryHTML5 = { // If not found, if one is querying by using DOM tag name selector 'canvas', grab the first // OffscreenCanvas that we can find. || (target == 'canvas' && Object.values(GL.offscreenCanvases)[0]) - // If that is not found either, query via the regular DOM selector. + // If that is not found either, query via the regular findEventTarget mechanism. || findEventTarget(target); }, #else diff --git a/test/browser/html5_special_canvas_event_targets.cpp b/test/browser/html5_special_canvas_event_targets.cpp new file mode 100644 index 0000000000000..442c8286f053d --- /dev/null +++ b/test/browser/html5_special_canvas_event_targets.cpp @@ -0,0 +1,36 @@ +// Copyright 2024 The Emscripten Authors. All rights reserved. +// Emscripten is available under two separate licenses, the MIT license and the +// University of Illinois/NCSA Open Source License. Both these licenses can be +// found in the LICENSE file. + +#include +#include +#include + +#include +#include + +const char *TARGETS[]={"!foovas", "#canvas", "canvas"}; +const char *target = TARGETS[WHICH_TARGET]; + +int main() +{ + EM_ASM({ + specialHTMLTargets["!foovas"] = Module.canvas; + }); + int w=0, h=0; + EMSCRIPTEN_RESULT res = emscripten_get_canvas_element_size(target, &w, &h); + assert(res == EMSCRIPTEN_RESULT_SUCCESS); + EmscriptenWebGLContextAttributes attrs; + emscripten_webgl_init_context_attributes(&attrs); + EMSCRIPTEN_WEBGL_CONTEXT_HANDLE context = emscripten_webgl_create_context(target, &attrs); + assert(context > 0); + res = emscripten_webgl_make_context_current(context); + assert(res == EMSCRIPTEN_RESULT_SUCCESS); + assert(emscripten_webgl_get_current_context() == context); + res = emscripten_get_canvas_element_size(target, &w, &h); + assert(res == EMSCRIPTEN_RESULT_SUCCESS); + res = emscripten_webgl_destroy_context(context); + assert(res == EMSCRIPTEN_RESULT_SUCCESS); + return 0; +} diff --git a/test/test_browser.py b/test/test_browser.py index 9c9085d219c70..2f5e74b69b26c 100644 --- a/test/test_browser.py +++ b/test/test_browser.py @@ -2618,6 +2618,18 @@ def test_html5_webgl_create_context2(self): def test_html5_special_event_targets(self): self.btest_exit('html5_special_event_targets.cpp', args=['-lGL']) + @parameterized({ + '': ([],), + 'offscreen_no_pthread': (['-sOFFSCREENCANVAS_SUPPORT'],), + 'offscreen_pthread': (['-sOFFSCREENCANVAS_SUPPORT', '-sPROXY_TO_PTHREAD', '-pthread'],), + }) + @requires_graphics_hardware + # Verify bug https://github.com/emscripten-core/emscripten/issues/22942: findCanvasEventTarget doesn't use specialHTMLTargets + def test_html5_special_canvas_event_targets(self, args): + self.btest_exit('html5_special_canvas_event_targets.cpp', args=args + ['-lGL', '-sDISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR=1', '-DWHICH_TARGET=0']) + self.btest_exit('html5_special_canvas_event_targets.cpp', args=args + ['-lGL', '-sDISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR=1', '-DWHICH_TARGET=1']) + self.btest_exit('html5_special_canvas_event_targets.cpp', args=args + ['-lGL', '-sDISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR=1', '-DWHICH_TARGET=2']) + @requires_graphics_hardware def test_html5_webgl_destroy_context(self): for opts in ([], ['-O2', '-g1'], ['-sFULL_ES2']): From 6b62c9cf5b22ed1127e8027207c366bd65f83f0f Mon Sep 17 00:00:00 2001 From: "Joseph C. Osborn" Date: Thu, 21 Nov 2024 12:06:17 -0800 Subject: [PATCH 4/4] Review remarks to simplify harness and test code --- ...gets.cpp => html5_special_canvas_event_targets.c} | 12 ++++-------- test/test_browser.py | 7 ++++--- 2 files changed, 8 insertions(+), 11 deletions(-) rename test/browser/{html5_special_canvas_event_targets.cpp => html5_special_canvas_event_targets.c} (78%) diff --git a/test/browser/html5_special_canvas_event_targets.cpp b/test/browser/html5_special_canvas_event_targets.c similarity index 78% rename from test/browser/html5_special_canvas_event_targets.cpp rename to test/browser/html5_special_canvas_event_targets.c index 442c8286f053d..aed0ef4a95b8b 100644 --- a/test/browser/html5_special_canvas_event_targets.cpp +++ b/test/browser/html5_special_canvas_event_targets.c @@ -10,25 +10,21 @@ #include #include -const char *TARGETS[]={"!foovas", "#canvas", "canvas"}; -const char *target = TARGETS[WHICH_TARGET]; - -int main() -{ +int main() { EM_ASM({ specialHTMLTargets["!foovas"] = Module.canvas; }); int w=0, h=0; - EMSCRIPTEN_RESULT res = emscripten_get_canvas_element_size(target, &w, &h); + EMSCRIPTEN_RESULT res = emscripten_get_canvas_element_size(TARGET, &w, &h); assert(res == EMSCRIPTEN_RESULT_SUCCESS); EmscriptenWebGLContextAttributes attrs; emscripten_webgl_init_context_attributes(&attrs); - EMSCRIPTEN_WEBGL_CONTEXT_HANDLE context = emscripten_webgl_create_context(target, &attrs); + EMSCRIPTEN_WEBGL_CONTEXT_HANDLE context = emscripten_webgl_create_context(TARGET, &attrs); assert(context > 0); res = emscripten_webgl_make_context_current(context); assert(res == EMSCRIPTEN_RESULT_SUCCESS); assert(emscripten_webgl_get_current_context() == context); - res = emscripten_get_canvas_element_size(target, &w, &h); + res = emscripten_get_canvas_element_size(TARGET, &w, &h); assert(res == EMSCRIPTEN_RESULT_SUCCESS); res = emscripten_webgl_destroy_context(context); assert(res == EMSCRIPTEN_RESULT_SUCCESS); diff --git a/test/test_browser.py b/test/test_browser.py index 2f5e74b69b26c..e0da5497cbec5 100644 --- a/test/test_browser.py +++ b/test/test_browser.py @@ -2626,9 +2626,10 @@ def test_html5_special_event_targets(self): @requires_graphics_hardware # Verify bug https://github.com/emscripten-core/emscripten/issues/22942: findCanvasEventTarget doesn't use specialHTMLTargets def test_html5_special_canvas_event_targets(self, args): - self.btest_exit('html5_special_canvas_event_targets.cpp', args=args + ['-lGL', '-sDISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR=1', '-DWHICH_TARGET=0']) - self.btest_exit('html5_special_canvas_event_targets.cpp', args=args + ['-lGL', '-sDISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR=1', '-DWHICH_TARGET=1']) - self.btest_exit('html5_special_canvas_event_targets.cpp', args=args + ['-lGL', '-sDISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR=1', '-DWHICH_TARGET=2']) + self.emcc_args += ['-lGL', '-sDISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR=1'] + self.btest_exit('html5_special_canvas_event_targets.c', args=args + ['-DTARGET="!foovas"']) + self.btest_exit('html5_special_canvas_event_targets.c', args=args + ['-DTARGET="#canvas"']) + self.btest_exit('html5_special_canvas_event_targets.c', args=args + ['-DTARGET="canvas"']) @requires_graphics_hardware def test_html5_webgl_destroy_context(self):