Attempt to respect the "zoom" hash parameter, even when the "nameddest" parameter is present (issue 11875)
Given that the `PDFLinkService.setHash` method itself if completely synchronous, moving the handling of "nameddest" to occur last *shouldn't* cause any problems (famous last words). This way the destination will still override any previous parameter, such as e.g. the "page", as expected. Furthermore, given that the `PDFLinkService.navigateTo` method is asynchronous that should provide additional guarantees that the "nameddest" parameter is always respected. As sort-of expected, this fairly innocent looking change also required some tweaks in the `PDFHistory` to prevent dummy history entires upon document load (only an issue when both "page" *and* "nameddest" parameters are provided in the hash).
This commit is contained in:
		
							parent
							
								
									491904d30a
								
							
						
					
					
						commit
						af1bb04662
					
				| @ -117,7 +117,9 @@ class PDFHistory { | ||||
|     this._position = null; | ||||
| 
 | ||||
|     if (!this._isValidState(state, /* checkReload = */ true) || resetHistory) { | ||||
|       const { hash, page, rotation } = this._parseCurrentHash(); | ||||
|       const { hash, page, rotation } = this._parseCurrentHash( | ||||
|         /* checkNameddest = */ true | ||||
|       ); | ||||
| 
 | ||||
|       if (!hash || reInitialized || resetHistory) { | ||||
|         // Ensure that the browser history is reset on PDF document load.
 | ||||
| @ -490,16 +492,20 @@ class PDFHistory { | ||||
|   /** | ||||
|    * @private | ||||
|    */ | ||||
|   _parseCurrentHash() { | ||||
|   _parseCurrentHash(checkNameddest = false) { | ||||
|     const hash = unescape(getCurrentHash()).substring(1); | ||||
|     let page = parseQueryString(hash).page | 0; | ||||
|     const params = parseQueryString(hash); | ||||
| 
 | ||||
|     const nameddest = params.nameddest || ""; | ||||
|     let page = params.page | 0; | ||||
| 
 | ||||
|     if ( | ||||
|       !( | ||||
|         Number.isInteger(page) && | ||||
|         page > 0 && | ||||
|         page <= this.linkService.pagesCount | ||||
|       ) | ||||
|       ) || | ||||
|       (checkNameddest && nameddest.length > 0) | ||||
|     ) { | ||||
|       page = null; | ||||
|     } | ||||
|  | ||||
| @ -233,10 +233,6 @@ class PDFLinkService { | ||||
|         }); | ||||
|       } | ||||
|       // borrowing syntax from "Parameters for Opening PDF Files"
 | ||||
|       if ("nameddest" in params) { | ||||
|         this.navigateTo(params.nameddest); | ||||
|         return; | ||||
|       } | ||||
|       if ("page" in params) { | ||||
|         pageNumber = params.page | 0 || 1; | ||||
|       } | ||||
| @ -308,6 +304,11 @@ class PDFLinkService { | ||||
|           mode: params.pagemode, | ||||
|         }); | ||||
|       } | ||||
|       // Ensure that this parameter is *always* handled last, in order to
 | ||||
|       // guarantee that it won't be overridden (e.g. by the "page" parameter).
 | ||||
|       if ("nameddest" in params) { | ||||
|         this.navigateTo(params.nameddest); | ||||
|       } | ||||
|     } else { | ||||
|       // Named (or explicit) destination.
 | ||||
|       dest = unescape(hash); | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user