fix(core): always remove DOM listeners and stream subscriptions

This is needed to prevent memory leaks. The DOM
listeners don’t need to be removed for simple examples,
but a big internal app shows memory leaks because of them.

BREAKING CHANGE:
- `Renderer.listen` now has to return a function that
  removes the event listener.
This commit is contained in:
Tobias Bosch
2016-01-25 14:47:25 -08:00
parent 5f0baaac73
commit 0ae77753f3
15 changed files with 104 additions and 46 deletions
@@ -1267,7 +1267,7 @@ export function main() {
val.changeDetector.dehydrate();
expect(() => {val.changeDetector.detectChanges()})
.toThrowErrorWith("Attempt to detect changes on a dehydrated detector");
.toThrowErrorWith("Attempt to use a dehydrated detector");
expect(val.dispatcher.log).toEqual(['propName=Bob']);
});
});
@@ -877,13 +877,22 @@ function declareTests() {
var listener = tc.inject(DirectiveListeningEvent);
expect(listener.msg).toEqual('');
var eventCount = 0;
ObservableWrapper.subscribe(emitter.event, (_) => {
expect(listener.msg).toEqual('fired !');
async.done();
eventCount++;
if (eventCount === 1) {
expect(listener.msg).toEqual('fired !');
fixture.destroy();
emitter.fireEvent('fired again !');
} else {
expect(listener.msg).toEqual('fired !');
async.done();
}
});
emitter.fireEvent('fired !');
});
}));
@@ -961,6 +970,11 @@ function declareTests() {
.toEqual(
['domEvent', 'body_domEvent', 'document_domEvent', 'window_domEvent']);
fixture.destroy();
listener.eventTypes = [];
dispatchEvent(tc.nativeElement, 'domEvent');
expect(listener.eventTypes).toEqual([]);
async.done();
});
}));