aboutsummaryrefslogtreecommitdiff
path: root/src/llvm_backend_const.cpp
diff options
context:
space:
mode:
authorJonathan Tron <jonathan@tron.name>2025-03-20 16:43:49 +0100
committerJonathan Tron <jonathan@tron.name>2025-03-20 16:43:49 +0100
commitdbe53d053a2d82c3e58755ece855496dc7389544 (patch)
tree93e10559004809d2c49af3fb4d0b4aa8d4c072f0 /src/llvm_backend_const.cpp
parent0f01b34b382a573ef4077d01b1ded91c51c7f00e (diff)
Fix add/remove event listeners in `core:sys/wasm`
There were multiple issues here: 1. listeners stored in the same key overwriting the previous one 2. missing `use_capture` parameter in `remove_event_listener`/`remove_window_event_listener` The key used to store the listener function in `listenerMap` was a javascript `Object`, when used as a key it was thus serialized to the string `"[object Object]"`, meaning all listeners where effectively set to the same key when calling `add_event_listener`/`add_window_event_listener`. Later on when calling `remove_event_listener`/`remove_window_event_listener`, it then tried to remove the incorrect one or none at all if there was a mix of the same event name registered on an element or the window. To fix I implemented a function `listener_key` in the javascript code which will generate a different key based on the event's: - `id`: dom element's id or 'window' (when event listener added to the window) - `name`: the event name (eg: `click`), each event handler should be removed for the event name it was register on. - `data`: we can register events with different data, each one generate a new listener which has to be removed. - `callback`: same as `data`, if you register two similar handler but with two different callback, each one should be removed. - `useCapture`: this one is a bit tricky, but when you register an event handler in javascript, if you don't pass `useCapture`, it defaults to `false`. When you remove an handler, you have to pass the exact same `useCapture` option you registered it with. In this case, we allowed to register an event with different `useCapture`, but didn't allow to pass the `useCapture` when removing it. We always called `removeEventListener` without the `useCapture` parameter which removed the handler properly only when it was registered with `useCapture=false`. I also switched the `WasmMemoryInterface.listenerMap` from `{}` (javascript object) to a `new Map()`, which is available everywhere nowadays.
Diffstat (limited to 'src/llvm_backend_const.cpp')
0 files changed, 0 insertions, 0 deletions