diff --git a/src/vector/platform/VectorBasePlatform.js b/src/vector/platform/VectorBasePlatform.js index cfdeeacbe..c10c0accd 100644 --- a/src/vector/platform/VectorBasePlatform.js +++ b/src/vector/platform/VectorBasePlatform.js @@ -39,14 +39,7 @@ export default class VectorBasePlatform extends BasePlatform { constructor() { super(); - // The 'animations' are really low framerate and look terrible. - // Also it re-starts the animation every time you set the badge, - // and we set the state each time, even if the value hasn't changed, - // so we'd need to fix that if enabling the animation. - this.favicon = new Favico({animation: 'none'}); this.showUpdateCheck = false; - this._updateFavicon(); - this.startUpdateCheck = this.startUpdateCheck.bind(this); this.stopUpdateCheck = this.stopUpdateCheck.bind(this); } @@ -55,6 +48,24 @@ export default class VectorBasePlatform extends BasePlatform { return 'Vector Base Platform'; // no translation required: only used for analytics } + /** + * Delay creating the `Favico` instance until first use (on the first notification) as + * it uses canvas, which can trigger a permission prompt in Firefox's resist + * fingerprinting mode. + * See https://github.com/vector-im/riot-web/issues/9605. + */ + get favicon() { + if (this._favicon) { + return this._favicon; + } + // The 'animations' are really low framerate and look terrible. + // Also it re-starts the animation every time you set the badge, + // and we set the state each time, even if the value hasn't changed, + // so we'd need to fix that if enabling the animation. + this._favicon = new Favico({ animation: 'none' }); + return this._favicon; + } + _updateFavicon() { try { // This needs to be in in a try block as it will throw