From f05e1c0c9a4d6666e14fbd8e884f34d4448959ed Mon Sep 17 00:00:00 2001 From: Abhishek-Jalkhare Date: Wed, 28 Oct 2026 17:14:43 +0530 Subject: [PATCH 1/3] fix(web): prevent Object URL memory leaks in laptop screen generator --- web/js/screens.js | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/web/js/screens.js b/web/js/screens.js index 57b63622..58314709 100644 --- a/web/js/screens.js +++ b/web/js/screens.js @@ -425,9 +425,28 @@ function syncColours() { function loadImage(file) { if (!file || !file.type.startsWith('image/')) return; + + if (state.imageUrl) { + URL.revokeObjectURL(state.imageUrl); + state.imageUrl = null; + } + + const url = URL.createObjectURL(file); + state.imageUrl = url; + const img = new Image(); - img.onload = () => { state.image = img; renderPreview(); }; - img.src = URL.createObjectURL(file); + img.onload = () => { + state.image = img; + renderPreview(); + }; + img.onerror = () => { + if (state.imageUrl === url) { + URL.revokeObjectURL(url); + state.imageUrl = null; + } + }; + img.src = url; + } function setSource(source) { From 0ab74d8a6fd8a9dab457ebfcf1a35cd50edca335 Mon Sep 17 00:00:00 2001 From: Abhishek-Jalkhare Date: Wed, 28 Oct 2026 17:32:35 +0530 Subject: [PATCH 2/3] fix(web): revoke object URL immediately on successful image load --- web/js/screens.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/web/js/screens.js b/web/js/screens.js index 58314709..b2c6be43 100644 --- a/web/js/screens.js +++ b/web/js/screens.js @@ -436,6 +436,10 @@ function loadImage(file) { const img = new Image(); img.onload = () => { + if (state.imageUrl === url) { + URL.revokeObjectURL(url); + state.imageUrl = null; + } state.image = img; renderPreview(); }; From 4683575b80c8a8cff7d9ad3ca133e829110d85d3 Mon Sep 17 00:00:00 2001 From: Abhishek-Jalkhare Date: Wed, 28 Oct 2026 17:43:49 +0530 Subject: [PATCH 3/3] fix(web): ignore stale image loads before updating preview --- web/js/screens.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/web/js/screens.js b/web/js/screens.js index b2c6be43..ee6fbd70 100644 --- a/web/js/screens.js +++ b/web/js/screens.js @@ -436,10 +436,10 @@ function loadImage(file) { const img = new Image(); img.onload = () => { - if (state.imageUrl === url) { - URL.revokeObjectURL(url); - state.imageUrl = null; - } + if (state.imageUrl !== url) return; + URL.revokeObjectURL(url); + state.imageUrl = null; + state.image = img; renderPreview(); };