Skip to content

Commit b7e73c2

Browse files
authored
Merge pull request #5754 from DhyaniKavya/fix/stop-icon-listener-leak
fix: Prevent stop icon listener accumulation in play debounce logic
2 parents 938a676 + bff5f55 commit b7e73c2

File tree

2 files changed

+17
-7
lines changed

2 files changed

+17
-7
lines changed

js/__tests__/toolbar.test.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,8 @@ describe("Toolbar Class", () => {
240240
},
241241
stop: {
242242
style: { color: "" },
243-
addEventListener: jest.fn()
243+
addEventListener: jest.fn(),
244+
removeEventListener: jest.fn()
244245
},
245246
record: {
246247
className: ""
@@ -267,6 +268,10 @@ describe("Toolbar Class", () => {
267268
expect(global.saveButtonAdvanced.disabled).toBe(true);
268269
expect(global.saveButton.className).toBe("grey-text inactiveLink");
269270
expect(elements.record.className).toBe("grey-text inactiveLink");
271+
expect(elements.stop.removeEventListener).toHaveBeenCalledWith(
272+
"click",
273+
expect.any(Function)
274+
);
270275
expect(elements.stop.addEventListener).toHaveBeenCalledWith("click", expect.any(Function));
271276

272277
const stopClickHandler = elements.stop.addEventListener.mock.calls[0][1];

js/toolbar.js

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -406,6 +406,14 @@ class Toolbar {
406406
}
407407
}
408408

409+
// Named handler to prevent memory leak from duplicate listeners
410+
const stopClickHandler = () => {
411+
clearTimeout(play_button_debounce_timeout);
412+
isPlayIconRunning = true;
413+
this.activity.hideMsgs();
414+
handleClick();
415+
};
416+
409417
var tempClick = (playIcon.onclick = () => {
410418
const hideMsgs = () => {
411419
this.activity.hideMsgs();
@@ -424,12 +432,9 @@ class Toolbar {
424432
handleClick();
425433
}, 2000);
426434

427-
stopIcon.addEventListener("click", function () {
428-
clearTimeout(play_button_debounce_timeout);
429-
isPlayIconRunning = true;
430-
hideMsgs();
431-
handleClick();
432-
});
435+
// Remove existing listener before adding to prevent accumulation
436+
stopIcon.removeEventListener("click", stopClickHandler);
437+
stopIcon.addEventListener("click", stopClickHandler);
433438
});
434439
}
435440

0 commit comments

Comments
 (0)