Skip to content

Commit

Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[BUGFIX lts] Remove all own listeners
Browse files Browse the repository at this point in the history
We were previously only removing own listeners if they were functions,
this PR updates us to always remove all of them.

(cherry picked from commit 96a832b)
Chris Garrett authored and rwjblue committed Jun 28, 2019
1 parent 5737ad9 commit 29ce881
Showing 2 changed files with 32 additions and 8 deletions.
12 changes: 4 additions & 8 deletions packages/@ember/-internals/meta/lib/meta.ts
Original file line number Diff line number Diff line change
@@ -588,14 +588,10 @@ export class Meta {
} as Listener);
} else {
let listener = listeners[i];
// If the listener is our own function listener and we are trying to
// remove it, we want to splice it out entirely so we don't hold onto a
// reference.
if (
kind === ListenerKind.REMOVE &&
listener.kind !== ListenerKind.REMOVE &&
typeof method === 'function'
) {

// If the listener is our own listener and we are trying to remove it, we
// want to splice it out entirely so we don't hold onto a reference.
if (kind === ListenerKind.REMOVE && listener.kind !== ListenerKind.REMOVE) {
listeners.splice(i, 1);
} else {
// update own listener
28 changes: 28 additions & 0 deletions packages/@ember/-internals/meta/tests/listeners_test.js
Original file line number Diff line number Diff line change
@@ -172,5 +172,33 @@ moduleFor(
'one reopen call after mutating parents and flattening out of order'
);
}

'@test removed listeners are removed from the underlying structure GH#1112213'(assert) {
// this is using private API to confirm the underlying data structure is properly maintained
// and should be changed to match the data structure as needed

class Class1 {}
let class1Meta = meta(Class1.prototype);
class1Meta.addToListeners('hello', null, 'm', 0);

let instance1 = new Class1();
let m1 = meta(instance1);

function listenerFunc() {}

m1.removeFromListeners('hello', null, 'm', 0);

m1.addToListeners('stringListener', null, 'm', 0);
m1.addToListeners('functionListener', null, listenerFunc, 0);

m1.removeFromListeners('functionListener', null, listenerFunc, 0);
m1.removeFromListeners('stringListener', null, 'm', 0);

assert.equal(
m1.flattenedListeners().length,
1,
'instance listeners correctly removed, inherited listeners remain'
);
}
}
);

0 comments on commit 29ce881

Please sign in to comment.