mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-01-10 23:44:24 +00:00
ListenerList: Fix a bug where removing a listener during a callback in which it had also been added prevents other listeners from being called
This commit is contained in:
parent
43762c7575
commit
06fb8f4ea2
2 changed files with 46 additions and 11 deletions
|
|
@ -135,7 +135,8 @@ public:
|
|||
{
|
||||
for (auto* it : *iterators)
|
||||
{
|
||||
--it->end;
|
||||
if (index < it->end)
|
||||
--it->end;
|
||||
|
||||
if (index <= it->index)
|
||||
--it->index;
|
||||
|
|
|
|||
|
|
@ -431,25 +431,59 @@ public:
|
|||
ListenerList<Listener> listeners;
|
||||
expect (listeners.size() == 0);
|
||||
|
||||
Listener listener;
|
||||
listeners.add (&listener);
|
||||
expect (listeners.size() == 1);
|
||||
Listener listener1;
|
||||
Listener listener2;
|
||||
listeners.add (&listener1);
|
||||
listeners.add (&listener2);
|
||||
expect (listeners.size() == 2);
|
||||
|
||||
bool listenerCalled = false;
|
||||
int numberOfCallbacks = 0;
|
||||
|
||||
listeners.call ([&] (auto& l)
|
||||
{
|
||||
listeners.remove (&l);
|
||||
expect (listeners.size() == 0);
|
||||
|
||||
listeners.add (&l);
|
||||
expect (listeners.size() == 1);
|
||||
|
||||
listenerCalled = true;
|
||||
listeners.add (&l);
|
||||
expect (listeners.size() == 2);
|
||||
|
||||
++numberOfCallbacks;
|
||||
});
|
||||
|
||||
expect (listenerCalled);
|
||||
expect (listeners.size() == 1);
|
||||
expect (numberOfCallbacks == 2);
|
||||
expect (listeners.size() == 2);
|
||||
}
|
||||
|
||||
beginTest ("Add and remove a nested listener");
|
||||
{
|
||||
struct Listener{};
|
||||
|
||||
ListenerList<Listener> listeners;
|
||||
expect (listeners.size() == 0);
|
||||
|
||||
Listener listener1;
|
||||
Listener listener2;
|
||||
listeners.add (&listener1);
|
||||
listeners.add (&listener2);
|
||||
expect (listeners.size() == 2);
|
||||
|
||||
int numberOfCallbacks = 0;
|
||||
|
||||
listeners.call ([&] (auto)
|
||||
{
|
||||
Listener nestedListener;
|
||||
|
||||
listeners.add (&nestedListener);
|
||||
expect (listeners.size() == 3);
|
||||
|
||||
listeners.remove (&nestedListener);
|
||||
expect (listeners.size() == 2);
|
||||
|
||||
++numberOfCallbacks;
|
||||
});
|
||||
|
||||
expect (numberOfCallbacks == 2);
|
||||
expect (listeners.size() == 2);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue