diff --git a/src/components/views/messages/MAudioBody.js b/src/components/views/messages/MAudioBody.js index 1e9962846c..efc6c4a069 100644 --- a/src/components/views/messages/MAudioBody.js +++ b/src/components/views/messages/MAudioBody.js @@ -69,6 +69,12 @@ export default class MAudioBody extends React.Component { } } + componentWillUnmount() { + if (this.state.decryptedUrl) { + URL.revokeObjectURL(this.state.decryptedUrl); + } + } + render() { const content = this.props.mxEvent.getContent(); diff --git a/src/components/views/messages/MImageBody.js b/src/components/views/messages/MImageBody.js index bb36e9b1ef..c22832467e 100644 --- a/src/components/views/messages/MImageBody.js +++ b/src/components/views/messages/MImageBody.js @@ -71,6 +71,7 @@ export default class extends React.Component { this.context.matrixClient.on('sync', this.onClientSync); } + // FIXME: factor this out and aplpy it to MVideoBody and MAudioBody too! onClientSync(syncState, prevState) { if (this.unmounted) return; // Consider the client reconnected if there is no error with syncing. @@ -206,6 +207,13 @@ export default class extends React.Component { dis.unregister(this.dispatcherRef); this.context.matrixClient.removeListener('sync', this.onClientSync); this._afterComponentWillUnmount(); + + if (this.state.decryptedUrl) { + URL.revokeObjectURL(this.state.decryptedUrl); + } + if (this.state.decryptedThumbnailUrl) { + URL.revokeObjectURL(this.state.decryptedThumbnailUrl); + } } // To be overridden by subclasses (e.g. MStickerBody) for further diff --git a/src/components/views/messages/MVideoBody.js b/src/components/views/messages/MVideoBody.js index 345c3f02e2..5365daee03 100644 --- a/src/components/views/messages/MVideoBody.js +++ b/src/components/views/messages/MVideoBody.js @@ -120,6 +120,15 @@ module.exports = React.createClass({ } }, + componentWillUnmount: function() { + if (this.state.decryptedUrl) { + URL.revokeObjectURL(this.state.decryptedUrl); + } + if (this.state.decryptedThumbnailUrl) { + URL.revokeObjectURL(this.state.decryptedThumbnailUrl); + } + }, + render: function() { const content = this.props.mxEvent.getContent();