Skip to content

Commit ccdcdbc

Browse files
committed
Fix: Memory leak in blob files when browsing extremely quickly while reading
1 parent 9bf7d4b commit ccdcdbc

5 files changed

Lines changed: 13 additions & 6 deletions

File tree

‎CHANGELOG.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
1414
- Asynchronous progress check in the context menu (Mark as read/unread) [`ca51b12`](https://github.com/ollm/OpenComic/commit/ca51b122372c89b4414572b31f7bf05ac7800c22)
1515
- The application loops and freezes when opening files on the network (UNC paths) [`7ca4d20`](https://github.com/ollm/OpenComic/commit/7ca4d200730d5b2814e24cad4b34969ab38a2857)
1616
- Prevent concurrent reads of the same file [`cefa1c5`](https://github.com/ollm/OpenComic/commit/cefa1c552309a27e04ec6c6c5b7d2549028eeed5)
17+
- Memory leak in blob files when browsing extremely quickly while reading
1718

1819
## [v1.6.2](https://github.com/ollm/OpenComic/releases/tag/v1.6.2) (08-09-2025)
1920

‎scripts/dom.js‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -566,6 +566,7 @@ async function loadIndexPage(animation = true, path = false, content = false, ke
566566
onReading = _onReading = false;
567567

568568
fileManager.revokeAllObjectURL();
569+
reading.render.revokeAllObjectURL();
569570
workers.clean('convertImageToBlob');
570571

571572
scroll.reset();
@@ -1283,7 +1284,7 @@ function compressedError(error, showInPage = true, snackbarKey = '', path = fals
12831284
});
12841285

12851286
if(path)
1286-
console.warn('%cError loading compressed file %c'+path+'%c: '+message, '', 'color: #cc0000;', '');
1287+
console.warn('%cError when unzipping %c'+path+'%c: '+message, '', 'color: #cc0000;', '');
12871288
}
12881289
}
12891290

@@ -2670,6 +2671,7 @@ var readingActive = false, skipNextComic = false, skipPreviousComic = false;
26702671
async function openComic(animation = true, path = true, mainPath = true, end = false, fromGoBack = false, fromNextAndPrev = false)
26712672
{
26722673
fileManager.revokeAllObjectURL();
2674+
reading.render.revokeAllObjectURL();
26732675
workers.clean('convertImageToBlob');
26742676

26752677
dom.setCurrentPageVars('reading');

‎scripts/file-manager.js‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2419,7 +2419,7 @@ var fileCompressed = function(path, _realPath = false, forceType = false, prefix
24192419

24202420
this.setFileStatus(file, {rendered: true, widthRendered: this.config.width});
24212421

2422-
return {blob: URL.createObjectURL(blob), width: viewport.width, height: viewport.height};
2422+
return {blob: URL.createObjectURL(blob), width: viewport.width, height: viewport.height, size: blob.size};
24232423
}
24242424

24252425
return false;
@@ -3637,7 +3637,7 @@ function revokeObjectURL(path)
36373637
}
36383638

36393639
function revokeAllObjectURL()
3640-
{
3640+
{
36413641
for(let key in blobObjectsURL)
36423642
{
36433643
URL.revokeObjectURL(blobObjectsURL[key]);

‎scripts/image.js‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ async function resizeToBlob(fromImage, config = {})
163163
// URL.createObjectURL(resizedBlob)
164164
// URL.revokeObjectURL();
165165

166-
resolve({blob: URL.createObjectURL(blob), info: info});
166+
resolve({blob: URL.createObjectURL(blob), info: info, size: blob.size});
167167
}
168168

169169
});

‎scripts/reading/render.js‎

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,9 @@ async function focusIndex(index, doublePage = false)
216216

217217
function revokeAllObjectURL()
218218
{
219+
// const total = renderedObjectsURL.reduce((acc, o) => acc + o.data.size, 0);
220+
// console.log(`Total blob payload megabytes: ${(total / (1024 * 1024)).toFixed(2)} MB in ${renderedObjectsURL.length} images`);
221+
219222
for(let i = 0, len = renderedObjectsURL.length; i < len; i++)
220223
{
221224
renderedObjectsURL[i].img.classList.remove('blobRendered');
@@ -426,7 +429,7 @@ async function render(index, _scale = false, magnifyingGlass = false, queueIndex
426429
if(name)
427430
{
428431
data = await file.renderBlob(name, _config);
429-
if(queueIndex !== queue.index('readingRender')) return; // Return if the queue is different
432+
if(queueIndex !== queue.index('readingRender')) return URL.revokeObjectURL(data.blob); // Return if the queue is different
430433

431434
img.src = data.blob;
432435
img.classList.add('blobRendered', 'blobRender', 'sizeFromImg');
@@ -479,7 +482,7 @@ async function render(index, _scale = false, magnifyingGlass = false, queueIndex
479482
try
480483
{
481484
let data = await image.resizeToBlob(src, _config);
482-
if(queueIndex !== queue.index('readingRender')) return; // Return if the queue is different
485+
if(queueIndex !== queue.index('readingRender')) return URL.revokeObjectURL(data.blob); // Return if the queue is different
483486

484487
img.src = data.blob;
485488
img.classList.add('blobRendered', 'blobRender');
@@ -608,5 +611,6 @@ module.exports = {
608611
resized: resized,
609612
setEbookConfigChanged: setEbookConfigChanged,
610613
setOnRender: setOnRender,
614+
revokeAllObjectURL: revokeAllObjectURL,
611615
get rendered() {return rendered},
612616
}

0 commit comments

Comments
 (0)