Skip to content

Commit 1496c83

Browse files
dmitrylyzoTheOneric
authored andcommitted
js: remove event listeners
Remove all listeners so that the octopus is not reachable from the window, to fix a memory leak. Cherry-picked from: jellyfin@701e129 Fixes: #97
1 parent 5b42203 commit 1496c83

1 file changed

Lines changed: 79 additions & 27 deletions

File tree

src/subtitles-octopus.js

Lines changed: 79 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -166,32 +166,57 @@ var SubtitlesOctopus = function (options) {
166166
}
167167
};
168168

169+
function onTimeUpdate() {
170+
self.setCurrentTime(self.video.currentTime + self.timeOffset);
171+
};
172+
173+
function onPlaying() {
174+
self.setIsPaused(false, self.video.currentTime + self.timeOffset);
175+
}
176+
177+
function onPause() {
178+
self.setIsPaused(true, self.video.currentTime + self.timeOffset);
179+
}
180+
181+
function onSeeking() {
182+
self.video.removeEventListener('timeupdate', onTimeUpdate, false);
183+
}
184+
185+
function onSeeked() {
186+
self.video.addEventListener('timeupdate', onTimeUpdate, false);
187+
188+
var currentTime = self.video.currentTime + self.timeOffset;
189+
190+
self.setCurrentTime(currentTime);
191+
192+
if (self.renderAhead > 0) {
193+
_cleanPastRendered(currentTime, true);
194+
}
195+
}
196+
197+
function onRateChange() {
198+
self.setRate(self.video.playbackRate);
199+
}
200+
201+
function onWaiting() {
202+
self.setIsPaused(true, self.video.currentTime + self.timeOffset);
203+
}
204+
205+
function onLoadedMetadata(e) {
206+
e.target.removeEventListener(e.type, onLoadedMetadata, false);
207+
self.resize();
208+
}
209+
169210
self.setVideo = function (video) {
170211
self.video = video;
171212
if (self.video) {
172-
var timeupdate = function () {
173-
self.setCurrentTime(video.currentTime + self.timeOffset);
174-
}
175-
self.video.addEventListener("timeupdate", timeupdate, false);
176-
self.video.addEventListener("playing", function () {
177-
self.setIsPaused(false, video.currentTime + self.timeOffset);
178-
}, false);
179-
self.video.addEventListener("pause", function () {
180-
self.setIsPaused(true, video.currentTime + self.timeOffset);
181-
}, false);
182-
self.video.addEventListener("seeking", function () {
183-
self.video.removeEventListener("timeupdate", timeupdate);
184-
}, false);
185-
self.video.addEventListener("seeked", function () {
186-
self.video.addEventListener("timeupdate", timeupdate, false);
187-
self.setCurrentTime(video.currentTime + self.timeOffset);
188-
}, false);
189-
self.video.addEventListener("ratechange", function () {
190-
self.setRate(video.playbackRate);
191-
}, false);
192-
self.video.addEventListener("waiting", function () {
193-
self.setIsPaused(true, video.currentTime + self.timeOffset);
194-
}, false);
213+
self.video.addEventListener('timeupdate', onTimeUpdate, false);
214+
self.video.addEventListener('playing', onPlaying, false);
215+
self.video.addEventListener('pause', onPause, false);
216+
self.video.addEventListener('seeking', onSeeking, false);
217+
self.video.addEventListener('seeked', onSeeked, false);
218+
self.video.addEventListener('ratechange', onRateChange, false);
219+
self.video.addEventListener('waiting', onWaiting, false);
195220

196221
document.addEventListener("fullscreenchange", self.resizeWithTimeout, false);
197222
document.addEventListener("mozfullscreenchange", self.resizeWithTimeout, false);
@@ -209,10 +234,7 @@ var SubtitlesOctopus = function (options) {
209234
self.resize();
210235
}
211236
else {
212-
self.video.addEventListener("loadedmetadata", function listener(e) {
213-
e.target.removeEventListener(e.type, listener);
214-
self.resize();
215-
}, false);
237+
self.video.addEventListener('loadedmetadata', onLoadedMetadata, false);
216238
}
217239
}
218240
};
@@ -549,11 +571,41 @@ var SubtitlesOctopus = function (options) {
549571
});
550572

551573
self.worker.terminate();
574+
self.worker.removeEventListener('message', self.onWorkerMessage);
575+
self.worker.removeEventListener('error', self.workerError);
552576
self.workerActive = false;
577+
self.worker = null;
578+
553579
// Remove the canvas element to remove residual subtitles rendered on player
554580
if (self.video) {
581+
self.video.removeEventListener('timeupdate', onTimeUpdate, false);
582+
self.video.removeEventListener('playing', onPlaying, false);
583+
self.video.removeEventListener('pause', onPause, false);
584+
self.video.removeEventListener('seeking', onSeeking, false);
585+
self.video.removeEventListener('seeked', onSeeked, false);
586+
self.video.removeEventListener('ratechange', onRateChange, false);
587+
self.video.removeEventListener('waiting', onWaiting, false);
588+
self.video.removeEventListener('loadedmetadata', onLoadedMetadata, false);
589+
590+
document.removeEventListener('fullscreenchange', self.resizeWithTimeout, false);
591+
document.removeEventListener('mozfullscreenchange', self.resizeWithTimeout, false);
592+
document.removeEventListener('webkitfullscreenchange', self.resizeWithTimeout, false);
593+
document.removeEventListener('msfullscreenchange', self.resizeWithTimeout, false);
594+
window.removeEventListener('resize', self.resizeWithTimeout, false);
595+
555596
self.video.parentNode.removeChild(self.canvasParent);
597+
598+
self.video = null;
556599
}
600+
601+
if (self.ro) {
602+
self.ro.disconnect();
603+
self.ro = null;
604+
}
605+
606+
self.onCustomMessage = null;
607+
self.onErrorEvent = null;
608+
self.onReadyEvent = null;
557609
};
558610

559611
self.fetchFromWorker = function (workerOptions, onSuccess, onError) {

0 commit comments

Comments
 (0)