@@ -389,7 +389,9 @@ describe("PDF viewer", () => {
389389 pages = await loadAndWait (
390390 "issue18694.pdf" ,
391391 ".textLayer .endOfContent" ,
392- "page-width"
392+ "page-width" ,
393+ null ,
394+ { capCanvasAreaFactor : - 1 }
393395 ) ;
394396 } ) ;
395397
@@ -459,7 +461,12 @@ describe("PDF viewer", () => {
459461 describe ( "Detail view on zoom" , ( ) => {
460462 const BASE_MAX_CANVAS_PIXELS = 1e6 ;
461463
462- function setupPages ( zoom , devicePixelRatio , setups = { } ) {
464+ function setupPages (
465+ zoom ,
466+ devicePixelRatio ,
467+ capCanvasAreaFactor ,
468+ setups = { }
469+ ) {
463470 let pages ;
464471
465472 beforeEach ( async ( ) => {
@@ -476,7 +483,10 @@ describe("PDF viewer", () => {
476483 }` ,
477484 ...setups ,
478485 } ,
479- { maxCanvasPixels : BASE_MAX_CANVAS_PIXELS * devicePixelRatio ** 2 } ,
486+ {
487+ maxCanvasPixels : BASE_MAX_CANVAS_PIXELS * devicePixelRatio ** 2 ,
488+ capCanvasAreaFactor,
489+ } ,
480490 { height : 600 , width : 800 , devicePixelRatio }
481491 ) ;
482492 } ) ;
@@ -503,6 +513,8 @@ describe("PDF viewer", () => {
503513 const bottomRight = ctx . getImageData ( width - 3 , height - 3 , 1 , 1 ) . data ;
504514 return {
505515 size : width * height ,
516+ width,
517+ height,
506518 topLeft : globalThis . pdfjsLib . Util . makeHexColor ( ...topLeft ) ,
507519 bottomRight : globalThis . pdfjsLib . Util . makeHexColor ( ...bottomRight ) ,
508520 } ;
@@ -528,7 +540,7 @@ describe("PDF viewer", () => {
528540 for ( const pixelRatio of [ 1 , 2 ] ) {
529541 describe ( `with pixel ratio ${ pixelRatio } ` , ( ) => {
530542 describe ( "setupPages()" , ( ) => {
531- const forEachPage = setupPages ( "100%" , pixelRatio ) ;
543+ const forEachPage = setupPages ( "100%" , pixelRatio , - 1 ) ;
532544
533545 it ( "sets the proper devicePixelRatio" , async ( ) => {
534546 await forEachPage ( async ( browserName , page ) => {
@@ -543,8 +555,63 @@ describe("PDF viewer", () => {
543555 } ) ;
544556 } ) ;
545557
558+ describe ( "when zooming with a cap on the canvas dimensions" , ( ) => {
559+ const forEachPage = setupPages ( "10%" , pixelRatio , 0 ) ;
560+
561+ it ( "must render the detail view" , async ( ) => {
562+ await forEachPage ( async ( browserName , page ) => {
563+ await page . waitForSelector (
564+ ".page[data-page-number='1'] .textLayer"
565+ ) ;
566+
567+ const before = await page . evaluate ( extractCanvases , 1 ) ;
568+ expect ( before . length )
569+ . withContext ( `In ${ browserName } , before` )
570+ . toBe ( 1 ) ;
571+
572+ const factor = 50 ;
573+ const handle = await waitForDetailRendered ( page ) ;
574+ await page . evaluate ( scaleFactor => {
575+ window . PDFViewerApplication . pdfViewer . updateScale ( {
576+ drawingDelay : 0 ,
577+ scaleFactor,
578+ } ) ;
579+ } , factor ) ;
580+ await awaitPromise ( handle ) ;
581+
582+ const after = await page . evaluate ( extractCanvases , 1 ) ;
583+ // The page dimensions are 595x841, so the base canvas is a scale
584+ // version of that but the number of pixels is capped to
585+ // 800x600 = 480000.
586+ expect ( after . length )
587+ . withContext ( `In ${ browserName } , after` )
588+ . toBe ( 2 ) ;
589+ expect ( after [ 0 ] . width )
590+ . withContext ( `In ${ browserName } ` )
591+ . toBe ( 582 * pixelRatio ) ;
592+ expect ( after [ 0 ] . height )
593+ . withContext ( `In ${ browserName } ` )
594+ . toBe ( 823 * pixelRatio ) ;
595+
596+ // The dimensions of the detail canvas are capped to 800x600 but
597+ // it depends on the visible area which depends itself of the
598+ // scrollbars dimensions, hence we just check that the canvas
599+ // dimensions are capped.
600+ expect ( after [ 1 ] . width )
601+ . withContext ( `In ${ browserName } ` )
602+ . toBeLessThan ( 810 * pixelRatio ) ;
603+ expect ( after [ 1 ] . height )
604+ . withContext ( `In ${ browserName } ` )
605+ . toBeLessThan ( 575 * pixelRatio ) ;
606+ expect ( after [ 1 ] . size )
607+ . withContext ( `In ${ browserName } ` )
608+ . toBeLessThan ( 800 * 600 * pixelRatio ** 2 ) ;
609+ } ) ;
610+ } ) ;
611+ } ) ;
612+
546613 describe ( "when zooming in past max canvas size" , ( ) => {
547- const forEachPage = setupPages ( "100%" , pixelRatio ) ;
614+ const forEachPage = setupPages ( "100%" , pixelRatio , - 1 ) ;
548615
549616 it ( "must render the detail view" , async ( ) => {
550617 await forEachPage ( async ( browserName , page ) => {
@@ -616,7 +683,7 @@ describe("PDF viewer", () => {
616683 } ) ;
617684
618685 describe ( "when starting already zoomed in past max canvas size" , ( ) => {
619- const forEachPage = setupPages ( "300%" , pixelRatio ) ;
686+ const forEachPage = setupPages ( "300%" , pixelRatio , - 1 ) ;
620687
621688 it ( "must render the detail view" , async ( ) => {
622689 await forEachPage ( async ( browserName , page ) => {
@@ -654,7 +721,7 @@ describe("PDF viewer", () => {
654721 } ) ;
655722
656723 describe ( "when scrolling" , ( ) => {
657- const forEachPage = setupPages ( "300%" , pixelRatio ) ;
724+ const forEachPage = setupPages ( "300%" , pixelRatio , - 1 ) ;
658725
659726 it ( "must update the detail view" , async ( ) => {
660727 await forEachPage ( async ( browserName , page ) => {
@@ -689,7 +756,7 @@ describe("PDF viewer", () => {
689756 } ) ;
690757
691758 describe ( "when scrolling little enough that the existing detail covers the new viewport" , ( ) => {
692- const forEachPage = setupPages ( "300%" , pixelRatio ) ;
759+ const forEachPage = setupPages ( "300%" , pixelRatio , - 1 ) ;
693760
694761 it ( "must not re-create the detail canvas" , async ( ) => {
695762 await forEachPage ( async ( browserName , page ) => {
@@ -732,7 +799,7 @@ describe("PDF viewer", () => {
732799 } ) ;
733800
734801 describe ( "when scrolling to have two visible pages" , ( ) => {
735- const forEachPage = setupPages ( "300%" , pixelRatio ) ;
802+ const forEachPage = setupPages ( "300%" , pixelRatio , - 1 ) ;
736803
737804 it ( "must update the detail view" , async ( ) => {
738805 await forEachPage ( async ( browserName , page ) => {
@@ -805,7 +872,7 @@ describe("PDF viewer", () => {
805872 } ) ;
806873
807874 describe ( "pagerendered event" , ( ) => {
808- const forEachPage = setupPages ( "100%" , pixelRatio , {
875+ const forEachPage = setupPages ( "100%" , pixelRatio , - 1 , {
809876 eventBusSetup : eventBus => {
810877 globalThis . __pageRenderedEvents = [ ] ;
811878
@@ -966,7 +1033,7 @@ describe("PDF viewer", () => {
9661033 }
9671034
9681035 describe ( "when immediately cancelled and re-rendered" , ( ) => {
969- const forEachPage = setupPages ( "100%" , 1 , {
1036+ const forEachPage = setupPages ( "100%" , 1 , - 1 , {
9701037 eventBusSetup : eventBus => {
9711038 globalThis . __pageRenderedEvents = [ ] ;
9721039 eventBus . on ( "pagerendered" , ( { pageNumber, isDetailView } ) => {
@@ -1031,7 +1098,7 @@ describe("PDF viewer", () => {
10311098 } ) ;
10321099
10331100 describe ( "when cancelled and re-rendered after 1 microtick" , ( ) => {
1034- const forEachPage = setupPages ( "100%" , 1 , {
1101+ const forEachPage = setupPages ( "100%" , 1 , - 1 , {
10351102 eventBusSetup : eventBus => {
10361103 globalThis . __pageRenderedEvents = [ ] ;
10371104 eventBus . on ( "pagerendered" , ( { pageNumber, isDetailView } ) => {
0 commit comments