Skip to content

Commit eb5dcd3

Browse files
authored
[Performance/Memory] Fix event listener leaks in Trash View and Block Context Menu (#5599)
* Manage click listeners to prevent duplicates * Forgot to Close trashViewClickHandler function
1 parent e4fbcf1 commit eb5dcd3

File tree

2 files changed

+23
-4
lines changed

2 files changed

+23
-4
lines changed

js/activity.js

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3948,18 +3948,30 @@ class Activity {
39483948
this._renderTrashView();
39493949
});
39503950

3951+
// Store the click handler reference for proper cleanup
3952+
let trashViewClickHandler = null;
3953+
39513954
// function to hide trashView from canvas
39523955
function handleClickOutsideTrashView(trashView) {
3956+
// Remove existing listener to prevent duplicates
3957+
if (trashViewClickHandler) {
3958+
document.removeEventListener("click", trashViewClickHandler);
3959+
}
3960+
39533961
let firstClick = true;
3954-
document.addEventListener("click", event => {
3962+
trashViewClickHandler = event => {
39553963
if (firstClick) {
39563964
firstClick = false;
39573965
return;
39583966
}
39593967
if (!trashView.contains(event.target) && event.target !== trashView) {
39603968
trashView.style.display = "none";
3969+
// Clean up listener when trashView is hidden
3970+
document.removeEventListener("click", trashViewClickHandler);
3971+
trashViewClickHandler = null;
39613972
}
3962-
});
3973+
};
3974+
document.addEventListener("click", trashViewClickHandler);
39633975
}
39643976

39653977
this._renderTrashView = () => {

js/piemenus.js

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3610,13 +3610,20 @@ const piemenuBlockContext = block => {
36103610
docById("contextWheelDiv").style.display = "none";
36113611
};
36123612

3613-
document.body.addEventListener("click", event => {
3613+
// Named function for proper cleanup
3614+
const hideContextWheelOnClick = event => {
36143615
const wheelElement = document.getElementById("contextWheelDiv");
36153616
const displayStyle = window.getComputedStyle(wheelElement).display;
36163617
if (displayStyle === "block") {
36173618
wheelElement.style.display = "none";
3619+
// Remove listener after hiding to prevent memory leak
3620+
document.body.removeEventListener("click", hideContextWheelOnClick);
36183621
}
3619-
});
3622+
};
3623+
3624+
// Remove any existing listener before adding a new one
3625+
document.body.removeEventListener("click", hideContextWheelOnClick);
3626+
document.body.addEventListener("click", hideContextWheelOnClick);
36203627

36213628
if (
36223629
["customsample", "temperament1", "definemode", "show", "turtleshell", "action"].includes(

0 commit comments

Comments
 (0)