Merge pull request #12163 from Snuffleupagus/improve-PDFAttachmentViewer-render
Re-factor the dispatching of "attachmentsloaded" events, when the PDF document contains no "regular" attachments
This commit is contained in:
		
						commit
						85982c45dc
					
				| @ -55,10 +55,14 @@ class PDFAttachmentViewer { | ||||
|     this.container.textContent = ""; | ||||
| 
 | ||||
|     if (!keepRenderedCapability) { | ||||
|       // NOTE: The *only* situation in which the `_renderedCapability` should
 | ||||
|       //       not be replaced is when appending file attachment annotations.
 | ||||
|       // The only situation in which the `_renderedCapability` should *not* be
 | ||||
|       // replaced is when appending FileAttachment annotations.
 | ||||
|       this._renderedCapability = createPromiseCapability(); | ||||
|     } | ||||
|     if (this._pendingDispatchEvent) { | ||||
|       clearTimeout(this._pendingDispatchEvent); | ||||
|     } | ||||
|     this._pendingDispatchEvent = null; | ||||
|   } | ||||
| 
 | ||||
|   /** | ||||
| @ -67,6 +71,25 @@ class PDFAttachmentViewer { | ||||
|   _dispatchEvent(attachmentsCount) { | ||||
|     this._renderedCapability.resolve(); | ||||
| 
 | ||||
|     if (this._pendingDispatchEvent) { | ||||
|       clearTimeout(this._pendingDispatchEvent); | ||||
|       this._pendingDispatchEvent = null; | ||||
|     } | ||||
|     if (attachmentsCount === 0) { | ||||
|       // Delay the event when no "regular" attachments exist, to allow time for
 | ||||
|       // parsing of any FileAttachment annotations that may be present on the
 | ||||
|       // *initially* rendered page; this reduces the likelihood of temporarily
 | ||||
|       // disabling the attachmentsView when the `PDFSidebar` handles the event.
 | ||||
|       this._pendingDispatchEvent = setTimeout(() => { | ||||
|         this.eventBus.dispatch("attachmentsloaded", { | ||||
|           source: this, | ||||
|           attachmentsCount: 0, | ||||
|         }); | ||||
|         this._pendingDispatchEvent = null; | ||||
|       }); | ||||
|       return; | ||||
|     } | ||||
| 
 | ||||
|     this.eventBus.dispatch("attachmentsloaded", { | ||||
|       source: this, | ||||
|       attachmentsCount, | ||||
| @ -129,23 +152,22 @@ class PDFAttachmentViewer { | ||||
|    * @param {PDFAttachmentViewerRenderParameters} params | ||||
|    */ | ||||
|   render({ attachments, keepRenderedCapability = false }) { | ||||
|     let attachmentsCount = 0; | ||||
| 
 | ||||
|     if (this.attachments) { | ||||
|       this.reset(keepRenderedCapability === true); | ||||
|     } | ||||
|     this.attachments = attachments || null; | ||||
| 
 | ||||
|     if (!attachments) { | ||||
|       this._dispatchEvent(attachmentsCount); | ||||
|       this._dispatchEvent(/* attachmentsCount = */ 0); | ||||
|       return; | ||||
|     } | ||||
| 
 | ||||
|     const names = Object.keys(attachments).sort(function (a, b) { | ||||
|       return a.toLowerCase().localeCompare(b.toLowerCase()); | ||||
|     }); | ||||
|     attachmentsCount = names.length; | ||||
|     const attachmentsCount = names.length; | ||||
| 
 | ||||
|     const fragment = document.createDocumentFragment(); | ||||
|     for (let i = 0; i < attachmentsCount; i++) { | ||||
|       const item = attachments[names[i]]; | ||||
|       const filename = removeNullCharacters(getFilenameFromUrl(item.filename)); | ||||
| @ -164,8 +186,9 @@ class PDFAttachmentViewer { | ||||
|       } | ||||
| 
 | ||||
|       div.appendChild(button); | ||||
|       this.container.appendChild(div); | ||||
|       fragment.appendChild(div); | ||||
|     } | ||||
|     this.container.appendChild(fragment); | ||||
| 
 | ||||
|     this._dispatchEvent(attachmentsCount); | ||||
|   } | ||||
| @ -175,7 +198,12 @@ class PDFAttachmentViewer { | ||||
|    * @private | ||||
|    */ | ||||
|   _appendAttachment({ id, filename, content }) { | ||||
|     this._renderedCapability.promise.then(() => { | ||||
|     const renderedPromise = this._renderedCapability.promise; | ||||
| 
 | ||||
|     renderedPromise.then(() => { | ||||
|       if (renderedPromise !== this._renderedCapability.promise) { | ||||
|         return; // The FileAttachment annotation belongs to a previous document.
 | ||||
|       } | ||||
|       let attachments = this.attachments; | ||||
| 
 | ||||
|       if (!attachments) { | ||||
|  | ||||
| @ -445,32 +445,18 @@ class PDFSidebar { | ||||
|     }); | ||||
| 
 | ||||
|     this.eventBus._on("attachmentsloaded", evt => { | ||||
|       if (evt.attachmentsCount) { | ||||
|         this.attachmentsButton.disabled = false; | ||||
|       const attachmentsCount = evt.attachmentsCount; | ||||
| 
 | ||||
|       this.attachmentsButton.disabled = !attachmentsCount; | ||||
| 
 | ||||
|       if (attachmentsCount) { | ||||
|         this._showUINotification(SidebarView.ATTACHMENTS); | ||||
|         return; | ||||
|       } | ||||
| 
 | ||||
|       // Attempt to avoid temporarily disabling, and switching away from, the
 | ||||
|       // attachment view for documents that do not contain proper attachments
 | ||||
|       // but *only* FileAttachment annotations. Hence we defer those operations
 | ||||
|       // slightly to allow time for parsing any FileAttachment annotations that
 | ||||
|       // may be present on the *initially* rendered page of the document.
 | ||||
|       Promise.resolve().then(() => { | ||||
|         if (this.attachmentsView.hasChildNodes()) { | ||||
|           // FileAttachment annotations were appended to the attachment view.
 | ||||
|           return; | ||||
|         } | ||||
|         this.attachmentsButton.disabled = true; | ||||
| 
 | ||||
|         if (this.active === SidebarView.ATTACHMENTS) { | ||||
|           // If the attachment view was opened during document load, switch away
 | ||||
|       } else if (this.active === SidebarView.ATTACHMENTS) { | ||||
|         // If the attachments view was opened during document load, switch away
 | ||||
|         // from it if it turns out that the document has no attachments.
 | ||||
|         this.switchView(SidebarView.THUMBS); | ||||
|       } | ||||
|     }); | ||||
|     }); | ||||
| 
 | ||||
|     // Update the thumbnailViewer, if visible, when exiting presentation mode.
 | ||||
|     this.eventBus._on("presentationmodechanged", evt => { | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user