@@ -19,7 +19,10 @@ import {
1919 createPromise ,
2020 getSpanRectFromText ,
2121 loadAndWait ,
22+ scrollIntoView ,
23+ waitForPageRendered ,
2224} from "./test_utils.mjs" ;
25+ import { PNG } from "pngjs" ;
2326
2427describe ( "PDF viewer" , ( ) => {
2528 describe ( "Zoom origin" , ( ) => {
@@ -365,4 +368,75 @@ describe("PDF viewer", () => {
365368 } ) ;
366369 } ) ;
367370 } ) ;
371+
372+ describe ( "Canvas fits the page" , ( ) => {
373+ let pages ;
374+
375+ beforeAll ( async ( ) => {
376+ pages = await loadAndWait (
377+ "issue18694.pdf" ,
378+ ".textLayer .endOfContent" ,
379+ "page-width"
380+ ) ;
381+ } ) ;
382+
383+ afterAll ( async ( ) => {
384+ await closePages ( pages ) ;
385+ } ) ;
386+
387+ it ( "must check that canvas perfectly fits the page whatever the zoom level is" , async ( ) => {
388+ await Promise . all (
389+ pages . map ( async ( [ browserName , page ] ) => {
390+ const debug = false ;
391+
392+ // The pdf has a single page with a red background.
393+ // We set the viewer background to red, because when screenshoting
394+ // some part of the viewer background can be visible.
395+ // But here we don't care about the viewer background: we only
396+ // care about the page background and the canvas default color.
397+
398+ await page . evaluate ( ( ) => {
399+ document . body . style . background = "#ff0000" ;
400+ const toolbar = document . querySelector ( ".toolbar" ) ;
401+ toolbar . style . display = "none" ;
402+ } ) ;
403+ await page . waitForSelector ( ".toolbar" , { visible : false } ) ;
404+ await page . evaluate ( ( ) => {
405+ const p = document . querySelector ( `.page[data-page-number="1"]` ) ;
406+ p . style . border = "none" ;
407+ } ) ;
408+
409+ for ( let i = 0 ; ; i ++ ) {
410+ const handle = await waitForPageRendered ( page ) ;
411+ await page . evaluate ( ( ) => window . PDFViewerApplication . zoomOut ( ) ) ;
412+ await awaitPromise ( handle ) ;
413+ await scrollIntoView ( page , `.page[data-page-number="1"]` ) ;
414+
415+ const element = await page . $ ( `.page[data-page-number="1"]` ) ;
416+ const png = await element . screenshot ( {
417+ type : "png" ,
418+ path : debug ? `foo${ i } .png` : "" ,
419+ } ) ;
420+ const pageImage = PNG . sync . read ( Buffer . from ( png ) ) ;
421+ let buffer = new Uint32Array ( pageImage . data . buffer ) ;
422+
423+ // Search for the first red pixel.
424+ const j = buffer . indexOf ( 0xff0000ff ) ;
425+ buffer = buffer . slice ( j ) ;
426+
427+ expect ( buffer . every ( x => x === 0xff0000ff ) )
428+ . withContext ( `In ${ browserName } , in the ${ i } th zoom in` )
429+ . toBe ( true ) ;
430+
431+ const currentScale = await page . evaluate (
432+ ( ) => window . PDFViewerApplication . pdfViewer . currentScale
433+ ) ;
434+ if ( currentScale <= 0.1 ) {
435+ break ;
436+ }
437+ }
438+ } )
439+ ) ;
440+ } ) ;
441+ } ) ;
368442} ) ;
0 commit comments