diff --git a/src/display/annotation_storage.js b/src/display/annotation_storage.js index 02e327076584f..27a092f338adf 100644 --- a/src/display/annotation_storage.js +++ b/src/display/annotation_storage.js @@ -68,12 +68,21 @@ class AnnotationStorage { * Remove a value from the storage. * @param {string} key */ - removeKey(key) { + remove(key) { this._storage.delete(key); if (this._storage.size === 0) { this.resetModified(); } + + if (typeof this.onAnnotationEditor === "function") { + for (const value of this._storage.values()) { + if (value instanceof AnnotationEditor) { + return; + } + } + this.onAnnotationEditor(null); + } } /** @@ -172,15 +181,6 @@ class AnnotationStorage { return clone; } - get hasAnnotationEditors() { - for (const value of this._storage.values()) { - if (value instanceof AnnotationEditor) { - return true; - } - } - return false; - } - /** * PLEASE NOTE: Only intended for usage within the API itself. * @ignore diff --git a/src/display/editor/annotation_editor_layer.js b/src/display/editor/annotation_editor_layer.js index a2f6f64373ed8..97115cd782617 100644 --- a/src/display/editor/annotation_editor_layer.js +++ b/src/display/editor/annotation_editor_layer.js @@ -207,7 +207,7 @@ class AnnotationEditorLayer { this.#uiManager.removeEditor(editor); this.detach(editor); - this.annotationStorage.removeKey(editor.id); + this.annotationStorage.remove(editor.id); editor.div.style.display = "none"; setTimeout(() => { // When the div is removed from DOM the focus can move on the diff --git a/web/app.js b/web/app.js index 8915749dddaef..986caeed192a1 100644 --- a/web/app.js +++ b/web/app.js @@ -262,6 +262,8 @@ const PDFViewerApplication = { _wheelUnusedTicks: 0, _idleCallbacks: new Set(), _PDFBug: null, + _hasAnnotationEditors: false, + _title: document.title, _printAnnotationStoragePromise: null, // Called once when the document is loaded. @@ -788,12 +790,14 @@ const PDFViewerApplication = { this.setTitle(title); }, - setTitle(title) { + setTitle(title = this._title) { + this._title = title; + if (this.isViewerEmbedded) { // Embedded PDF viewers should not be changing their parent page's title. return; } - document.title = title; + document.title = `${this._hasAnnotationEditors ? "* " : ""}${title}`; }, get _docFilename() { @@ -880,10 +884,12 @@ const PDFViewerApplication = { this._contentLength = null; this._saveInProgress = false; this._docStats = null; + this._hasAnnotationEditors = false; this._cancelIdleCallbacks(); promises.push(this.pdfScriptingManager.destroyPromise); + this.setTitle(); this.pdfSidebar.reset(); this.pdfOutlineViewer.reset(); this.pdfAttachmentViewer.reset(); @@ -1045,12 +1051,10 @@ const PDFViewerApplication = { this._saveInProgress = false; } - if (this.pdfDocument?.annotationStorage.hasAnnotationEditors) { + if (this._hasAnnotationEditors) { this.externalServices.reportTelemetry({ type: "editing", - data: { - type: "save", - }, + data: { type: "save" }, }); } }, @@ -1582,7 +1586,7 @@ const PDFViewerApplication = { } if (pdfTitle) { this.setTitle( - `${pdfTitle} - ${this._contentDispositionFilename || document.title}` + `${pdfTitle} - ${this._contentDispositionFilename || this._title}` ); } else if (this._contentDispositionFilename) { this.setTitle(this._contentDispositionFilename); @@ -1744,10 +1748,15 @@ const PDFViewerApplication = { } }; annotationStorage.onAnnotationEditor = typeStr => { - this.externalServices.reportTelemetry({ - type: "editing", - data: { type: typeStr }, - }); + this._hasAnnotationEditors = !!typeStr; + this.setTitle(); + + if (typeStr) { + this.externalServices.reportTelemetry({ + type: "editing", + data: { type: typeStr }, + }); + } }; }, @@ -1888,12 +1897,10 @@ const PDFViewerApplication = { type: "print", }); - if (this.pdfDocument?.annotationStorage.hasAnnotationEditors) { + if (this._hasAnnotationEditors) { this.externalServices.reportTelemetry({ type: "editing", - data: { - type: "print", - }, + data: { type: "print" }, }); } },