DmitryBaranovskiy / raphael

JavaScript Vector Library
https://dmitrybaranovskiy.github.io/raphael/
MIT License
11.27k stars 1.67k forks source link

Fix memory leak in `Element.removeData()` #1077

Closed jvilk closed 5 years ago

jvilk commented 7 years ago

Prior to this change, Element.removeData() replaces an element's data with an empty object. This behavior results in a slow memory leak for applications that do not re-use IDs, as Raphael continues to add new keys and objects to eldata over time.

This memory leak turns out to be a problem for Piwik, which uses kartographer.js (which uses raphael) to draw an SVG image of the United States in its dashboard (see demo).

Every time the dashboard is redrawn, it spawns ~700 new Elements with data. I've submitted a pull request that appropriately cleans up this data when the user navigates away from the page using removeData, but Raphael leaves an empty object in the eldata map keyed on the element's old ID. Since kartographer/Piwik does not reuse IDs, eldata grows continually on each redraw until the application is out of memory.