Skip to content

Commit 1e40612

Browse files
Ruhao Gaomarcj
authored andcommitted
cancelAnimationFrame for reset when detach is called (#282)
In ResizeSensor, we use requestAnimationFrame for reset. However, if an element is added to DOM and removed from DOM very quickly (even before the first reset happens), the reset itself will stuck in an infinite loop. It also causes memory leak because the reset function holds the element forever.
1 parent 4b06648 commit 1e40612

File tree

1 file changed

+9
-2
lines changed

1 file changed

+9
-2
lines changed

src/ResizeSensor.js

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,8 @@
102102
* @constructor
103103
*/
104104
var ResizeSensor = function(element, callback) {
105+
var lastAnimationFrame = 0;
106+
105107
/**
106108
*
107109
* @constructor
@@ -204,7 +206,7 @@
204206
var lastWidth = 0;
205207
var lastHeight = 0;
206208
var initialHiddenCheck = true;
207-
var lastAnimationFrame = 0;
209+
lastAnimationFrame = 0;
208210

209211
var resetExpandShrink = function () {
210212
var width = element.offsetWidth;
@@ -281,14 +283,19 @@
281283
addEvent(shrink, 'scroll', onScroll);
282284

283285
// Fix for custom Elements
284-
requestAnimationFrame(reset);
286+
lastAnimationFrame = requestAnimationFrame(reset);
285287
}
286288

287289
forEachElement(element, function(elem){
288290
attachResizeEvent(elem, callback);
289291
});
290292

291293
this.detach = function(ev) {
294+
// clean up the unfinished animation frame to prevent a potential endless requestAnimationFrame of reset
295+
if (!lastAnimationFrame) {
296+
window.cancelAnimationFrame(lastAnimationFrame);
297+
lastAnimationFrame = 0;
298+
}
292299
ResizeSensor.detach(element, ev);
293300
};
294301

0 commit comments

Comments
 (0)