diff --git a/src/library_html5.js b/src/library_html5.js index b3357ef62fc92..d99ee7aeec8b4 100644 --- a/src/library_html5.js +++ b/src/library_html5.js @@ -345,7 +345,7 @@ var LibraryHTML5 = { }, #if OFFSCREENCANVAS_SUPPORT - $findCanvasEventTarget__deps: ['$GL', '$maybeCStringToJsString'], + $findCanvasEventTarget__deps: ['$GL', '$maybeCStringToJsString', "$findEventTarget"], $findCanvasEventTarget: (target) => { target = maybeCStringToJsString(target); @@ -363,13 +363,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]) - // 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 + || (target == 'canvas' && Object.values(GL.offscreenCanvases)[0]) + // If that is not found either, query via the regular findEventTarget mechanism. + || findEventTarget(target); }, #else $findCanvasEventTarget: '$findEventTarget', diff --git a/test/browser/html5_special_canvas_event_targets.c b/test/browser/html5_special_canvas_event_targets.c new file mode 100644 index 0000000000000..aed0ef4a95b8b --- /dev/null +++ b/test/browser/html5_special_canvas_event_targets.c @@ -0,0 +1,32 @@ +// 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 + +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 3d6f309d6a121..0efd382aa24db 100644 --- a/test/test_browser.py +++ b/test/test_browser.py @@ -2627,6 +2627,19 @@ def test_html5_webgl_create_context_swapcontrol(self, args): 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.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): for opts in ([], ['-O2', '-g1'], ['-sFULL_ES2']):