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']):