Skip to content

Commit 48ad645

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

File tree

1 file changed

+24
-6
lines changed

1 file changed

+24
-6
lines changed

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

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,19 +37,37 @@ 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+
dispose() {
57+
const tracks = this.options_.tracks;
58+
59+
tracks.removeEventListener('removetrack', this.updateHandler_);
60+
tracks.removeEventListener('addtrack', this.updateHandler_);
61+
tracks.removeEventListener('labelchange', this.updateHandler_);
62+
63+
this.player_.off('ready', this.updateHandler_);
64+
this.player_.off('dispose', this.disposeHandler_);
65+
66+
delete this.updateHandler_;
67+
delete this.disposeHandler_;
68+
69+
super.dispose();
70+
}
5371
}
5472

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

0 commit comments

Comments
 (0)