diff --git a/web/app.js b/web/app.js index 891b2aa21..d55ce59c9 100644 --- a/web/app.js +++ b/web/app.js @@ -2111,16 +2111,15 @@ const PDFViewerApplication = { * @ignore */ async testingClose() { - this.l10n?.pause(); - this.findBar?.close(); - this.unbindEvents(); this.unbindWindowEvents(); this._globalAbortController?.abort(); this._globalAbortController = null; - await this.close(); + this.findBar?.close(); + + await Promise.all([this.l10n?.destroy(), this.close()]); }, _accumulateTicks(ticks, prop) { diff --git a/web/l10n.js b/web/l10n.js index 7909e43ca..28d68b8e3 100644 --- a/web/l10n.js +++ b/web/l10n.js @@ -23,6 +23,8 @@ class L10n { #dir; + #elements = new Set(); + #lang; #l10n; @@ -69,6 +71,7 @@ class L10n { /** @inheritdoc */ async translate(element) { + this.#elements.add(element); try { this.#l10n.connectRoot(element); await this.#l10n.translateRoots(); @@ -77,6 +80,22 @@ class L10n { } } + /** @inheritdoc */ + async destroy() { + for (const element of this.#elements) { + this.#l10n.disconnectRoot(element); + } + this.#elements.clear(); + this.#l10n.pauseObserving(); + + // Since `disconnectRoot`/`pauseObserving` can still trigger asynchronous + // operations, without any way to actually cancel them, attempt to + // workaround timing issues when closing the integration-tests. + await new Promise(resolve => { + window.requestAnimationFrame(resolve); + }); + } + /** @inheritdoc */ pause() { this.#l10n.pauseObserving();