mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-05-17 16:42:54 +00:00
LibCore: Fix broken "stay_within" mechanism in event dispatch
The "stay_within" parameter to CObject::dispatch_event() optionally specifies a node in the CObject parent chain where event dispatch should stop bubbling upwards. Since event dispatch is done recursively, this was not working right, as we would simply return from the innermost dispatch loop, leaving the event un-accepted, which meant that the penultimately inner dispatch loop would pick up the event and keep bubbling it anyway. This made it possible for events to jump across window boundaries within an application, in cases where one window was a CObject ancestor of another window. This is typically the case with dialog windows. Fix #1078.
This commit is contained in:
parent
a5e482833d
commit
72d68b4025
Notes:
sideshowbarker
2024-07-19 09:54:31 +09:00
Author: https://github.com/awesomekling
Commit: 72d68b4025
1 changed files with 5 additions and 0 deletions
|
@ -189,6 +189,11 @@ void CObject::dispatch_event(CEvent& e, CObject* stay_within)
|
|||
do {
|
||||
target->event(e);
|
||||
target = target->parent();
|
||||
if (target == stay_within) {
|
||||
// Prevent the event from bubbling any further.
|
||||
e.accept();
|
||||
break;
|
||||
}
|
||||
} while (target && target != stay_within && !e.is_accepted());
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue