Skip to content

Commit c7e5cbb

Browse files
committed
Null inline class JavaScript Event callback properties on destroy
1 parent cd12094 commit c7e5cbb

File tree

7 files changed

+45
-52
lines changed

7 files changed

+45
-52
lines changed

src/controller/base-stream-controller.ts

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,6 @@ export default class BaseStreamController
9797
protected startFragRequested: boolean = false;
9898
protected decrypter: Decrypter;
9999
protected initPTS: RationalTimestamp[] = [];
100-
protected onvseeking: EventListener | null = null;
101-
protected onvended: EventListener | null = null;
102100

103101
private readonly logPrefix: string = '';
104102
protected log: (msg: any) => void;
@@ -197,10 +195,8 @@ export default class BaseStreamController
197195
data: MediaAttachedData,
198196
) {
199197
const media = (this.media = this.mediaBuffer = data.media);
200-
this.onvseeking = this.onMediaSeeking.bind(this) as EventListener;
201-
this.onvended = this.onMediaEnded.bind(this) as EventListener;
202-
media.addEventListener('seeking', this.onvseeking);
203-
media.addEventListener('ended', this.onvended);
198+
media.addEventListener('seeking', this.onMediaSeeking);
199+
media.addEventListener('ended', this.onMediaEnded);
204200
const config = this.config;
205201
if (this.levels && config.autoStartLoad && this.state === State.STOPPED) {
206202
this.startLoad(config.startPosition);
@@ -215,10 +211,9 @@ export default class BaseStreamController
215211
}
216212

217213
// remove video listeners
218-
if (media && this.onvseeking && this.onvended) {
219-
media.removeEventListener('seeking', this.onvseeking);
220-
media.removeEventListener('ended', this.onvended);
221-
this.onvseeking = this.onvended = null;
214+
if (media) {
215+
media.removeEventListener('seeking', this.onMediaSeeking);
216+
media.removeEventListener('ended', this.onMediaEnded);
222217
}
223218
if (this.keyLoader) {
224219
this.keyLoader.detach();
@@ -229,7 +224,7 @@ export default class BaseStreamController
229224
this.stopLoad();
230225
}
231226

232-
protected onMediaSeeking() {
227+
protected onMediaSeeking = () => {
233228
const { config, fragCurrent, media, mediaBuffer, state } = this;
234229
const currentTime: number = media ? media.currentTime : 0;
235230
const bufferInfo = BufferHelper.bufferInfo(
@@ -292,12 +287,12 @@ export default class BaseStreamController
292287

293288
// Async tick to speed up processing
294289
this.tickImmediate();
295-
}
290+
};
296291

297-
protected onMediaEnded() {
292+
protected onMediaEnded = () => {
298293
// reset startPosition and lastCurrentTime to restart playback @ stream beginning
299294
this.startPosition = this.lastCurrentTime = 0;
300-
}
295+
};
301296

302297
protected onManifestLoaded(
303298
event: Events.MANIFEST_LOADED,
@@ -312,7 +307,7 @@ export default class BaseStreamController
312307
this.stopLoad();
313308
super.onHandlerDestroying();
314309
// @ts-ignore
315-
this.hls = null;
310+
this.hls = this.onMediaSeeking = this.onMediaEnded = null;
316311
}
317312

318313
protected onHandlerDestroyed() {

src/controller/buffer-controller.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,12 @@ export default class BufferController implements ComponentAPI {
110110
this.lastMpegAudioChunk = null;
111111
// @ts-ignore
112112
this.hls = null;
113+
// @ts-ignore
114+
this._onMediaSourceOpen = this._onMediaSourceClose = null;
115+
// @ts-ignore
116+
this._onMediaSourceEnded = null;
117+
// @ts-ignore
118+
this._onStartStreaming = this._onEndStreaming = null;
113119
}
114120

115121
protected registerListeners() {

src/controller/eme-controller.ts

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,6 @@ class EMEController implements ComponentAPI {
9090
private setMediaKeysQueue: Promise<void>[] = EMEController.CDMCleanupPromise
9191
? [EMEController.CDMCleanupPromise]
9292
: [];
93-
private onMediaEncrypted = this._onMediaEncrypted.bind(this);
94-
private onWaitingForKey = this._onWaitingForKey.bind(this);
9593

9694
private debug: (msg: any) => void = logger.debug.bind(logger, LOGGER_PREFIX);
9795
private log: (msg: any) => void = logger.log.bind(logger, LOGGER_PREFIX);
@@ -113,13 +111,9 @@ class EMEController implements ComponentAPI {
113111
config.licenseXhrSetup = config.licenseResponseCallback = undefined;
114112
config.drmSystems = config.drmSystemOptions = {};
115113
// @ts-ignore
116-
this.hls =
117-
this.onMediaEncrypted =
118-
this.onWaitingForKey =
119-
this.keyIdToKeySessionPromise =
120-
null as any;
114+
this.hls = this.config = this.keyIdToKeySessionPromise = null;
121115
// @ts-ignore
122-
this.config = null;
116+
this.onMediaEncrypted = this.onWaitingForKey = null;
123117
}
124118

125119
private registerListeners() {
@@ -523,7 +517,7 @@ class EMEController implements ComponentAPI {
523517
return this.attemptKeySystemAccess(keySystemsToAttempt);
524518
}
525519

526-
private _onMediaEncrypted(event: MediaEncryptedEvent) {
520+
private onMediaEncrypted = (event: MediaEncryptedEvent) => {
527521
const { initDataType, initData } = event;
528522
this.debug(`"${event.type}" event: init data type: "${initDataType}"`);
529523

@@ -639,11 +633,11 @@ class EMEController implements ComponentAPI {
639633
);
640634
}
641635
keySessionContextPromise.catch((error) => this.handleError(error));
642-
}
636+
};
643637

644-
private _onWaitingForKey(event: Event) {
638+
private onWaitingForKey = (event: Event) => {
645639
this.log(`"${event.type}" event`);
646-
}
640+
};
647641

648642
private attemptSetMediaKeys(
649643
keySystem: KeySystems,

src/controller/latency-controller.ts

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ export default class LatencyController implements ComponentAPI {
1919
private currentTime: number = 0;
2020
private stallCount: number = 0;
2121
private _latency: number | null = null;
22-
private timeupdateHandler = () => this.timeupdate();
2322

2423
constructor(hls: Hls) {
2524
this.hls = hls;
@@ -126,7 +125,7 @@ export default class LatencyController implements ComponentAPI {
126125
this.onMediaDetaching();
127126
this.levelDetails = null;
128127
// @ts-ignore
129-
this.hls = this.timeupdateHandler = null;
128+
this.hls = this.onTimeupdate = null;
130129
}
131130

132131
private registerListeners() {
@@ -150,12 +149,12 @@ export default class LatencyController implements ComponentAPI {
150149
data: MediaAttachingData,
151150
) {
152151
this.media = data.media;
153-
this.media.addEventListener('timeupdate', this.timeupdateHandler);
152+
this.media.addEventListener('timeupdate', this.onTimeupdate);
154153
}
155154

156155
private onMediaDetaching() {
157156
if (this.media) {
158-
this.media.removeEventListener('timeupdate', this.timeupdateHandler);
157+
this.media.removeEventListener('timeupdate', this.onTimeupdate);
159158
this.media = null;
160159
}
161160
}
@@ -172,10 +171,10 @@ export default class LatencyController implements ComponentAPI {
172171
) {
173172
this.levelDetails = details;
174173
if (details.advanced) {
175-
this.timeupdate();
174+
this.onTimeupdate();
176175
}
177176
if (!details.live && this.media) {
178-
this.media.removeEventListener('timeupdate', this.timeupdateHandler);
177+
this.media.removeEventListener('timeupdate', this.onTimeupdate);
179178
}
180179
}
181180

@@ -191,7 +190,7 @@ export default class LatencyController implements ComponentAPI {
191190
}
192191
}
193192

194-
private timeupdate() {
193+
private onTimeupdate = () => {
195194
const { media, levelDetails } = this;
196195
if (!media || !levelDetails) {
197196
return;
@@ -242,7 +241,7 @@ export default class LatencyController implements ComponentAPI {
242241
} else if (media.playbackRate !== 1 && media.playbackRate !== 0) {
243242
media.playbackRate = 1;
244243
}
245-
}
244+
};
246245

247246
private estimateLiveEdge(): number | null {
248247
const { levelDetails } = this;

src/controller/stream-controller.ts

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,6 @@ export default class StreamController
4949
private altAudio: boolean = false;
5050
private audioOnly: boolean = false;
5151
private fragPlaying: Fragment | null = null;
52-
private onvplaying: EventListener | null = null;
53-
private onvseeked: EventListener | null = null;
5452
private fragLastKbps: number = 0;
5553
private couldBacktrack: boolean = false;
5654
private backtrackFragment: Fragment | null = null;
@@ -117,6 +115,8 @@ export default class StreamController
117115

118116
protected onHandlerDestroying() {
119117
this._unregisterListeners();
118+
// @ts-ignore
119+
this.onMediaPlaying = this.onMediaSeeked = null;
120120
super.onHandlerDestroying();
121121
}
122122

@@ -515,10 +515,8 @@ export default class StreamController
515515
) {
516516
super.onMediaAttached(event, data);
517517
const media = data.media;
518-
this.onvplaying = this.onMediaPlaying.bind(this);
519-
this.onvseeked = this.onMediaSeeked.bind(this);
520-
media.addEventListener('playing', this.onvplaying as EventListener);
521-
media.addEventListener('seeked', this.onvseeked as EventListener);
518+
media.addEventListener('playing', this.onMediaPlaying);
519+
media.addEventListener('seeked', this.onMediaSeeked);
522520
this.gapController = new GapController(
523521
this.config,
524522
media,
@@ -529,10 +527,9 @@ export default class StreamController
529527

530528
protected onMediaDetaching() {
531529
const { media } = this;
532-
if (media && this.onvplaying && this.onvseeked) {
533-
media.removeEventListener('playing', this.onvplaying);
534-
media.removeEventListener('seeked', this.onvseeked);
535-
this.onvplaying = this.onvseeked = null;
530+
if (media) {
531+
media.removeEventListener('playing', this.onMediaPlaying);
532+
media.removeEventListener('seeked', this.onMediaSeeked);
536533
this.videoBuffer = null;
537534
}
538535
this.fragPlaying = null;
@@ -543,12 +540,12 @@ export default class StreamController
543540
super.onMediaDetaching();
544541
}
545542

546-
private onMediaPlaying() {
543+
private onMediaPlaying = () => {
547544
// tick to speed up FRAG_CHANGED triggering
548545
this.tick();
549-
}
546+
};
550547

551-
private onMediaSeeked() {
548+
private onMediaSeeked = () => {
552549
const media = this.media;
553550
const currentTime = media ? media.currentTime : null;
554551
if (Number.isFinite(currentTime)) {
@@ -568,7 +565,7 @@ export default class StreamController
568565

569566
// tick to speed up FRAG_CHANGED triggering
570567
this.tick();
571-
}
568+
};
572569

573570
private onManifestLoading() {
574571
// reset buffer on manifest loading

src/controller/subtitle-track-controller.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,12 @@ class SubtitleTrackController extends BasePlaylistController {
3535
private currentTrack: MediaPlaylist | null = null;
3636
private selectDefaultTrack: boolean = true;
3737
private queuedDefaultTrack: number = -1;
38-
private asyncPollTrackChange: () => void = () => this.pollTrackChange(0);
3938
private useTextTrackPolling: boolean = false;
4039
private subtitlePollingInterval: number = -1;
4140
private _subtitleDisplay: boolean = true;
4241

42+
private asyncPollTrackChange = () => this.pollTrackChange(0);
43+
4344
constructor(hls: Hls) {
4445
super(hls, '[subtitle-track-controller]');
4546
this.registerListeners();
@@ -50,7 +51,8 @@ class SubtitleTrackController extends BasePlaylistController {
5051
this.tracks.length = 0;
5152
this.tracksInGroup.length = 0;
5253
this.currentTrack = null;
53-
this.onTextTracksChanged = this.asyncPollTrackChange = null as any;
54+
// @ts-ignore
55+
this.onTextTracksChanged = this.asyncPollTrackChange = null;
5456
super.destroy();
5557
}
5658

tests/unit/controller/latency-controller.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ describe('LatencyController', function () {
7979
currentTimeStub.get(() => currentTime);
8080
currentTimeStub.set((value: number) => {
8181
currentTime = value;
82-
latencyController['timeupdate']();
82+
latencyController['onTimeupdate']();
8383
});
8484
});
8585

0 commit comments

Comments
 (0)