Skip to content

Commit c374ab7

Browse files
committed
fix(track-button): remove event listeners on dispose to prevent leaks
1 parent 8e4ec97 commit c374ab7

File tree

1 file changed

+26
-6
lines changed

1 file changed

+26
-6
lines changed

src/js/control-bar/track-button.js

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,19 +37,39 @@ class TrackButton extends MenuButton {
3737
}
3838

3939
const updateHandler = Fn.bind_(this, this.update);
40+
const disposeHandler = Fn.bind_(this, this.dispose);
41+
42+
// keep references to the event handlers so subclasses / callers can remove listeners if they dispose the component
43+
this.updateHandler_ = updateHandler;
44+
this.disposeHandler_ = disposeHandler;
4045

4146
tracks.addEventListener('removetrack', updateHandler);
4247
tracks.addEventListener('addtrack', updateHandler);
4348
tracks.addEventListener('labelchange', updateHandler);
4449
this.player_.on('ready', updateHandler);
45-
46-
this.player_.on('dispose', function() {
47-
tracks.removeEventListener('removetrack', updateHandler);
48-
tracks.removeEventListener('addtrack', updateHandler);
49-
tracks.removeEventListener('labelchange', updateHandler);
50-
});
50+
this.player_.on('dispose', disposeHandler);
5151
}
5252

53+
/**
54+
* Dispose of the Component and remove all event listeners
55+
*
56+
* @override
57+
*/
58+
dispose() {
59+
const tracks = this.options_.tracks;
60+
61+
tracks.removeEventListener('removetrack', this.updateHandler_);
62+
tracks.removeEventListener('addtrack', this.updateHandler_);
63+
tracks.removeEventListener('labelchange', this.updateHandler_);
64+
65+
this.player_.off('ready', this.updateHandler_);
66+
this.player_.off('dispose', this.disposeHandler_);
67+
68+
delete this.updateHandler_;
69+
delete this.disposeHandler_;
70+
71+
super.dispose();
72+
}
5373
}
5474

5575
Component.registerComponent('TrackButton', TrackButton);

0 commit comments

Comments
 (0)