Convert {BaseViewer, PDFThumbnailViewer}._pagesRequests from an Array to a WeakMap
				
					
				
			Obviously the `_pagesRequests` functionality is *mainly* used when `disableAutoFetch` is set, but it will also be used during ranged/streamed loading of documents. However, the `_pagesRequests` property is currently an Array which seems a bit strange: - Arrays are zero-indexed, but the first element will never actually be set in the code. - The `_pagesRequests` Array is never cleared, unless a new document is loaded, and once the `PDFDocumentProxy.getPage` call has resolved/rejected the element is just replaced by `null`. - Unless the document is browsed *in order* the resulting `_pagesRequests` Array can also be arbitrarily sparse. All in all, I don't believe that an Array is an appropriate data structure to use for this purpose.
This commit is contained in:
		
							parent
							
								
									ef1cd11908
								
							
						
					
					
						commit
						0f73758222
					
				| @ -533,7 +533,7 @@ class BaseViewer { | |||||||
|     this._buffer = new PDFPageViewBuffer(DEFAULT_CACHE_SIZE); |     this._buffer = new PDFPageViewBuffer(DEFAULT_CACHE_SIZE); | ||||||
|     this._location = null; |     this._location = null; | ||||||
|     this._pagesRotation = 0; |     this._pagesRotation = 0; | ||||||
|     this._pagesRequests = []; |     this._pagesRequests = new WeakMap(); | ||||||
|     this._pageViewsReady = false; |     this._pageViewsReady = false; | ||||||
|     this._scrollMode = ScrollMode.VERTICAL; |     this._scrollMode = ScrollMode.VERTICAL; | ||||||
|     this._spreadMode = SpreadMode.NONE; |     this._spreadMode = SpreadMode.NONE; | ||||||
| @ -961,22 +961,21 @@ class BaseViewer { | |||||||
|     if (pageView.pdfPage) { |     if (pageView.pdfPage) { | ||||||
|       return Promise.resolve(pageView.pdfPage); |       return Promise.resolve(pageView.pdfPage); | ||||||
|     } |     } | ||||||
|     let pageNumber = pageView.id; |     if (this._pagesRequests.has(pageView)) { | ||||||
|     if (this._pagesRequests[pageNumber]) { |       return this._pagesRequests.get(pageView); | ||||||
|       return this._pagesRequests[pageNumber]; |  | ||||||
|     } |     } | ||||||
|     let promise = this.pdfDocument.getPage(pageNumber).then((pdfPage) => { |     const promise = this.pdfDocument.getPage(pageView.id).then((pdfPage) => { | ||||||
|       if (!pageView.pdfPage) { |       if (!pageView.pdfPage) { | ||||||
|         pageView.setPdfPage(pdfPage); |         pageView.setPdfPage(pdfPage); | ||||||
|       } |       } | ||||||
|       this._pagesRequests[pageNumber] = null; |       this._pagesRequests.delete(pageView); | ||||||
|       return pdfPage; |       return pdfPage; | ||||||
|     }).catch((reason) => { |     }).catch((reason) => { | ||||||
|       console.error('Unable to get page for page view', reason); |       console.error('Unable to get page for page view', reason); | ||||||
|       // Page error -- there is nothing can be done.
 |       // Page error -- there is nothing that can be done.
 | ||||||
|       this._pagesRequests[pageNumber] = null; |       this._pagesRequests.delete(pageView); | ||||||
|     }); |     }); | ||||||
|     this._pagesRequests[pageNumber] = promise; |     this._pagesRequests.set(pageView, promise); | ||||||
|     return promise; |     return promise; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -147,7 +147,7 @@ class PDFThumbnailViewer { | |||||||
|     this._currentPageNumber = 1; |     this._currentPageNumber = 1; | ||||||
|     this._pageLabels = null; |     this._pageLabels = null; | ||||||
|     this._pagesRotation = 0; |     this._pagesRotation = 0; | ||||||
|     this._pagesRequests = []; |     this._pagesRequests = new WeakMap(); | ||||||
| 
 | 
 | ||||||
|     // Remove the thumbnails from the DOM.
 |     // Remove the thumbnails from the DOM.
 | ||||||
|     this.container.textContent = ''; |     this.container.textContent = ''; | ||||||
| @ -231,20 +231,19 @@ class PDFThumbnailViewer { | |||||||
|     if (thumbView.pdfPage) { |     if (thumbView.pdfPage) { | ||||||
|       return Promise.resolve(thumbView.pdfPage); |       return Promise.resolve(thumbView.pdfPage); | ||||||
|     } |     } | ||||||
|     let pageNumber = thumbView.id; |     if (this._pagesRequests.has(thumbView)) { | ||||||
|     if (this._pagesRequests[pageNumber]) { |       return this._pagesRequests.get(thumbView); | ||||||
|       return this._pagesRequests[pageNumber]; |  | ||||||
|     } |     } | ||||||
|     let promise = this.pdfDocument.getPage(pageNumber).then((pdfPage) => { |     const promise = this.pdfDocument.getPage(thumbView.id).then((pdfPage) => { | ||||||
|       thumbView.setPdfPage(pdfPage); |       thumbView.setPdfPage(pdfPage); | ||||||
|       this._pagesRequests[pageNumber] = null; |       this._pagesRequests.delete(thumbView); | ||||||
|       return pdfPage; |       return pdfPage; | ||||||
|     }).catch((reason) => { |     }).catch((reason) => { | ||||||
|       console.error('Unable to get page for thumb view', reason); |       console.error('Unable to get page for thumb view', reason); | ||||||
|       // Page error -- there is nothing can be done.
 |       // Page error -- there is nothing that can be done.
 | ||||||
|       this._pagesRequests[pageNumber] = null; |       this._pagesRequests.delete(thumbView); | ||||||
|     }); |     }); | ||||||
|     this._pagesRequests[pageNumber] = promise; |     this._pagesRequests.set(thumbView, promise); | ||||||
|     return promise; |     return promise; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user